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

相关内容