我有一個小腳本用於管理 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
都會導致其標記為可自動載入。