zsh 완료: 사전 정의된 목록에서 완료

zsh 완료: 사전 정의된 목록에서 완료

내 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

관련 정보