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
によって自動ロード可能としてマークされます。