Zsh 自动完成提示完整功能(_git _vim 等)

Hen*_*kov 9 zsh autocomplete

我对如何zsh为我的命令提供完整的建议感到有些烦恼。

如果我输入一个我没有安装的命令的开头并按下tab它会提示安装的完成功能。

假设我想执行vim但未安装它会建议_vim.

有没有办法关闭它?或者我在设置中做错了什么?

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

Gil*_*il' 8

默认情况下,zsh 的完成引擎只会尝试在您输入的内容后附加一些内容。您将其配置为也尝试添加前缀。简单的交互式完成配置引擎 ( compinstall) 在“匹配控制?子串完成”。这会在您的.zshrc:

zstyle ':completion:*' matcher-list '' 'l:|=* r:|=*'
Run Code Online (Sandbox Code Playgroud)

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

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

zstyle ':completion:*' matcher-list '' 'l:|=[^_]* r:|=*'
Run Code Online (Sandbox Code Playgroud)

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

应该有一种方法可以更精确地排除以 开头的命令名称_,但我不知道如何。第一个开始是ignored-patterns完成样式。

zstyle ':completion:*:*:-command-:*:*' ignored-patterns '_*'       
Run Code Online (Sandbox Code Playgroud)

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

  • 使用 `ignore-patterns` 的解决方案对我来说很好用,即使没有匹配项。只需要确保 `completer` 不包含 `_ignored`。 (2认同)