zshでのgitコマンドの入力補完を設定する方法はいくつかあるようですが、最近はgitのソースツリーにcontrib/completion/git-completion.zshというものが含まれているので、今回はそれを利用する手順を紹介します。
設定を行うと、以下のようにコマンドやリモートリポジトリ、ブランチ名の補完ができるようになります。
今回、動作を確認した環境は以下の通りです。
- Mac OS X 10.8.3
- zsh 5.0.2
- git 1.8.2.3
zshとgitをHomebrewでインストールしている場合は、zshの設定を行うだけで作業完了です。git 1.8.2.2に含まれる補完定義ファイルとgit 1.8.2.3に含まれるそれとでは結構違いがあるようなので(コミットログ)、gitはできるだけ最新版にアップデートしておきましょう。
Homebrewを使っていない場合は、補完定義ファイルをダウンロードしてからzshの設定を行う必要があります。
この記事ではそれぞれの場合での設定方法について紹介します。
補完定義ファイルの確認(Homebrewでインストールしている場合のみ)
Homebrewでzshとgit 1.8.2.2以降をインストールしている場合は、以下のように2つのgit用補完定義ファイルがインストールされているので、これを利用します。
$ ls -l `brew --prefix`/share/zsh/site-functions/
total 24
lrwxr-xr-x 1 juno staff 57 5 10 09:04 _git@ -> ../../../Cellar/git/1.8.2.3/share/zsh/site-functions/_git
lrwxr-xr-x 1 juno staff 72 5 10 09:04 git-completion.bash@ -> ../../../Cellar/git/1.8.2.3/share/zsh/site-functions/git-completion.bash
git 1.8.2.2以降をインストールしているのに上記の2つのファイルが存在しないときは、gitのインストール時にHomebrewがシンボリックリンクを作成するのに失敗しているかもしれません。
その場合は、以下のコマンドでリンクを再作成することができます。
$ brew link git
リンク作成中にエラーが発生するようであれば、強制的に既存のリンクを上書きして作成することもできます。
$ brew link --overwrite git
補完定義ファイルのダウンロード(Homebrewでインストールしていない場合のみ)
zshやgitをHomebrewでインストールしていない場合は、補完定義ファイルをダウンロードしてから設定を行います。
まず、zshの補完定義ファイルを置くためのディレクトリを用意します。既に同じ用途で使っているディレクトリがある場合はそこを使えばよいので、ディレクトリパスは適宜読み替えてください(ここでは~/.zsh/completion
を作成して使います)。
$ mkdir ~/.zsh/completion/
gitのソースツリーに含まれる以下の2つのファイルをダウンロードして、先ほどのディレクトリに配置します。
(※2014-05-05 それぞれのリンク先が入れ替わっているとコメントでご指摘していただいたので、修正しました)
$ cd ~/.zsh/completion/
$ curl -O https://raw.github.com/git/git/master/contrib/completion/git-completion.bash
$ curl -O https://raw.github.com/git/git/master/contrib/completion/git-completion.zsh
git-completion.zsh
はgit-completion.bash
に依存しているため、zshでのみ利用する場合でも両方のファイルが必要となります。また、デフォルトの状態では、2つのファイルが同じディレクトリにあることが想定されているので注意してください(配置場所を変える場合はgit-completion.zsh
のコメントを参照)。
次に、ダウンロードしたgit-completion.zsh
を_git
にリネームします。
$ mv git-completion.zsh _git
この時点で以下のようなファイル構成になっていれば準備完了です。
$ tree ~/.zsh/completion
/Users/juno/.zsh/completion
├── _git
└── git-completion.bash
0 directories, 2 files
設定の追加(いずれの場合も共通)
次に、~/.zshrc
に設定を追加して、補完定義ファイルが読み込まれるようにします。既に同様の設定が記述済みの場合は適宜調整してください。
Homebrewでインストールしている場合:
fpath=($(brew --prefix)/share/zsh/site-functions $fpath)
autoload -U compinit
compinit -u
Homebrewでインストールしていない場合:
fpath=(~/.zsh/completion $fpath)
autoload -U compinit
compinit -u
いずれの場合も、fpath
にパスを追加する前にcompinit
が呼ばれてしまうとうまく動作しないので注意します。
最後に、zcompdump
をリビルドします。
$ rm -f ~/.zcompdump; compinit
これで設定完了です。
いったんターミナルを閉じるなどしてシェルを再起動すれば、gitコマンドでサブコマンドやブランチ名の補完が行われるようになります。