zsh は、パラメーターを生成するコマンドをトリガーする呼び出しを完了します。

zsh は、パラメーターを生成するコマンドをトリガーする呼び出しを完了します。

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_programC、代替の許可、およびロケール設定(英語メッセージ、デフォルトの米国日付形式など)などの詳細を処理します。

優れた複雑な完成機能を作成するために必要な情報のほとんどはマニュアルにありますが、必要な情報を含む反文章を見つけるのが難しい、または悪いことに、必要な情報を複数の場所から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

関連情報