cheat
zshを使用するように求められたときに自動的に引数を完了するコマンドの簡単な完成スクリプトを作成しました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
_cheat
cheat
_comps
$_comps[cheat]=_cheat
このcompleter
フィールドはzstyle
コンテキスト文字列先頭の下線が削除された完成関数の名前。
答え2
質問に答えるとき
私のzsh完了スクリプト_cheatはコンテキスト文字列の「完成者」と見なされますか?
答えは次のとおりです。いいえ
+をESC2使用してzshの完了コンテキストをダンプする場合CTRLxh
% cheat b
tags in context :completion::complete:cheat::
values (_describe _cheat)
cheat
zshは、3番目/完成者の場所を完成者の「完了」に属すると見なし、4番目または場所に割り当てられていることを確認できますcommand
。
重要なのは、これはコマンドcheat
(実際の実行プログラム)であり、zsh組み込み関数によって定義された値である_cheat
完了関数ではないことです。_cheat
zstyle