2つのパラメータが必要なzsh競合スクリプトでオプションのパラメータを指定する方法は?

2つのパラメータが必要なzsh競合スクリプトでオプションのパラメータを指定する方法は?

私はzshのカスタムレース関数を書いています。現在、次のコードがあります

_arguments \
...
'(-G --glitchpct)'{-G+,--glitchpct=}'[Controls how often the characters on screen glitch]'

私は現在または-G VALUE両方をglitchpct=VALUE許可--glitchpct VALUEすることを指定します(同じグループに属しているため、相互に排他的です)。

パラメータ値が1つではなく2つが必要な場合はどうすればよいですか?つまり、-G VALUE1 VALUE2またはがあると予想します--glitchpct=VALUE1,VALUE2。これをどのように指定しますか?また、3つの同じパラメータがある場合の違いは何ですか?

また、各パラメータのカスタムメッセージを表示できますか?VALUE1表示する必要が'float from 0 to 50'あり、画面にVALUE2表示する必要があると言います。組み込みでこれを行うこと'float from 100 to 150'ができると思いますが、どのように機能させるかはわかりません。_message次のように状態を指定してみました。 (まだ2つの値の使用方法を理解していないため、これは1つの値でのみ機能します。)

_arguments \
...
'(-G --glitchpct)'{-G+,--glitchpct=}'[Controls how often the characters on screen glitch]:float:->display_float'
...
case "$state" in
        (display_float)
            _message "sample message"
        ;;
    esac

しかし、これは何も示していません。次の形式も機能しません。

'(-G --glitchpct)'{-G+,--glitchpct=}'[Controls how often the characters on screen glitch]:float:_message "sample message"

答え1

パラメータ配列を含む例にリンクすることを望み、上記の説明を提供します。以下は、リンクから直接コピーした例です。

_arguments '-m[music file]:filename:->files' '-f[flags]:flag:->flags'
case "$state" in
    files)
        local -a music_files
        music_files=( Music/**/*.{mp3,wav,flac,ogg} )
        _multi_parts / music_files
        ;;
    flags)
        _values -s , 'flags' a b c d e
        ;;
esac

上記の例はHowtoから取得され、パラメータを配列に渡す方法を示しています。この例を分析すると、次のようになります。

  1. その声明は-m次のようになります-maaすべての音楽ファイルのリストが含まれ、ファイル名は必要ありません。
  2. このflagsセクションは具体化されていませんが、次の可能な値-fで初期化できます。-fs-fa-fe

コード関連:上記のコードに似た次の形式を考えてみましょう。

_arguments '-G[glitchpercentage]:gpercent:->percents' '-f[flags]:flag:->flags'
case "$state" in
    percents)
        local -a percents
        glitchpercentage=\\do something to set to 100%
        _message "Some message for all option"
        local -h percents
        glitchpercentage=//do something to set to 50%
        _message "Some message for half option"
        ;;
    flags)
         // Add these to control the program, i.e. use these options
         // if they dont control something in the percents array.
        _values -s , 'flags' a b c d e
        ;;
esac

上記はテストされていませんので、疑似コードと見なしてください。上記のように配列を使用しようとしていると思います。

関連情報