我有一个小脚本用于管理 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
都会导致其被标记为可自动加载。