自訂腳本的 zsh 補全:URL + 可選參數

自訂腳本的 zsh 補全:URL + 可選參數

我有自訂腳本的 zsh 補全,其中一個參數必須是 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,就不會完成其他選項。

那麼我如何告訴 zsh 完成,我的腳本需要一個 URL(即一個字串參數 - 我不希望 zsh 在當前位置開始完成檔案名稱),並且可選參數可以在此 URL 之前或之後完成?

注意:我並不是想自動完成 URL。我只是想在這個 URL 字串之前和之後完成工作。

答案1

使用發布的程式碼後myscript --ATab,zsh 嘗試完成選項或非選項參數編號 1。手動的在「(單一不含引號的空格)」下描述(如果操作僅包含零個或多個空格字符,則實際上會觸發這種情況):

當需要參數但不可能或不希望為其產生匹配項時,這非常有用。將顯示該訊息,但不會列出完成情況。

沒有要顯示的訊息:訊息輸入是單一空格,因此「顯示」動作沒有視覺效果。但是,顯示訊息的內部操作(在_message)執行,特別是compstate[insert]被設定為空。這向完成的使用者介面發出信號,表明該完成是不明確的,即使事實證明只有一個有效的完成。

解決方法是明確安排 zsh 認為沒有完成,而不是讓它認為有完成但無法生成。以下任何一項都可以:

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

請注意,如果參數是 URL,您可能應該使用_urls.這仍然會導致在鍵入後僅完成選項-(只要沒有 URL 以 a 開頭-或您有一些非常激進的子字串完成設定)。

相關內容