Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我如何总是忽略ZSH补全中的模式?_Zsh - Fatal编程技术网

我如何总是忽略ZSH补全中的模式?

我如何总是忽略ZSH补全中的模式?,zsh,Zsh,在空目录中包含以下内容: $ zsh -d -f -i % autoload -Uz compinit && compinit % zstyle ':completion:*:*:cd:*:*' ignored-patterns foo % mkdir foo % mkdir bar % mkdir zsh 当我键入cd时,我得到一个菜单,其中只有bar和zsh。这太棒了。 当我取出zsh并制作cd时,该栏将完成,而不显示菜单。也很好。 但是,当我删除酒吧以及我做的cd,fo

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

$ zsh -d -f -i

% autoload -Uz compinit && compinit
% zstyle ':completion:*:*:cd:*:*' ignored-patterns foo
% mkdir foo
% mkdir bar
% mkdir zsh
当我键入cd时,我得到一个菜单,其中只有bar和zsh。这太棒了。 当我取出zsh并制作cd时,该栏将完成,而不显示菜单。也很好。 但是,当我删除酒吧以及我做的cd,foo完成。我不想那样。 再次开始,但从父目录和doing cd来完成父目录,然后是cd我看到了foo或完成了这三种情况。 有没有一种方法可以完全忽略foo,这样我就不会看到它,也不会在同一个目录和任何其他目录中完成它

编辑:

我发现使用zstyle::completion:::::::::::'忽略的模式'**/foo'从父目录中查看被忽略的模式的问题消失了,但是当没有其他选择时,被忽略的模式仍然完成。因此:

$ zsh -d -f -i

% autoload -Uz compinit && compinit
% zstyle ':completion:*:*:cd:*:*' ignored-patterns '**/foo'
% mkdir foo
键入cd仍然可以完成foo。在这种情况下,有没有办法不完成?

这种行为的原因 zsh完井系统具有多个完井器功能。这些功能通过以下方式启用:

zstyle”:完成:“*”完成符 此操作的默认值为“完成”\u忽略

这意味着将尝试第一次常规完成,如果它没有生成完成,则将尝试特殊的忽略完成符。_ignored completer会忽略您定义的忽略模式样式,因此会查找foo匹配项

从:

可以将忽略的模式样式设置为模式列表,并与可能的完成情况进行比较;匹配的将被删除。使用这个完成符,可以恢复这些匹配,就好像没有设置忽略的模式样式一样。[…]如上所述,也可以使用单一忽略样式

解决办法 从完成符列表中删除被忽略的

您可以通过zstyle-L'*'完成符显示当前列表。 如果为空,则仍为默认值,您可以通过以下方式禁用_ignored:

zstyle':完成:“‘完成者_complete” 一种解决办法 根据上述引文中提到的:

当只有一个匹配项时_ignoredcompleter将使用此选项。如果其值为“show”,则将显示单个匹配项,但不会插入。如果值为“menu”,则单个匹配项和原始字符串都将作为匹配项添加,并启动菜单完成,以便轻松选择其中一个

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

附录 据我所知,不可能仅对cd禁用一个完成符,比如zstyle::completion:*:cd:**“completer…”,因为它们是在完成过程的一开始就确定的

还有一种方法可以使用和^glob模式忽略某些文件/目录模式,但该样式似乎不适用于cd完成。但是,例如,对于ls,这应该可以做到:

zstyle':完成:::::::::'文件模式'^foo |^**/foo:目录' zsh完工指南也是所有这些方面的良好资源:

太好了,谢谢你。因为它的名字,删除被忽略的是超级违反直觉的。听起来它会尊重被忽略的模式,但实际上它忽略了它们。这就像双重否定。我还发现ZSH文档很难理解,感谢您理解它!可能是一个完成之前被忽略的完成的完成符。但是,是的,文档确实需要相当长的时间才能理解。