ターミナルを快適にすると色々捗ります

Git に限った話ではないですが、開発業務を行う上で CLI での作業は避けては通れません。 CLI 環境を適切に整備しておけば、色々捗ること間違いなしです。

ここでは、Mac 標準のターミナルを特にカスタマイズせずそのまま使っている、という方向けに、主に Git のコマンドを快適に使えるようにすることを目的に具体的な環境整備の手順を紹介してみたいと思います。

やること

  • ターミナルで使用するシェルを bash から zsh に変更する
  • .zshrc に色々と設定を書く
  • tmux を導入する
  • .tmux.conf をちょっとだけいじる
  • .gitconfig をカスタマイズする

これらによって、ざっと以下のようなことが出来るようになります。

  • Git のサブコマンドやブランチ名が補完できるようになる
  • g stgit status が見れるようになったりする
  • プロンプトが色付きで見やすくなり、Git のブランチ名が常に表示されるようになる
  • コマンドの補完とかが何かと賢くなる
  • ターミナルウィンドウの分割表示が出来るようになる
  • ターミナル上でコピー&ペーストが出来るようになる

1. zsh の導入

ログインシェルの変更

まずは、ターミナルのログインシェルを変更します。 最強との呼び声も高い zsh に切り替えます。

まずは、ログインシェルに zsh を指定できるかどうかを確認しましょう。

$ cat /etc/shells[Enter]
# List of acceptable shells for chpass(1).
# Ftpd will not allow users to connect who are not using
# one of these shells.

/bin/bash
/bin/csh
/bin/ksh
/bin/sh
/bin/tcsh
/bin/zsh

上記のように、シェルの一覧の中に zsh があれば問題ないです。以下のコマンドでログインシェルを変更します。※間違えないように慎重に打ってください。

$ chsh -s /bin/zsh

実行後、ターミナルを再起動すると、bash ではなく zsh が起動するはずです。ps コマンドなどで確認してみてください。

.zshrc によるカスタマイズ

ターミナルが zsh で起動するようになったので、今度は zsh の設定ファイルを書きましょう。 ここで色々やっておくと、zsh の補完機能が何かと賢くなったり、プロンプトが色付きで見やすくなったり、Git のブランチ名が常に表示されるようになったりします。

設定ファイルは ~/.zshrc です。 今回は .zshrc の設定の細かい内容は枝葉なので、私の設定ファイルをリンクしておきます。考えるのが面倒な方はそのまま使ってみてください。(余計な設定もいっぱい入ってると思いますが…)

.zshrc を変更したあとは、

$ source ~/.zshrc

として設定を再読み込みしてください。「なんか効いてない気がする?」みたいな時はターミナルごと再起動してみてください。

使ってみる

適当に Git リポジトリなディレクトリに移動してみてください。

こんな感じで、色付きのプロンプトで Git のブランチ名が表示されていると思います。

image

適当にいじってみて、コマンドの補完とかが bash に比べて色々賢いことを確認してみてください。Git のサブコマンドやブランチ名も補完されますよ。

2. tmux の導入

次に、zsh 上で tmux という ターミナルマルチプレクサ を入れてみましょう。 使いこなせば色々できる代物ですが、とりあえず今回は

  • ターミナルウィンドウの分割表示
  • ターミナル上でのコピー&ペースト

ぐらいを目的に導入したいと思います。

インストール

インストールは Homebrew で一発です。

$ brew install tmux

.tmux.conf によるカスタマイズ

tmux の設定は ~/.tmux.conf でカスタマイズできます。 ここでは、以下の 2 つの設定を行います。

  • デフォルトのキーバインドが使いにくいので適当に変更する
  • tmux 上のキー操作でコピーした内容を Mac のクリップボードにコピーできるようにする

例によって、私の設定ファイルをリンクしておきますので、参考にしてください。

ざっくり説明すると、

  • tmux コマンドを使うためのプレフィックスがデフォルトで C-b と使いにくい(ターミナルのカーソル移動と被ってる)ので、C-t に変更
  • 画面を縦に分割するコマンドが、プレフィックス+% と使いにくいので、プレフィックス+| に変更
  • 画面を横に分割するコマンドが、プレフィックス+" と使いにくいので、プレフィックス+- に変更
  • マウス操作でバッファをスクロールできるように設定
  • tmux コマンドでバッファにコピーした内容を C-q で Mac のクリップボードにコピーできるように設定

を行っています。(2014/02/10 現在)

最後のクリップボードの設定には、別途 reattach-to-user-namespace というパッケージが必要なので、Homebrew でインストールしておいてください。

brew install reattach-to-user-namespace

使ってみる

まず、ターミナルから tmux を起動します。

$ tmux

毎回これを打つのが面倒であれば、ターミナルの設定で、以下のようにシェル起動時に自動実行するようにしておくといいかもしれません。

image

画面を縦に分割

C-t |

画面を横に分割

C-t -

分割した画面(ペイン)を移動

C-t o または C-t カーソルキー

分割した画面を閉じる

普通に exit コマンド

コピー&ペースト

  1. C-t [ でコピーモードに入る
  2. C-Space で始点確定
  3. C-w で終点確定
  4. C-t ] で tmux 上でペースト

別のアプリにペーストしたい場合は

  1. 上記手順で tmux 上でコピー
  2. C-q で Mac のクリップボードにコピー
  3. 別のアプリで普通にペースト

設定が効いてない?

もし設定したとおりに動作しない場合、バックグラウンドで起動している tmux のセッションが設定を保持したままになっているせいだと思いますので、

$ tmux kill-server

で全てのセッションを終了させてみてください。

$ tmux ls[Enter]
failed to connect to server

セッションが全て終了されていることを確認して、改めて $ tmux すれば、設定がちゃんと反映されるはずです。

3. .gitconfig の設定

最後に、主に Git のサブコマンドを省略形で入力できるようにするために、~/.gitconfig をカスタマイズしておきましょう。

~/.gitconfig は、git config --global -l で見える設定情報の元データです。ファイルを直接編集してもよいですし、git config --global user.name "Takashi Kanemoto" みたいに Git コマンドから設定しても同じです。

私の設定ファイルはこんな感じ ですが、alias の部分は自分の使いやすいように色々設定しておけばいいと思います。

私の場合、.zshrcalias g="git" とかやっているので、

g stgit status が見れたり、g llgit log --oneline --decorate が見れたりして捗っています。

いくつか注意点を上げるとするなら、

  • user.email

user.email のメールアドレスが GitHub に登録している “Primary GitHub Email” と異なっていると、いくらコミットしても GitHub トップページの “Your Contributions” に反映されないという悲しい出来事が起こりますのでご注意を。

  • mergeto

私の .gitconfig では alias.mtmergeto というコマンドを設定していますが、git mergeto というコマンドはデフォルトでは存在しません。

Git には、パスの通った場所に git-hoge という名前でシェルスクリプトを置いておくと git hoge というコマンドとして使用できるようになる機能があり、mergeto は私が独自に作ったサブコマンドです。

ちなみに git-mergeto の中身はこんな感じ。

#!/bin/sh

BRANCH=`git symbolic-ref HEAD 2>/dev/null | cut -d/ -f3`
if [ $# -eq 0 ]; then
    TO='master'
else
    TO=$1
fi
git checkout $TO
git merge $BRANCH
git branch -d $BRANCH
  1. 指定したブランチに移動(指定がなければ master に移動)
  2. 今までいたブランチをマージ
  3. 今までいたブランチを削除

多分 git-flow 的にはよくやる作業だと思うので、使いたい方はご自由にどうぞ。