编写__fish_is_first_arg,但包含arg的参数

时间:2019-08-05 07:36:25

标签: fish

我正在为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>

我在做什么错了?

1 个答案:

答案 0 :(得分:2)

switch (count tokens)

应为:

switch (count $tokens)

(对于其他阅读此内容的人:$激活变量扩展。count $tokens扩展变量tokens并计算其值,而count tokens仅计算单个文字“令牌”。) / p>