我如何总是忽略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文档很难理解,感谢您理解它!可能是一个完成之前被忽略的完成的完成符。但是,是的,文档确实需要相当长的时间才能理解。