¿Cómo puedo crear una función de autocompletar para zsh que pueda permitir un número aleatorio?

¿Cómo puedo crear una función de autocompletar para zsh que pueda permitir un número aleatorio?

Tengo un pequeño script para gestionar tickets en repositorios de gitlab. Cuando escribo ticket y presiono tab, me gustaría ver:

% ticket
new  -- create a new ticket
#    -- Number of ticket
-v   -- increase verbosity

Para hacer esto he hecho esto que no 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 "$@"

Entiendo que no puede completar el número en mi cerebro, ni quiero que salga y cargue posiblemente miles de números. Pero sería bueno señalar que un número es una posible finalización.

Respuesta1

La _regex_wordsfunción está pensada para usarse con palabras literales, no con patrones (aparte de un único *donde las palabras se pueden abreviar). Por lo tanto, necesitarás manejar el número _regex_argumentsdirectamente, algo como lo siguiente:

#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 "$@"

Es un poco feo que esto necesite _message. Ese es un efecto secundario de cómo se implementa, _alternativepero hay ejemplos de este estilo en otros lugares. Si tiene muchas opciones normales como -v, puede ser mejor usarlas _argumentsy solo usarlas _regex_argumentsen áreas más complicadas.

Por cierto, tu #autoloadetiqueta es superflua. compinitmira solo la primera línea y o #autoloadhará #compdefque se marque como cargable automáticamente.

información relacionada