如何始终忽略 ZSH 补全中的模式?

Seb*_*ask 5 zsh

在空目录中包含以下内容:

$ zsh -d -f -i

% autoload -Uz compinit && compinit
% zstyle ':completion:*:*:cd:*:*' ignored-patterns foo
% mkdir foo
% mkdir bar
% mkdir zsh
Run Code Online (Sandbox Code Playgroud)
  • 当我打字时,我得到一个只有和 的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
Run Code Online (Sandbox Code Playgroud)

并且打字cd <Tab>仍然完成foo。在这种情况下有没有办法不完成?

mih*_*ihi 3

造成此行为的原因

\n

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

\n
zstyle \':completion:*\' completer <list of completers>\n
Run Code Online (Sandbox Code Playgroud)\n

该值的默认值为_complete _ignored请参阅)。

\n

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

\n

来自zsh 文档_ignored

\n
\n

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

\n
\n

一个办法

\n

_ignored从完成者列表中删除。

\n

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

\n
zstyle \':completion:*\' completer _complete\n
Run Code Online (Sandbox Code Playgroud)\n

一种解决方案

\n

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

\n
\n

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

\n
\n

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

\n

附录

\n

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

\n

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

\n
zstyle \':completion:*:*:ls:*:*\' file-patterns \'^foo|^**/foo:directories\'\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n