首页 > 解决方案 > 编写 __fish_is_first_arg,但包含 arg 的参数

问题描述

我正在为谷歌的 to-webp 转换器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,这也是我想要的。

但是,当我在 处按 Tab 键时cwebp -preset <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>如上所述。

我究竟做错了什么?

标签: fish

解决方案


switch (count tokens)

应该:

switch (count $tokens)

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


推荐阅读