Como posso criar uma função de preenchimento automático para zsh que permita um número aleatório?

Como posso criar uma função de preenchimento automático para zsh que permita um número aleatório?

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_wordsfunçã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_argumentsdiretamente – 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, _alternativemas há exemplos desse estilo em outros lugares. Se você tiver muitas opções normais como -v, pode ser melhor usar _argumentspara elas e usar apenas _regex_argumentspara áreas mais complicadas.

A propósito, sua #autoloadtag é supérflua. compinitolha apenas para a primeira linha e #autoloadou #compdeffará com que ela seja marcada como carregável automaticamente.

informação relacionada