zsh カスタム完成スクリプトと compsys/zstyle 構成の関係

zsh カスタム完成スクリプトと compsys/zstyle 構成の関係

cheatzshを使用するように求められたときに自動的に引数を完了するコマンドの簡単な完成スクリプトを作成しましたcheat
(明らかに)これはcompinit / compsys互換の方法で設定する必要があります:

文書:~/system/dev_resources/zsh_comp/_cheat

#compdef cheat

[bulk of code...]

# make call into compsys to provide completion!
_describe 'values' comp_cands_arr

次の方法でzshスクリプトを使用してください~/.zshrc

fpath=(~/system/dev_resources/zsh_comp $fpath)
autoload -U ~/system/dev_resources/zsh_comp/*(:t)

完了スクリプトが正常に動作します。問題ありません。これで、組み込みでこの完成スクリプトを参照して設定したいと
思います。これzstyle
完全なシステム構成zshのセクションCommScopeシステム文書私たちに教えてください:

コマンドラインのどこかで完了しようとすると、完了システムはコンテキスト[...]フィールドを
常に順番に作成し始めます

:完了:機能:完了:コマンド:パラメータ:ラベル

そして

[完成者]現在アクティブな完成者、先行下線なしの関数名、およびその他の下線がハイフンに変換されます。 「完成者」は、完成の実行方法を完全に制御できます。

私の質問は、私のzshコンプリートスクリプトが_cheatコンテキスト文字列の「完成者」と見なされますか?です。つまり、これは正しいか適用可能ですか?

:completion:function:cheat:command:argument:tag
                     ^^^^^

動作しているように見えますが、_cheatスクリプトは正式にシェル関数として定義されていませんが、ただルーズなコマンドバーです。

答え1

あなたの_cheatファイルするという関数を定義します_cheat。関数のコード()を表示してecho $functions[_cheat]これを確認できます。関数自動ロードファイル内のファイルには、_cheat () {ファイルの内容の前と}ファイルの内容の後にあるかのように関数のコードが含まれます。 (Zshは「kshスタイル」の自動ロードもサポートしています。ファイルには関数定義と関数自体の呼び出しを含める必要があります。)

魔法の最初の行#compdefシステムの初期化が完了したら、ファイル内の検索は、ファイル名(および自動ロード機能)とその機能で使用するコマンド名がどこにあるかを呼び出す$fpathことと同じです。関連付けは関連配列()に書き込まれます。compdef _cheat cheat_cheatcheat_comps$_comps[cheat]=_cheat

このcompleterフィールドはzstyleコンテキスト文字列先頭の下線が削除された完成関数の名前。

答え2

質問に答えるとき

私のzsh完了スクリプト_cheatはコンテキスト文字列の「完成者」と見なされますか?

答えは次のとおりです。いいえ
+をESC2使用してzshの完了コンテキストをダンプする場合CTRLxh

% cheat b                                                                                                                             
tags in context :completion::complete:cheat::
    values  (_describe _cheat)

cheatzshは、3番目/完成者の場所を完成者の「完了」に属すると見なし、4番目または場所に割り当てられていることを確認できますcommand
重要なのは、これはコマンドcheat(実際の実行プログラム)であり、zsh組み込み関数によって定義された値である_cheat完了関数ではないことです。_cheat
zstyle

関連情報