У меня есть небольшой скрипт для управления тикетами в репозиториях gitlab. Когда я набираю тикет и нажимаю tab, я хотел бы увидеть:
% ticket
new -- create a new ticket
# -- Number of ticket
-v -- increase verbosity
Чтобы это сделать, я сделал следующее, но это не сработало:
#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 "$@"
Я понимаю, что он не может завершить число в моем мозгу - и я не хочу, чтобы он выходил и загружал, возможно, тысячи чисел. Но было бы неплохо отметить, что число является возможным завершением.
решение1
Функция _regex_words
предназначена для использования с буквальными словами, а не с шаблонами (кроме одного, *
где слова могут быть сокращены). Поэтому вам нужно будет обрабатывать число _regex_arguments
напрямую – что-то вроде следующего:
#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 "$@"
Немного некрасиво, что для этого нужно _message
. Это побочный эффект того, как это реализовано через , _alternative
но есть примеры этого стиля в других местах. Если у вас много обычных вариантов, таких как -v
, может быть лучше использовать _arguments
для них и использовать только _regex_arguments
для более сложных областей.
Кстати, ваш #autoload
тег лишний. compinit
Просматривает только первую строку и либо , #autoload
либо , #compdef
заставит ее пометить как автозагружаемую.