LoginSignup
12
13

More than 5 years have passed since last update.

fish shell で補完の実装 - complete

Posted at

概要

以前にコマンドラインツールを作った際、補完をfishにも対応したかった時にちょっと調べたので共有します。

complete 関数の使い方になります。

結論から言うとサブコマンドの補完の実装はめんどくさいです。

まず fish shell ってどんな感じという方はこちら :fish_cake:

fish の構文など

 

環境構築や実際入れてみているスクショなど(fishをとりあえず入れて使ってみるというだけであれば。)

補完

公式ドキュメント

Writing your own completions

complete -c myprog -s o -l output -a "yes no"

上記のような例が挙げられています。
上の例は myprog コマンドにショートオプション o とロングオプション output と引数 yesno を補完してくれるようになります。

公式レファレンス

complete - edit command specific tab-completions

他にもありますが、complete 関数には主に以下のオプションがあります。

オプション 意味
c コマンド
s ショートオプション
l ロングオプション
a 引数
w 継承する場合
d 説明

w に関しては以下の例がわかりやすかったです。

complete -c hub -w git

hubコマンドの補完に gitコマンドの補完をそのまま実装するみたいです。

デモ

まず demo という関数を作っておきます。

現在はカレントフォルダにあるものしか候補に上がっていません。
fish のデフォルトです。)

complete関数を実行すると yesno も候補に入ります。

しかし、カレントフォルダのファイルの候補は邪魔です。
-f オプションを使います。

しかし、これでは

demo yes <file_path>

のような時に不便です。

サブコマンドの場合分け

場合分けには -n オプションを使います。

-n オプションでは、指定した命令を実行した時に返ってくる値( 01 )によって、この補完をするかしないかを決めます。

function __demo_using_subcommand
  set cmd (commandline -opc)
  if [ (count $cmd) -eq 2 ]
    return 0
  else
    return 1
  end
end

例えば、上記のような関数を定義して -n オプションで使うと

https://gyazo.com/d5e8547349d28a359a3c08784559ffb5

このように、現在のコマンドライン上の単語が2つの時のみ、補完するようなものを定義することができます。

yesnoの補完を実装する際に-nオプションに現在のコマンドラインの単語の数が1つの時のみ 0 を返すような関数を与えてやれば、3つ目の補完には出てきません。

という風にちょっとめんどくさいです。

commandlineコマンドはもっと奥が深いと思いますので、もっとしっかり勉強します。

参考サイト

fish にデフォルトで入っている関数たちのソースです。

12
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
13