如何在ZSH自动补全中忽略特定模式?

5

在一个空目录下,执行以下操作:

$ zsh -d -f -i

% autoload -Uz compinit && compinit
% zstyle ':completion:*:*:cd:*:*' ignored-patterns foo
% mkdir foo
% mkdir bar
% mkdir zsh
  • 当我键入cd <TAB>时,会出现一个菜单,仅包含barzsh。这很好。
  • 当我移除zsh并进行cd <TAB>时,bar将被完成而不显示菜单。同样很棒。
  • 但是,当我也移除bar并进行cd <TAB>时,foo会被自动完成。我不希望看到这种情况发生。
  • 重新开始,但从父目录开始,并使用cd <TAB>来完成父目录,然后再次使用cd <TAB>,我会看到foo或者在所有三个情况下都会被自动完成。

有没有办法完全忽略foo,使它在当前目录和其他任何目录中均不可见,也不会被自动完成?

编辑:

我发现使用zstyle ':completion:*:*:cd:*:*' ignored-patterns '**/foo'可以解决在父目录中看到被忽略模式的问题,但是当没有其他选择时,被忽略的模式仍然会被自动完成。因此,使用以下代码:

$ zsh -d -f -i

% autoload -Uz compinit && compinit
% zstyle ':completion:*:*:cd:*:*' ignored-patterns '**/foo'
% mkdir foo

在输入 cd <Tab> 后,仍然会完成 foo。有没有一种方法可以不自动补全呢?

1个回答

3

这种行为的原因

zsh完成系统有多个补全函数。它们可以通过以下方式启用:

zstyle ':completion:*' completer <list of completers>

默认值为_complete _ignored ()。

这意味着首先尝试常规完成,如果未生成完成,则尝试特殊的_ignored补全器。 _ignored补全器会忽略您定义的ignored-patterns样式,因此可以找到foo匹配项。

来自zsh文档中关于_ignored的说明

ignored-patterns样式可以设置为与可能的补全进行比较的模式列表;匹配的模式将被删除。使用此补全器,这些匹配项可以被还原,就像没有设置ignored-patterns样式一样。[...]单个-ignored样式也可按上述方式使用。

解决方案

从补全器列表中删除_ignored

你可以通过 zstyle -L '*' completer 显示当前列表。 如果为空,则仍保持默认值,你可以通过以下方式禁用_ignored
zstyle ':completion:*' completer _complete

一种解决方案

来自于关于single-ignored的文档条目(在上面的引用中提到):

当只有一个匹配项时,_ignored 自动补全器会使用它。如果它的值为“show”,则单个匹配项将被显示但不会被插入。如果值为“menu”,则单个匹配项和原始字符串都将被添加为匹配项并启动菜单自动补全,使得可以轻松选择它们中的任意一个。

因此,如果您将其设置为 show(或 menu)(通过 zstyle ':completion:*' single-ignored show),那么它将不会立即被自动补全,而只会出现在选项卡补全菜单中。 这意味着您可以忽略它并继续输入。

附录

据我所知,似乎不可能仅针对cd禁用补全(例如使用zstyle ':completion:*:*:cd:*:*' completer ...),因为它们是在补全过程的最开始确定的。
还有一种方法可以使用file-patterns样式^通配符来忽略某些文件/目录模式,但该样式似乎不适用于cd补全。但例如,对于ls,这应该能起到作用:
zstyle ':completion:*:*:ls:*:*' file-patterns '^foo|^**/foo:directories'

有关自动补全的zsh指南也是一个很好的资源:http://zsh.sourceforge.net/Guide/zshguide06.html


太棒了,谢谢你。删除_ignored非常不符合直觉,因为它的名称。它听起来像是会遵守“ignored-patterns”,但实际上它会忽略它们。这就像双重否定。我也发现ZSH文档很难理解,感谢你让它变得更加清晰明了! - Sebastian Blask
也许是“一个补全器,还可以补全之前被忽略的补全项”。但是,文档确实需要花费相当长的时间来理解。 - mihi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接