내 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