ランダムな数字を許可する zsh のオートコンプリート機能を作成するにはどうすればよいでしょうか?

ランダムな数字を許可する zsh のオートコンプリート機能を作成するにはどうすればよいでしょうか?

GitLab リポジトリのチケットを管理するための小さなスクリプトがあります。ticket と入力して 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によって自動ロード可能としてマークされます。

関連情報