我的 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