如何为 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都会导致其被标记为可自动加载。

相关内容