結婚祝いで先日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
などについて詳しく書いてあるのでオススメです。
自作コマンドに限らず、新しいツールなどを利用していたりするとサブコマンドが補完されず ガッカリすることがありますが、ほんの数行でサクッと出来る対応なのでオススメです。