Как создать функцию автодополнения для zsh, которая допускает ввод случайных чисел?

Как создать функцию автодополнения для zsh, которая допускает ввод случайных чисел?

У меня есть небольшой скрипт для управления тикетами в репозиториях 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заставит ее пометить как автозагружаемую.

Связанный контент