3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Git エイリアスのタブ補完

Posted at

皆さん、Git コマンドをタブ補完していますか?

まだだよ、って方は以下のエントリがオススメです。


では、タブ補完できるようになったところで「Git のエイリアス」の話に戻ります。

Git のエイリアスを設定して、せっかく短いコマンドで実行できるようになったのに、タブ補完が効かなくて逆に面倒くさい

komatta_man2.png

というようなことはないでしょうか? このエントリはそんな悩みを解決する助けになると思います。

さて、一言で「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

  1. 今回のような既存のサブコマンドの置き換えであれば、実際は何もしなくても補完は効きますが、簡単のためこの例で説明します

  2. bash 以外の方は使用しているシェルに読み替えてください

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?