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

刚开始使用zsh和oh-my-zsh,当用cd自动完成时,我发现了一些奇怪的东西。

假设我有一个文件夹:

 my_folder/ subfolder/ another_subfolder/ file.txt 

当我使用bash时,我可以input:

 $ 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)) 

我不确定你是否还在跟踪这个问题,但我想帮忙。 我已经深入了解了zsh完成系统的内涵,所以这将是一个很好的借口。

现在,我们将使用这个答案作为一个持续的工具,为我提供有用的技巧来帮助您(和我)解决问题。

正如你所看到的,zsh的完成系统是非常强大的。 有时候,它完成了你不想完成的项目。 例如,你几乎总是想把参数限制在“cd”命令中作为目录。 然而,在zsh中,这些可能是文件系统目录,命名目录,各种pathvariables中的目录,甚至是存储在标准shellvariables中的目录。 所以,我认为第一步是确定完成的“背景”。

请进入上面的my_folder目录,然后键入:

 cd p<CTRL-X>h 

CTRL-Xh是显示当前上下文完成的默认组合键。 请让我知道这个组合的输出是什么。 例如,我的输出如下所示:

 tags in context :completion::complete:cd:: local-directories (_alternative _cd (eval)) 

关键的项目是“本地目录”。 我们在这里没有看到的是一个常见的项目“path-directories”,它指的是可以在$ cdpath中find的目录,也可能是其他位置。 (我不记得了。)

如果你看到“本地目录”以外的项目,这将暗示这个无赖的“代理”条目可能来自哪里。 例如,下面是我的zsh设置将尝试完成的项目types,如果我尝试从命令行开头完成而不input任何内容:

 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目录',我相信你会得到你想要的行为。 你会想把它放到你的.zshrc文件中,使它在会话中保持一致。 让我知道这是否有帮助。