Ich habe ein kleines Skript zum Verwalten von Tickets in Gitlab-Repos. Wenn ich Ticket eingebe und die Tabulatortaste drücke, möchte ich Folgendes sehen:
% ticket
new -- create a new ticket
# -- Number of ticket
-v -- increase verbosity
Dazu habe ich Folgendes getan, was nicht funktioniert:
#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 "$@"
Ich verstehe, dass es die Zahl in meinem Kopf nicht vervollständigen kann – und ich möchte auch nicht, dass es losgeht und möglicherweise Tausende von Zahlen lädt. Aber es wäre gut, darauf hinzuweisen, dass eine Zahl eine mögliche Vervollständigung ist.
Antwort1
Die _regex_words
Funktion ist für die Verwendung mit wörtlichen Wörtern gedacht, nicht mit Mustern (abgesehen von einer einzelnen, *
bei der Wörter abgekürzt werden können). Sie müssen also die Nummer _regex_arguments
direkt verarbeiten – etwa wie folgt:
#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 ist ein bisschen hässlich, dass dies erfordert _message
. Das ist ein Nebeneffekt der Implementierung über , _alternative
aber es gibt anderswo Beispiele für diesen Stil. Wenn Sie viele normale Optionen wie haben -v
, kann es besser sein, für diese zu verwenden und nur für kompliziertere Bereiche _arguments
zu verwenden ._regex_arguments
Übrigens #autoload
ist Ihr Tag überflüssig. compinit
betrachtet nur die erste Zeile und führt entweder zu „ #autoload
oder“ #compdef
und markiert sie als automatisch ladbar.