我有一个 script foo
,它采用以下形式的一些可选命令行参数:
foo -A <NUM> -B <NUM> -i
或者也可以没有空格:
foo -A<NUM> -B<NUM> -i
其中 NUM 是整数。该脚本不应完成文件名/目录。
我有以下完成规则:
#compdef foo
local -a args
_arguments -S \
'*-A' \
'*-B' \
'*-i'
我必须添加什么,以便完成知道选项-A
或-B
本身不完整,但需要一个数字才能继续完成?
在另一个脚本中,我有类似的情况,唯一的区别是选项使用=
:
foo --port=<PORT>
我怎么也能做到这一点?
更新:
我遇到奇怪的问题,完成如下:
#compdef foo
_arguments -S \
'-A+:' \
'-B+:' \
'-i'
由于某种原因,第一个参数A
被忽略,即:
foo -<TAB>
-B -i
但是当我把其他选项放在前面时A
#compdef foo
_arguments -S \
'-x+:' \
'-A+:' \
'-B+:' \
'-i'
那么不仅会A
显示,还会显示另一个新选项:
foo -<TAB>
-A -B -i -x
这里发生了什么?
答案1
告诉_arguments
该选项需要一个参数。选项后面+
的表示该选项可以在同一个单词中,也可以在单独的单词中。第一部分之后的部分:
是生成匹配时显示的消息,这在这里毫无意义,因为不会有任何完成。第二列之后的部分是补全函数,大概没有。
_arguments -S : \
'*-A+:number:' \
'*-B+:number:' \
'*-i'
对于长选项,如果 和 都被接受,或者如果仅被接受,则放在选项名称之后而=
不是:
放在选项名称之后。对于网络 (TCP/UDP) 端口,如果您的命令接受端口名称,请用作完成函数。--port 123
--port=123
=-
--port=123
_port