概要
以前にコマンドラインツールを作った際、補完をfish
にも対応したかった時にちょっと調べたので共有します。
complete
関数の使い方になります。
結論から言うとサブコマンドの補完の実装はめんどくさいです。
まず fish shell ってどんな感じという方はこちら
fish
の構文など
環境構築や実際入れてみているスクショなど(fish
をとりあえず入れて使ってみるというだけであれば。)
補完
公式ドキュメント
complete -c myprog -s o -l output -a "yes no"
上記のような例が挙げられています。
上の例は myprog
コマンドにショートオプション o
とロングオプション output
と引数 yes
と no
を補完してくれるようになります。
公式レファレンス
complete - edit command specific tab-completions
他にもありますが、complete
関数には主に以下のオプションがあります。
オプション | 意味 |
---|---|
c | コマンド |
s | ショートオプション |
l | ロングオプション |
a | 引数 |
w | 継承する場合 |
d | 説明 |
w
に関しては以下の例がわかりやすかったです。
complete -c hub -w git
hub
コマンドの補完に git
コマンドの補完をそのまま実装するみたいです。
デモ
まず demo
という関数を作っておきます。
現在はカレントフォルダにあるものしか候補に上がっていません。
(fish
のデフォルトです。)
complete
関数を実行すると yes
と no
も候補に入ります。
しかし、カレントフォルダのファイルの候補は邪魔です。
-f
オプションを使います。
しかし、これでは
demo yes <file_path>
のような時に不便です。
サブコマンドの場合分け
場合分けには -n
オプションを使います。
-n
オプションでは、指定した命令を実行した時に返ってくる値( 0
か 1
)によって、この補完をするかしないかを決めます。
function __demo_using_subcommand
set cmd (commandline -opc)
if [ (count $cmd) -eq 2 ]
return 0
else
return 1
end
end
例えば、上記のような関数を定義して -n
オプションで使うと
このように、現在のコマンドライン上の単語が2つの時のみ、補完するようなものを定義することができます。
yes
とno
の補完を実装する際に-n
オプションに現在のコマンドラインの単語の数が1つの時のみ 0
を返すような関数を与えてやれば、3つ目の補完には出てきません。
という風にちょっとめんどくさいです。
※ commandline
コマンドはもっと奥が深いと思いますので、もっとしっかり勉強します。
参考サイト
fish
にデフォルトで入っている関数たちのソースです。