你如何 override/remove 在 fish shell 中默认完成?

How do you override/remove default completions in fish shell?

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

因此,举一个具体的例子,我为 python3 -m venv 命令添加了 complete 补全。正如我所说,所有内置 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> 时,我得到:

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

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

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