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

set*_*eth 4 zsh

刚开始将 zsh 与 oh-my-zsh 一起使用,当使用cd.

假设我有一个文件夹:

my_folder/
    subfolder/
    another_subfolder/
    file.txt
Run Code Online (Sandbox Code Playgroud)

当我使用 bash 时,我可以输入:

$ cd p<tab>
Run Code Online (Sandbox Code Playgroud)

什么也不会发生,因为没有任何东西以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))
Run Code Online (Sandbox Code Playgroud)

Lar*_*old 6

我不确定您是否仍在跟踪这个问题,但我想提供帮助。我已经有一段时间没有深入研究 zsh 的完成系统的内容了,所以这将是一个很好的借口。

现在,我们将使用此答案作为我的持续工具,以提供有用的花絮来帮助您(和我)解决问题。

可以看出,zsh 的补全系统非常强大。有时,它会完成您不想完成的项目。例如,您几乎总是希望将 'cd' 命令的参数限制为目录。然而,在 zsh 中,这些可能是文件系统目录、命名目录、各种路径变量中的目录,甚至是存储在标准 shell 变量中的目录。所以,我认为第一步是确定你完成的“上下文”。

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

cd p<CTRL-X>h
Run Code Online (Sandbox Code Playgroud)

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

tags in context :completion::complete:cd::
    local-directories  (_alternative _cd (eval))
Run Code Online (Sandbox Code Playgroud)

要注意的关键项目是“本地目录”。我们在这里没有看到的是一个常见的项目“路径目录”,它指的是可以在 $cdpath 中找到的目录,也可能是其他位置。(我一时想不起来了。)

如果您看到除“local-directories”之外的项目,这将暗示此流氓“代理”条目可能来自何处。例如,如果我尝试从命令行开头而不输入任何内容,我的 zsh 设置将尝试完成的项目类型如下:

commands builtins functions aliases suffix-aliases reserved-words jobs parameters  
Run Code Online (Sandbox Code Playgroud)

您确实可能会在 CTRL-Xh 输出中看到这些项目中的一个或多个,甚至是我上面没有列出的项目。(这些只是例子)

这是一种您可以帮助限制 zsh 仅提供本地目录和 $cdpath 目录作为完成选项的方法:

zstyle ':completion:*:cd:*' tag-order local-directories path-directories
Run Code Online (Sandbox Code Playgroud)

如果您不想要 zsh 提供的一些中等有用的 cd 魔法,请从末尾删除“路径目录”,我相信您会得到想要的行为。您需要将其放入您的 .zshrc 文件中,以使其在会话中保持不变。如果这有帮助,请告诉我。