皆さん、Git コマンドをタブ補完していますか?
まだだよ、って方は以下のエントリがオススメです。
では、タブ補完できるようになったところで「Git のエイリアス」の話に戻ります。
Git のエイリアスを設定して、せっかく短いコマンドで実行できるようになったのに、タブ補完が効かなくて逆に面倒くさい
というようなことはないでしょうか? このエントリはそんな悩みを解決する助けになると思います。
さて、一言で「Git のエイリアス」と言っても、以下ふたつの意味があります。
-
alias gco='git checkout'
と定義するもの -
git config alias.co checkout
と定義するもの
多くの人は前者の gco
コマンドをタブ補完したいようで、こちらの情報はググるとたくさん見つかりました。今回私がやりたかったのは後者で、こちらは全然見つけられなかったので、前者と合わせてここにまとめておきます。
alias コマンドで作成したエイリアスのタブ補完
以下のように行います。
$ alias gco='git checkout'
$ __git_complete gco _git_branch
$ alias g='git'
$ __git_complete g __git_main
$
git-completion.bash
内で __git_complete
も _git_branch
も __git_main
も定義されていて、読み込んだ後であれば使用できます。どのコマンドにどの関数を使用すればよいか、は git-completion.bash
を眺めればなんとなくわかるので、後は試してみるだけです。
git config alias.* コマンドで作成したエイリアスのタブ補完
以下のように行います1。
__git_my_main() {
if [ ${COMP_CWORD} = 2 -a "${COMP_WORDS[1]}" = "co" ]; then
_git_branch
else
__git_main
fi
}
__git_complete git __git_my_main
git-completion.bash
を読み込むと、この内部で __git_complete git __git_my_main
を実行しており、git
コマンドに対して __git_main
関数を登録していますが、これを自分で定義した __git_my_main
に置き換えます。
__git_my_main
内の COMP_CWORD
では入力が確定した引数の数、COMP_WORDS
では入力途中を含む引数の内容が配列で得られるため、これらを参照して適切な補完を実装すれば完成です2。