我正在为Google的Web转换器cwebp编写一个完成文件。它的帮助说-preset
应该放在所有其他参数之前。考虑到这一点,我尝试使用__fish_is_first_arg
限制其可用性,例如:
complete -c cwebp -x -n '__fish_is_first_arg' -o preset -a 'default photo picture drawing icon text' -d 'Preset setting'
这将使cwebp -o -pres<Tab>
不会 建议-preset
,这正是我想要的。
与此同时,cwebp -pres<Tab>
会将参数填入完整的-preset
,这也是我想要的。
但是,当我按下cwebp -preset <Tab>
处的Tab键时,给出的唯一建议是当前目录中的文件和目录。这不是我想要的。
考虑到这一点,我认为我必须编写一个“是第一个或第二个选项”功能。但是,进展并不顺利。这是我到目前为止的内容:
function __fish_cwebp_is_first_option_or_its_argument
set -l tokens (commandline -co)
# line alpha
switch (count tokens)
case 1
return 0
case 2
if test \( "$tokens[2]" = '-preset' \)
return 0
end
return 1
case '*'
# line beta
breakpoint
return 1
end
end
据我所知,此函数体的工作方式与return 0
((true)
)相同。无论如何,-pres<Tab>
都会完成-preset
,即使行看起来像cwebp -h -H -version -pres<Tab>
。
当我在alpha行上放置一个断点时,我可以echo $tokens
并查看所有我已经完全键入的标记(最后一个标记和光标之间必须至少有一个空格)。但是,当我在beta行上只有一个断点时,如图所示,我什至无法触发断点。如上所述,甚至没有使用cwebp -h -H -version -pres<Tab>
。
我在做什么错了?
答案 0 :(得分:2)
switch (count tokens)
应为:
switch (count $tokens)
(对于其他阅读此内容的人:$激活变量扩展。count $tokens
扩展变量tokens
并计算其值,而count tokens
仅计算单个文字“令牌”。) / p>