如何在 zsh 竞赛脚本中指定可选参数需要 2 个参数?

如何在 zsh 竞赛脚本中指定可选参数需要 2 个参数?

我正在为 zsh 编写一个自定义竞赛函数。目前,我有以下代码

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

我目前指定-G VALUEglitchpct=VALUE--glitchpct VALUE是可接受的(相互排斥,因为它们属于同一组)。

如果我需要 2 个而不是 1 个参数值怎么办?也就是说,我期望有-G VALUE1 VALUE2--glitchpct=VALUE1,VALUE2。我该如何指定这一点?另外,如果有 3 个等参数,会有什么不同?

此外,是否可以为每个参数显示自定义消息?说VALUE1应该显示'float from 0 to 50',并且VALUE2应该显示'float from 100 to 150'在屏幕上。我认为可以通过_message内置来做到这一点,但我不确定如何使其工作。我尝试指定这样的状态(这仅适用于 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也可能是-ma。包括a列出所有音乐文件,无需文件名。
  2. flags部分虽然没有那么充实,但允许使用through的可能值-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

以上尚未经过测试,因此请将其视为伪代码。我认为您正在寻找使用如上所述的数组。

相关内容