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

関連情報