カスタム スクリプトの zsh 補完: URL + オプション パラメータ

カスタム スクリプトの zsh 補完: URL + オプション パラメータ

カスタム スクリプト用の zsh 補完機能があり、1 つのパラメータは URL (つまり文字列) である必要があり、その後にいくつかのオプション パラメータがあります: --AAA --BBB --CCC:

_arguments -S : \
    '--AAA' \
    '--BBB' \
    '--CCC' \
    '1: :'

ただし、補完は URL パラメータが指定された後のみ機能します。例:

myscript URL --A<TAB>

これは自動補完されます--AAA

しかし、私が次のことを持っているとき:

myscript --A<TAB>

すると、一致するオプション --AAA のみがリストされますが、入力しても自動補完されません--AA<TAB>。手動で入力する必要があります。

完了スクリプトを次のように変更します。

_arguments -S : \
    '--AAA' \
    '--BBB' \
    '--CCC'

パラメータの自動補完は機能しますが、URL を提供するとすぐに他のオプションは完了しません。

では、スクリプトが 1 つの URL (つまり、1 つの文字列引数 - zsh に現在の場所のファイル名の補完を開始させたくありません) を想定しており、オプションのパラメーターはこの URL の前または後に補完できることを zsh 補完に伝えるにはどうすればよいでしょうか。

注: URL を自動補完しようとしているわけではありません。この 1 つの URL 文字列の前後両方で補完が機能するようにしようとしているだけです。

答え1

投稿されたコードでは、の後にmyscript --ATab、zshはオプションまたは非オプション引数番号1のいずれかを完了しようとします。引数1のアクションは空であり、マニュアル「(引用符で囲まれていない単一のスペース)」で説明します (このケースは、アクションが 0 個以上のスペース文字のみで構成されている場合、実際にトリガーされます)。

これは、引数が必要であるが、それに一致するものを生成することが不可能または望ましくない場合に役立ちます。メッセージは表示されますが、補完はリストされません。

表示するメッセージはありません。メッセージ入力は1つのスペースなので、「表示」アクションは視覚的な効果はありません。ただし、メッセージを表示する内部アクション(_message)が行われ、特にcompstate[insert]空に設定されます。これにより、有効な補完が 1 つだけある場合でも、補完があいまいであることが補完のユーザー インターフェイスに通知されます。

修正方法は、zshが次のように考えるように明示的に設定することです。完了はありません、そう思わせるのではなく補完はあるが生成できない次のいずれかを実行します。

_arguments … '1: :()'
_arguments … '1: :{}'
_arguments … '1: : true'

ただし、引数が URL の場合は、 を使用する必要があるでしょう_urls。この方法でも、入力後にオプションの補完のみが表示されます(URL が で始まっていないか、非常に積極的な部分文字列補完設定がない限り) --

関連情報