从 ZSH 自动完成中排除环境变量

从 ZSH 自动完成中排除环境变量

简单示例:

~ $ wor<TAB>
~ $ WORDCHARS=                                                                                                                                                                                                             
WORDCHARS    WORKON_HOME  WORKON_HOME  workon 

workon是所需的命令。有没有办法将环境变量排除在 ZSH 的自动完成之外?

答案1

我没有找到这样的选项,但如果您的完成区分大小写,也许对您有帮助。您可以在您的~/.zshrc:中设置它:

# Set to this to use case-sensitive completion
CASE_SENSITIVE="true" 

答案2

总结

将其添加到您的~/.zshrc

function _parameters() {}

解释:

在 zsh 补全系统中,每个可补全模式都与某个补全函数匹配。如果在命令位置调用补全(在 zsh 术语中),zsh 会调用与特殊模式关联的函数-command-

_comps_所有完成模式和函数都以关联数组的形式存储在变量中。因此,您可以看到调用了哪个函数来完成命令,如下所示:

echo ${_comps[-command-]}

在我的例子中,该函数是_command_names。如果我们看一下这个函数的源代码,

whence -f _command_names

然后您将看到所有可能的补全来源。它可以是内置程序、路径上的可执行文件、本地可执行文件(如果补全前缀包含斜杠)、别名、函数、作业、保留字以及至关重要的参数(包括环境变量)。查看代码_command_names我发现是否应该建议参数是不可配置的 -_parameters函数总是被调用。_parameters同样,该函数似乎也没有足够的可配置性。

此时,我们已经知道了足够多的信息,可以考虑一些解决方案。一种是修改_command_names和删除parameters:_parameters源。另一种是使该_parameters函数成为无操作函数。第二种选择看起来不太容易出错,因此我建议使用。


请注意,覆盖该_parameters函数还会禁用其他地方的补全环境变量(例如,键入$然后按 Tab)。要允许在其他地方补全环境变量,修补_parameters而不是覆盖它是一种可行的解决方案。以下是一个例子:

autoload +X _parameters # load it for patching latter
functions[_parameters]="
[[ \$curcontext = -command- ]] && return
$functions[_parameters]"

如果被调用的完成函数的上下文在程序名称中,则它会跳过处理环境变量$curcontext。需要对其进行转义才能进行扩展,$curcontext直到执行修补函数为止。

答案3

您需要隐藏命令位置中的参数,因此使用tag-order

zstyle ':completion:*:-command-:*' tag-order '!parameters'

!parameters部分表示在完成到位时隐藏参数-command-

!标签...

以感叹号开头的字符串指定不使用的标签名称。其效果与列出上下文中所有其他可能的标签相同。

相关内容