Eu tenho um pequeno script para gerenciar tickets em repositórios do gitlab. Quando digito ticket e pressiono tab, gostaria de ver:
% ticket
new -- create a new ticket
# -- Number of ticket
-v -- increase verbosity
Para fazer isso eu fiz isso que não funciona:
#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 "$@"
Entendo que ele não consegue completar o número em meu cérebro - nem quero que ele saia e carregue possivelmente milhares de números. Mas observar que um número é uma conclusão possível seria bom.
Responder1
A _regex_words
função deve ser usada com palavras literais, não com padrões (além de um único *
onde as palavras podem ser abreviadas). Portanto, você precisará lidar com o número _regex_arguments
diretamente – algo como o seguinte:
#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 "$@"
É um pouco feio que isso precise _message
. Esse é um efeito colateral de como ele é implementado, _alternative
mas há exemplos desse estilo em outros lugares. Se você tiver muitas opções normais como -v
, pode ser melhor usar _arguments
para elas e usar apenas _regex_arguments
para áreas mais complicadas.
A propósito, sua #autoload
tag é supérflua. compinit
olha apenas para a primeira linha e #autoload
ou #compdef
fará com que ela seja marcada como carregável automaticamente.