如何在鱼壳中覆盖/删除默认补全?

时间:2018-11-22 15:35:13

标签: fish

我正在为命令的子命令添加补全,但是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>时输入:

  • 我为--help定义的新的自动完成功能(正确)
  • -h的基本定义自动完成(错误)
  • 所有其他python3个基本自动完成开关,例如-V中的complete --command python3 --short-option 'V' --description 'Display version and exit'(我要禁用这些开关)

我已经考虑过使用-e标志在python3 -m venv模式下删除默认值,但这似乎是错误的处理方式。我很沮丧进入子命令模式后,如何禁用所有现有补全?还是需要对python3鱼内置补全的结构方式进行根本性的改变?

1 个答案:

答案 0 :(得分:2)

Fish从$ fish_complete_path中的文件加载补全。这是目录列表,例如$ PATH。将您的完成内容放入命令后命名的文件中,该文件的后缀为“ .fish”,该文件优先。

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