zsh 文件名的制表符补全功能适用于某些命令,但对其他命令无效

zsh 文件名的制表符补全功能适用于某些命令,但对其他命令无效

我编写了一个位于当前目录中的小 shell 脚本,并像这样调用它:./import <command> <file>。当我尝试使用 tab 来完成文件名时,zsh只会发出哔哔声。

ls但是,我可以使用类似或 的命令完成同一个文件zip。在下面的示例中,我在输入 后按下 Tab 键../S

% ./import capitalone ../S<BEEP>
% ls ../Source\ Docs/    (no issue)
% zip ../Source\ Docs/    (no issue)

我尝试在 Google 上搜索这个问题的答案,但我发现的都是其他类型的制表符补全问题。我还尝试阅读 zsh 补全手册,但发现它非常复杂,而且答案可能是什么并不是一目了然的。

更新:添加了一些请求的调试输出:

% ./import asdf ./
tags in context :completion::complete:import::
    options   (_arguments _x_arguments _imagemagick) 
    messages  (_message _arguments _x_arguments _imagemagick)
tags in context :completion::complete:import:options:
    options  (_arguments _x_arguments _imagemagick)

答案1

补全系统非常强大,因为它不仅可以补全文件名,还可以补全命令的参数。例如,尝试一下ls -<TAB>

但是,就你的情况而言,正在尝试完成import命令的参数,这显然属于图像魔法包,如调试输出所示:

tags in context :completion::complete:import:options:

我认为有三种可能性:

  1. 将您的命令重命名为不会触发特殊完成的名称,例如my_import

  2. import使用以下命令禁用完成:

    compdef -d import
    

    请注意,你需要将其放入你的配置(最有可能~/.zshrc)以使其永久化。

  3. 编写您自己的完成函数,专门针对您的import命令......;)

相关内容