結婚祝いで先日mizzyさんから頂いたBuild Awesome Command-Line Applications in Ruby
を読んで自作コマンドを作っているんですが、zshで補完されず不便だったので手抜きで対応。
最初はzshの補完関数も一緒に作っていたのですが、あまりに非効率だったので、.zshrcに書いて対応。
たとえばhogeというコマンドを自作していて、下記のようなサブコマンドがあった場合
1 2 3 4 | |
hoge[tab]でサブコマンドが補完され、

サブコマンドの後はファイル、ディレクトリが補完されるように。

サブコマンドとファイル名を補完する
下記を.zshrcに記載してexec $SHELL
やっていることは
compdefで_hogecmdという補完用functionを定義し、hogeコマンドを実行したときに呼び出されるように。- function内の
cmdsで補完したいサブコマンドを列挙 CURRENT == 2でhogeのあとに補完されるのはサブコマンドだけと指定_describeで補完候補で表示されるときにsubcommandというグループになるようにしている- サブコマンドのあとは
_filesでファイルとディレクトリが補完されるように
参考になるサイト
zshの補完関数の書き方がまとまっているところがほとんど無いので下記が非常参考になります。
- zsh補完関数を自作すると便利 - はこべブログ♨
- zsh補完関数の書き方(訳)
- zshcompsys(1): zsh completion system - Linux man page
- zshcompwid(1): zsh completion widgets - Linux man page
特にはこべブログ♨ さんの記事は、
補完の際に用いる、compadd,_files,_describeなどについて詳しく書いてあるのでオススメです。
自作コマンドに限らず、新しいツールなどを利用していたりするとサブコマンドが補完されず ガッカリすることがありますが、ほんの数行でサクッと出来る対応なのでオススメです。