首页 > 解决方案 > 我如何总是忽略 ZSH 完成中的模式?

问题描述

在空目录中使用以下内容:

$ zsh -d -f -i

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

有没有办法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。在这种情况下有没有办法不完成?

标签: zsh

解决方案


这种行为的原因

zsh 补全系统有多个补全功能。这些是通过以下方式启用的:

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

其默认值为_complete _ignored参见)。

这意味着尝试第一个常规完成,如果它没有产生完成,_ignored则尝试使用特殊完成器。_ignored完成者会忽略您定义的样式ignored-patterns,因此会找到foo匹配项。

zsh 文档中_ignored

ignored-patterns样式可以设置为与可能的完成进行比较的模式列表;匹配的被删除。使用此完成器,可以恢复这些匹配,就好像没有ignored-patterns设置任何样式一样。[...]single-ignored样式也可如上所述。

一个解法

_ignored从完成者列表中删除。

您可以通过 显示当前列表zstyle -L '*' completer。如果这是空的,它仍然是默认值,您可以_ignored通过以下方式禁用:

zstyle ':completion:*' completer _complete

一种解决方案

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

_ignored当只有一个匹配时,完成者使用它。如果其值为 '<code>show',则将显示单个匹配项但不插入。如果值为 '<code>menu',则将单个匹配项和原始字符串都添加为匹配项并启动菜单完成,以便轻松选择其中任何一个。

因此,如果您将其设置为show(或menu)(通过zstyle ':completion:*' single-ignored show),则它不会立即完成,只会显示在选项卡完成菜单中。这意味着您可以忽略它并继续输入。

附录

(据我所知)不可能只为cd(比如 with zstyle ':completion:*:*:cd:*:*' completer ...)禁用完成程序,因为它们是在完成过程的一开始就确定的。

还有一种方法可以使用file-patterns样式^glob 模式忽略某些文件/目录模式,但该样式似乎没有与cd完成一起使用。但是,例如,ls这应该可以解决问题:

zstyle ':completion:*:*:ls:*:*' file-patterns '^foo|^**/foo:directories'

zsh 完成指南也是一个很好的资源:http: //zsh.sourceforge.net/Guide/zshguide06.html


推荐阅读