刚开始使用带有 oh-my-zsh 的 zsh,我注意到使用 自动完成时有些奇怪cd
。
假设我有一个文件夹:
my_folder/
subfolder/
another_subfolder/
file.txt
当我使用 bash 时,我可以输入:
$ cd p<tab>
并且什么也不会发生,因为 中没有任何东西my_folder
以 开头p
,但如果我在 zsh 中执行同样的事情,它会自动完成到单词proxy
,我假设它是文件系统中其他地方的某个目录?
我不确定是否有什么设置错误,或者这是 zsh 中自动完成功能的工作方式方面的问题,我对此并不理解。
编辑:
CTRL+Xh 的输出:
tags in context :completion::complete:cd::
local-directories named-directories (_alternative _cd (eval))
users named-directories directory-stack (_tilde _alternative _cd (eval))
users (_users _tilde _alternative _cd (eval))
答案1
我不确定你是否还在关注这个问题,但我愿意提供帮助。我已经有一段时间没有深入研究 zsh 的完成系统了,所以这是一个很好的借口。
现在,我们将使用这个答案作为一个持续的工具,为我提供有用的信息来帮助您(和我)解决问题。
正如您所看到的,zsh 的完成系统非常强大。有时,它会完成您不想完成的项目。例如,您几乎总是希望将“cd”命令的参数限制为目录。然而,在 zsh 中,这些可能是文件系统目录、命名目录、各种路径变量中的目录,甚至是存储在标准 shell 变量中的目录。所以,我认为第一步是确定完成的“上下文”。
请进入上面的 my_folder 目录,然后输入:
cd p<CTRL-X>h
CTRL-Xh 是显示当前上下文以进行完成的默认组合键。请告诉我此组合键的输出是什么。例如,我的输出如下所示:
tags in context :completion::complete:cd::
local-directories (_alternative _cd (eval))
需要注意的关键项是“本地目录”。我们在这里看不到的是常见项“路径目录”,它指的是可以在 $cdpath 中找到的目录,也可能是其他位置的目录。(我记不清了。)
如果您看到除“本地目录”之外的项目,这将提示这个恶意“代理”条目可能来自何处。例如,如果我尝试从命令行开头完成而不输入任何内容,则我的 zsh 设置将尝试完成以下类型的项目:
commands builtins functions aliases suffix-aliases reserved-words jobs parameters
您可能确实会在 CTRL-Xh 输出中看到其中一个或多个项目,甚至看到我上面未列出的项目。(这些只是示例)
这里有一种方法可以帮助限制 zsh 仅提供本地目录和 $cdpath 目录作为完成选项:
zstyle ':completion:*:cd:*' tag-order local-directories path-directories
如果您不想要 zsh 提供的一些中等有用的 cd 魔法,请从末尾删除“path-directories”,我相信您会得到想要的行为。您需要将其放入 .zshrc 文件中,以使其在会话之间持久。如果这有帮助,请告诉我。