首页 > 解决方案 > 你如何覆盖/删除鱼壳中的默认完成?

问题描述

我正在为命令的子命令添加补全,但是fish 保留了基本命令的内置补全,但那些不再适用于子命令。我想在使用子命令时禁用这些基本命令完成。

因此,举一个具体的例子,我正在为命令添加complete完成。python3 -m venv正如我所说,所有内置python3完成仍然显示,即使它们不再适用。所以,当我输入 时python3 -m venv -<TAB>,我得到了我添加的补全(好!),但也得到了所有默认补全(坏)。

所以我有这个代码:

function __fish_python_using_command
    # make sure that the command (minus the first item) matches argv
    set cmd (commandline -opc)
    if [ (count $cmd) -le (count $argv) ]
        return 1
    end
    set idx (math (count $argv)+1)
    if [ "$argv" = "$cmd[2..$idx]" ]
        return 0
    end
    return 1
end

complete -f -c python3 -n '__fish_python_using_command -m venv' -s h -l help -d 'Display help creating virtual Python environments'

运行此程序后,当我键入时,python3 -m venv -<TAB>我得到:

我曾考虑-e在您处于python3 -m venv模式时使用该标志来删除默认值,但这似乎是错误的做法。我难住了。一旦进入子命令模式,如何禁用所有现有的完成?python3或者这是否需要对鱼内置完成的结构方式进行根本性的改变?

标签: fish

解决方案


Fish 从 $fish_complete_path 中的文件加载完成。这是一个目录列表,例如 $PATH。将您的完成放入以命令命名的文件中,在较早的目录中带有“.fish”后缀,它将优先。

例如~/.config/fish/completions/python3.fish。


推荐阅读