Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
14
Help us understand the problem. What is going on with this article?

More than 5 years have passed since last update.

@sosuke

fish shell で補完の実装 - complete

概要

以前にコマンドラインツールを作った際、補完を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 にデフォルトで入っている関数たちのソースです。

14
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
14
Help us understand the problem. What is going on with this article?