我正在尝试修改 zsh 完成及其菜单的行为。我被困住了,我读了太多文档,这让我头晕目眩。
以下仅为示例;我更喜欢不特定于 的答案cd
。
我将 zsh 设置为仅在完成明确时才显示选择菜单 ( zstyle ':completion:*:*:*:*:*' menu select=2
)。
我有一个别名alias cd='nocorrect cd'
。当我这样做时cd<TAB>
(没有空格),zsh 认为它是明确的,并完成别名。 zsh 认为它是明确的——事实上,当我这样做时cd<^D>
,它只显示一种可能的完成。在我看来,它应该显示其他完成选项,例如cdiff
.事实上,当我这样做时cd<^Xn>
,我会看到其他选择。这也是在ZSH 用户指南,第 6.5.2 节。
我好像明白发生了什么事。我将完成者设置为zstyle ':completion:*' completer _expand _expand_alias _complete _ignored _match _correct _approximate _prefix
,所以我可以理解为什么它认为扩展该别名是首要任务。我只是不明白为什么会这样仅有的选项。
我认为这与 相关tag-order
,就像用户指南中的第二个示例一样第6.4.2节。但是,我没有为此上下文 ( :completion::complete:-command-::
) 设置类似的内容,也没有它可能继承的任何其他内容。
我所有与完成相关的设置都在这个文件在Github上。从那里向上,您可以看到我的 zsh 配置的完整内容;但是,我没有:completion:
在此文件之外设置任何内容,包括在我的 中.zshrc
,所以我怀疑是否有任何内容覆盖它。
那么,有人可以向我解释一下该怎么做才能得到我想要的行为吗?
仅供参考,我将 zsh 与 Prezto 框架一起使用,我认为这是无关紧要的,因为问题完全与内置 zsh 功能和模块有关。
一些输出:
cd<TAB>
:只是更改cd
为nocorrect cd
,没有菜单。
$ cd<^D>
-- alias --
nocorrect cd
$ cd<^Xn>
-- external command --
cdbs-edit-patch cd-fix-profile cdiff
cd-create-profile cd-iccdump
-- builtin command --
cd
-- shell function --
cdls
-- alias --
cd
-- parameter --
CDPATH cdpath
答案1
@Ilua的回答没有用,但它确实给了我一些关于搜索内容的想法,并且我解决了问题。
我需要的风格是regular
.从man zshcompsys
:
regular
This style is used by the _expand_alias completer and bindable command.
If set to ‘true’ (the default), regular aliases will be expanded but only in command position.
If it is set to ‘false’, regular aliases will never be expanded.
If it is set to ‘always’, regular aliases will be expanded even if not in command position.
我用过zstyle ':completion:*' regular 'false'
,效果很好。
答案2
我认为您正在寻找accept-exact
想要将其设置为 false 的样式。
男子 zshcompsys
accept-exact
This is tested for the default tag in addition to the tags valid for the current context. If it is set to `true' and any of the trial matches is the same as the string on the command line, this match will immediately
be accepted (even if it would otherwise be considered ambiguous).