Bashの補完について と Zshの補完について でシェルの補完について書きましたが、 これらに従ってBrew-fileの中にコマンド補完用のスクリプトを追加しました。
補完用ファイル
補完用のファイルはetc/bash_completion.d/brew-file 及びshare/zsh/site-functions/_brew-fileですが、 _brew-fileの方はbrew-fileの方へのリンクになっていて同じものです。
それぞれBash用、Zsh用ですが、同じような事をするので まとめて必要なところだけ中で分岐させる様にしています。
Bashの補完について、 Zshの補完について で書いたとおり、これらはFormulaの中で
1 2 3 4 5 6 7 8 9 |
|
と言った形でそれぞれ/usr/local/etc/bash_completion.d/と /usr/local/share/zsh/site-functions/へインストールされる様になっています。
Bashの場合は
Bash-Completion: http://bash-completion.alioth.debian.org/
をインストールして、.bashrcとかに
1 2 3 4 |
|
と書いておけばOK。
Zshの場合には
1 2 3 4 5 6 7 8 |
|
という感じで書いておけばOKです。 (zsh-completionsの方はzsh-completions をインストールしている場合ですが、ない場合はこれは無くてzsh-site-functions だけでOKです。)
brew
自身やbrew file
と言った場合にも補完するようにする
上の設定ではbrew-file
というコマンドに対してだけ補完をするので、
brew file
と、brew
コマンドのサブコマンドとして使った場合には
適用されません。
これにはbrew
コマンドの補完を上書きしてあげないといけないので、
これ用の設定を
etc/brew-wrap
に追加してあります。
1 2 3 4 |
|
という設定を上の補完用のファイルの読み込みの後に置いてください (Bash/Zsh両方とも同じ)。
brew
用の補完は_brew
という関数で決められていて、
brew-file
の補完は_brew_file
という関数で決められています。
brew-wrap
の中身を見てもらうと、
これらの関数が定義されてる時、
新たに_brew_completion_wrap
という関数を作って、
これを改めてbrew
コマンドの補完用関数として定義している事がわかると思います。
やってることは、まず、最初のbrew
で補完しようとする時、
通常外部のサブコマンドは補完されませんが、file
も補完される様にしました。
$ brew <Tab>
--cache abv configure fetch link missing remove unlink uses
--cellar audit create file linkapps options rm unlinkapps
--config cat deps help list outdated search unpin
--env cleanup diy home ln pin tap untap
--prefix commands doctor info log prune test update
--repository config edit install ls reinstall uninstall upgrade
$ brew
な感じでfile
も加わる様になります。
さらに、brew file
と打った後はbrew-file
に対する
補完と同じ物が補完されるように設定してあります。
このためにetc/bash_completion.d/brew-file
の方でも
補助関数の中で第一(コマンド自身)、第二引数がbrew
、file
と来た時には
1つずつ引数をずらして扱う様にする機能を入れています。
これでbrew file
と打つ時のもfile
は補完され、
さらにbrew file
と打った後もそれ用の補完が効くようになります。
$ brew file <Tab>
brew casklist commands help install push update
cask_upgrade clean edit init pull set_repo version
$ brew file
こんな感じ。-
で始まる様な引数は-
を打った後にだけ効くようにしてあります。
homebrew-fileのwrapper関数を’brew init’等一部コマンドを直接使える様にアップデート
の所でbrew
コマンドに対して直接init
等のサブコマンドを与えても
動くようにしたりしましたが、
この辺まで補完に入れてしまうとごっちゃになりそうだったので
今のところはbrew
と打った段階ではこれらのサブコマンドは
補完される様にはなってません。
(brew init
と打ってもらえれば補完はされませんが、実行すればbrew file init
と同じ動作はします。)
一応Bash(4.3.33)、Zsh(5.0.5)で動く事は確認しましたが、 特にZshは普段使わないので何か不具合があった場合は GitHubのIssueなり適当な手段で教えていただけるとありがたいです。