zsh - 我如何总是忽略 ZSH 完成中的模式?
问题描述
在空目录中使用以下内容:
$ zsh -d -f -i
% autoload -Uz compinit && compinit
% zstyle ':completion:*:*:cd:*:*' ignored-patterns foo
% mkdir foo
% mkdir bar
% mkdir zsh
- 当我输入时,
cd <TAB>
我得到一个只有bar
和的菜单zsh
。这很棒。 - 当我删除
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
。在这种情况下有没有办法不完成?
解决方案
这种行为的原因
zsh 补全系统有多个补全功能。这些是通过以下方式启用的:
zstyle ':completion:*' completer <list of completers>
其默认值为_complete _ignored
(参见)。
这意味着尝试第一个常规完成,如果它没有产生完成,_ignored
则尝试使用特殊完成器。_ignored
完成者会忽略您定义的样式ignored-patterns
,因此会找到foo
匹配项。
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
推荐阅读
- bash - 如何使用 powershell 将 sha256 哈希输出作为二进制数据而不是十六进制数据?
- google-cloud-platform - 如何使用特定服务帐户在 Dataproc 集群上提交作业?
- json - 从 SQL Server 中的 JSON 获取键名
- javascript - 我正在尝试通过 IsFormDisplayed 函数切换我的布尔值
- python - 启用 Eager Execution 时,Tensor.graph 毫无意义
- unity3d - Unity Build (Win10) 崩溃 - 访问冲突 (0xc0000005)
- cocoa - 绑定 NSPopupButton 的选定标识符
- memory-management - 为什么大 Foreach 循环越来越慢?
- java - 如何解决有关 Maven 的构建错误?
- javascript - 如何将 Dropzone.js 与 ASP.NET Core MVC 集成?