Zsh自动完成建议完成的功能(_git _vim等)


9

我对如何zsh为我的命令做完整的建议感到烦恼。

如果键入未安装的命令的开头,然后按tab该命令,则会提示已安装的完成功能。

可以说我要执行vim但没有安装_vim

有没有办法关闭此功能?还是我的设置做错了什么?

我所有的点文件都在公开github.com/henrikbjorn/castle


我以前已经看到过这种行为,但是在我当前的设置中似乎不存在。可悲的是,我不知道我的哪个设置改变了这种行为。
Customizer

Answers:


8

默认情况下,zsh的完成引擎仅尝试将某些内容附加到您键入的内容上。您将其配置为尝试添加前缀。简单的交互式完成配置引擎(compinstall)在“匹配控制→子字符串完成”下提供了此功能。这样会在您的中插入一行.zshrc

zstyle ':completion:*' matcher-list '' 'l:|=* r:|=*'

zstyle内置集(主要)完成设置。在matcher-list完成风格的方式相继尝试列表,停车时至少有一个匹配。空字符串表示默认完成(仅后缀)。该匹配控制咒语l:|=* r:|=*手段尝试前缀匹配*和后缀匹配*,即任何前缀和后缀。

您可以禁止以开头的前缀_。这仍然允许以开头的单词的完成_,以及通过添加前缀来完成的前缀,但是前缀不能以开头_

zstyle ':completion:*' matcher-list '' 'l:|=[^_]* r:|=*'

这适用于所有补全,而不仅仅是命令名的补全。我不知道如何将其限制为命令名称。

应该有一种方法可以更精确地排除以开头的命令名_,但是我不知道如何。首先是ignored-patterns完成风格。

zstyle ':completion:*:*:-command-:*:*' ignored-patterns '_*'       

这不包括以_; 开头的匹配;但是,如果没有匹配项,则zsh会在没有忽略规则的情况下再次尝试。这样做的好处是,如果命令首先以下划线开头,那么它将在第二遍完成。糟糕的是,如果没有匹配项,zsh将因此尝试尝试添加下划线,因此,如果有viview但没有,vim则按Tabafter vi将提供viview但没有_vim,但如果您键入,vim则完成将提供_vim


感谢似乎通过执行您指定的解决方案之一而工作,我也学到了很多有关其工作方式的知识。
HenrikBjørnskov2014年

2
ignore-patterns即使没有匹配项,解决方案对我来说也很好。只需确保其中completer不包含_ignored
阿达芬2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.