
我有自訂腳本的 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 --A
Tab,zsh 嘗試完成選項或非選項參數編號 1。手動的在「(單一不含引號的空格)」下描述(如果操作僅包含零個或多個空格字符,則實際上會觸發這種情況):
當需要參數但不可能或不希望為其產生匹配項時,這非常有用。將顯示該訊息,但不會列出完成情況。
沒有要顯示的訊息:訊息輸入是單一空格,因此「顯示」動作沒有視覺效果。但是,顯示訊息的內部操作(在_message
)執行,特別是compstate[insert]
被設定為空。這向完成的使用者介面發出信號,表明該完成是不明確的,即使事實證明只有一個有效的完成。
解決方法是明確安排 zsh 認為沒有完成,而不是讓它認為有完成但無法生成。以下任何一項都可以:
_arguments … '1: :()'
_arguments … '1: :{}'
_arguments … '1: : true'
請注意,如果參數是 URL,您可能應該使用_urls
.這仍然會導致在鍵入後僅完成選項-
(只要沒有 URL 以 a 開頭-
或您有一些非常激進的子字串完成設定)。