私のzshスクリプトは次のパラメータを使用します。
./script --connect server --foo 3 --bar 5 name
--foo
--bar
整数を取り、オプションでname
はなく唯一のパラメータであり、事前定義された--connect
サーバーのリストで実行する必要があります。--connect
サーバーのリストを定義したい部分が詰まっています。
_arguments -S : \
'--foo' \
'--bar' \
'--connect' \
'*:server:->servers'
_servers() {
local -a server_list
server_list=(
'server1'
'server2'
)
_describe -t server-names "server name" server_list
}
入力するとオプションが提供されますが、-<TAB>
その後はサーバーは提供されません--connect
。また、name
オプションではなくパラメータであるパラメータを統合する方法がわかりません。
また、整数を指定して--foo
要求する必要があります。--bar
答え1
正しい動作を示す完成スクリプトを作成しました。すべてが正しいかどうかはわかりません。このスクリプトはおそらく改善される可能性があります。
name
たとえば、すべてのオプションが必須で、すべてのオプションの終わりにのみ提案する必要がある場合は、どうすればよいかわかりません。
name
オプションが以前に作成されていない場合、これらのオプションはその後も提案されます。ユーザーが後でオプションの提案を表示できないようにするには、name
スクリプトの12行目を次のように置き換えます。
'(- :)'':string:->names'
完成スクリプトは次のとおりです。
#compdef script
local state
local -a options_list
options_list=( \
'(--foo)'--foo'[foo desc]:number:->foos' \
'(--bar)'--bar'[bar desc]:number:->bars' \
'(--connect)'--connect'[connect to server]:string:->servers')
_arguments -S : $options_list \
':string:->names' \
&& ret=0
case $state in
foos)
local -a foo_number_list
foo_number_list=( \
'80' \
'8080')
_values 'Foo (integer)' $foo_number_list \
&& ret=0
;;
bars)
# '-d 123' will indicate 123 as default number:
_numbers -d 123 'bar number (integer)' \
&& ret=0
;;
servers)
local -a server_lists
server_lists=( \
'server1' \
'server2')
_values 'Servers' $server_lists \
&& ret=0
;;
names)
_arguments -S : $options_list
local -a name_list
name_list=( \
'name1' \
'name2')
_values 'Names' $name_list \
&& ret=0
;;
esac
return $ret