简单示例:
~ $ 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-
:
!标签...
以感叹号开头的字符串指定不使用的标签名称。其效果与列出上下文中所有其他可能的标签相同。