我正在为 zsh 编写一个自定义竞赛函数。目前,我有以下代码
_arguments \
...
'(-G --glitchpct)'{-G+,--glitchpct=}'[Controls how often the characters on screen glitch]'
我目前指定-G VALUE
或glitchpct=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,展示了如何将参数作为数组传递。分解这个例子:
- 该说法
-m
也可能是-ma
。包括a
列出所有音乐文件,无需文件名。 - 该
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
以上尚未经过测试,因此请将其视为伪代码。我认为您正在寻找使用如上所述的数组。