cmd
ジョブを実行するスクリプトがあります。cmd
複数のディレクトリに存在します。各インスタンスは、パラメータcmd
となる独自のアクションを定義します。
cmd
各コピーが必要に応じて独自の完成コンテンツを作成したいと思います。
./cmd tasks
スクリプトの各コピーで使用できる引数の改行区切りリストを出力します。
$./cmd tasks
delete
dump
help
other
次のzshは_cmd
実行時に必要に応じて機能します./cmd
。
#compdef cmd
args=( $(./cmd tasks) )
_arguments '*: :(${args})'
ただし、その定義のパスは静的であるため、実行またはパスバリアントを実行すると./cmd
完了は失敗します。/somedir/cmd
$0
などの利用可能なトリガコマンドが完了定義から欠落しているようです_cmd
。
_arguments
コントロールを返し、いくつかの追加の状態を埋めるために呼び出すことができるいくつかのメソッドがあることがわかります。
local context state line state_descr
_arguments -C '*::arg:->args'
$0
しかし、今回も同様の受信コマンドがいっぱいになるのを見たことはありません。以前に完了を生成したことがないので、イベントを使用する_arguments
ことはおそらくこれを行う正しい方法ではありません。これは、これを試している間に私が見つけた最初の作業ソリューションです。
完了をトリガーしたコマンドで使用可能なパラメーターを生成するためにzsh完了をどのように定義しますか?
答え1
コマンドとそのパラメーターは次の場所にあります。words
大量に。だから電話してください$words[1]
。
直接呼び出す代わりにパスしてください。_call_program
C
、代替の許可、およびロケール設定(英語メッセージ、デフォルトの米国日付形式など)などの詳細を処理します。
優れた複雑な完成機能を作成するために必要な情報のほとんどはマニュアルにありますが、必要な情報を含む反文章を見つけるのが難しい、または悪いことに、必要な情報を複数の場所から1つにまとめることはしばしば困難です。見つけるのは難しいです。何かを調べる最も簡単な方法は、同様のことをする既存の完成関数を見つけて、その関数が何であるかを読み、マニュアルを通じて関数と変数に関する情報を得ることです。しかし、zshに付属のすべての機能が正しく機能するわけではないので、これでも理想的ではありません。たとえば、最初は_git
非常に大きく、多くのコンテンツを含む例を確認しましたが、この特定の操作に対して誤った呼び出しを実行しましたgit
。$path
したがって、ここに良い例があります。_gpg
:
allopts=( $(_call_program options $words[1] --dump-options) )
したがって、あなたが複数のcmd
引数を受け入れる場合、各引数はジョブ名です(たとえば、呼び出すことができますcmd dump dump tasks other
)。
tasks=($(_call_program tasks $words[1] tasks))
_arguments "*:task:($tasks)"
あるいは、最初の引数がジョブ名で、cmd
後続の引数がそのジョブ名である場合は、_arguments
それを解析してみましょう。line
オプションではなくパラメータで配列を設定します。
local context state state_descr line
typeset -A opt_args
tasks=($(_call_program tasks $words[1] tasks))
_arguments \
'--global-option[This is an example global option that goes before the task name]' \
"1:task:($tasks)" \
"*:arg:->args"
case $state in
args)
… # here $line[1] is the task name
;;
esac