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_words
funció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_arguments
directamente, 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, _alternative
pero hay ejemplos de este estilo en otros lugares. Si tiene muchas opciones normales como -v
, puede ser mejor usarlas _arguments
y solo usarlas _regex_arguments
en áreas más complicadas.
Por cierto, tu #autoload
etiqueta es superflua. compinit
mira solo la primera línea y o #autoload
hará #compdef
que se marque como cargable automáticamente.