あんパン

こしあん派

自作のgitサブコマンドをzshで補完する

普段の暮らしでは自作のgitサブコマンドを作って便利に使っている。

masawada.hatenablog.jp

masawada.hatenablog.jp

のだけど、通常そのままではzshの補完が効かず、全て打つかhistoryから呼び出すかする必要があった。不便だしさすがに何か方法あるだろうな〜と探っていたところ発見したのでご紹介。

A better solution is to create a function _git-foo() to handle specific completion for that command. This also allows you to add command-specific completion as well. Place such a function inside an autoloaded #compdef file and you should be all set. You can add a description to such a function by adding a line matching

#description DESCRIPTION

as the second line in the file. See Completion/Debian/Command/_git-buildpackage in the Zsh sources for an example.

zsh/_git at master · zsh-users/zsh · GitHub

ふむふむ。つまり、通常の補完ファイルと同様に _git-foo のような命名でファイルを置くとよいとのこと。詳しくは Completion/Debian/Command/_git-buildpackage を見ると分かりそう。

#compdef git-buildpackage
#description build Debian packages from a git repository

_arguments \
  '--version[show program version number and exit]' \
  '--help[show help message and exit]' \
  '--git-ignore-new[build with uncommitted changes in the source tree]' \
...

zsh/_git-buildpackage at master · zsh-users/zsh · GitHub

なるほど2行目に #description を書くと補完時に表示されるようだった。_arguments を使えば引数の補完もできる。

補完のファイルは $fpath に列挙されているパスに存在している必要がある。自分は $HOME/.zsh/completion に置くことにした。

fpath=($HOME/.zsh/completion $fpath)
autoload -Uz compinit && compinit

これで試しに $HOME/.zsh/completion/_git-delete-branches を置くと…

$ git de
delete-branches - Delete selected branches (peco required)
describe        - show most recent tag that is reachable from a commit

動いた! ずっと不便だな〜と思っていたのではやいところやっておけばよかった。