Glide Note

glidenote's blog

zshでサブコマンドとファイル名を手抜き補完する

結婚祝いで先日mizzyさんから頂いたBuild Awesome Command-Line Applications in Ruby を読んで自作コマンドを作っているんですが、zshで補完されず不便だったので手抜きで対応。
最初はzshの補完関数も一緒に作っていたのですが、あまりに非効率だったので、.zshrcに書いて対応。

たとえばhogeというコマンドを自作していて、下記のようなサブコマンドがあった場合

1
2
3
4
hoge init
hoge update
hoge upgrade
hoge commit

hoge[tab]でサブコマンドが補完され、

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

サブコマンドとファイル名を補完する

下記を.zshrcに記載してexec $SHELL

やっていることは

  1. compdef_hogecmdという補完用functionを定義し、hogeコマンドを実行したときに呼び出されるように。
  2. function内のcmdsで補完したいサブコマンドを列挙
  3. CURRENT == 2hogeのあとに補完されるのはサブコマンドだけと指定
  4. _describeで補完候補で表示されるときにsubcommandというグループになるようにしている
  5. サブコマンドのあとは_filesでファイルとディレクトリが補完されるように

参考になるサイト

zshの補完関数の書き方がまとまっているところがほとんど無いので下記が非常参考になります。

特にはこべブログ♨ さんの記事は、 補完の際に用いる、compadd,_files,_describeなどについて詳しく書いてあるのでオススメです。

自作コマンドに限らず、新しいツールなどを利用していたりするとサブコマンドが補完されず ガッカリすることがありますが、ほんの数行でサクッと出来る対応なのでオススメです。

Comments