zsh 自动完成不存在的文件夹

zsh 自动完成不存在的文件夹

刚开始使用带有 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 文件中,以使其在会话之间持久。如果这有帮助,请告诉我。

相关内容