如何為 zsh 創建一個允許隨機數的自動完成功能?

如何為 zsh 創建一個允許隨機數的自動完成功能?

我有一個小腳本用於管理 gitlab 儲存庫中的票證。當我輸入票證並按 Tab 時,我想看到:

% ticket
new  -- create a new ticket
#    -- Number of ticket
-v   -- increase verbosity

為此,我做了這行不通的事:

#compdef ticket
#autoload

local -a reply

_regex_words commands "ticket commands" \
  'new:create a new ticket' \
  '-v:increase verbosity' \
  '[1-9][0-9]#:open ticket #'
_regex_arguments _ticket /$'[^\0]##\0'/ "${reply[@]}"

_ticket "$@"

我知道它無法完成我大腦中的數字 - 我也不希望它出去並加載可能數千個數字。但注意到一個數字是可能的完成會很好。

答案1

_regex_words函數適用於文字單字,而不是模式(除了*可以縮寫單字的單字)。因此,您需要_regex_arguments直接處理該號碼 - 如下所示:

#compdef ticket

local -a reply

_regex_words commands "ticket commands" \
  'new:create a new ticket' \
  '-v:increase verbosity'

_regex_arguments _ticket /$'[^\0]##\0'/ \
  \( "${reply[@]}" \
  \| $'/[1-9][0-9]#\0/' ': _message -e numbers "open ticket"' \)

_ticket "$@"

這個需要有點難看_message。這是它的實現方式的副作用,_alternative但其他地方也有這種風格的例子。如果您有許多普通選項,例如-v,則最好用於_arguments這些選項,並且僅用於_regex_arguments更複雜的區域。

順便說一句,你的#autoload標籤是多餘的。compinit僅查看第一行,或#autoload#compdef都會導致其標記為可自動載入。

相關內容