假设我有一个文件夹:
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))
解决方法
目前,我们将使用此答案作为持续工具,为我提供有用的花絮,以帮助您(和我)解决问题.
正如您所知,zsh的完成系统非常强大.有时,它会完成您不想完成的项目.例如,您几乎总是希望将’cd’命令的参数限制为目录.但是,在zsh中,这些可能是文件系统目录,命名目录,各种路径变量中的目录,甚至是存储在标准shell变量中的目录.所以,我认为第一步是确定完成的“背景”.
请cd进入上面的my_folder目录,然后键入:
cd p<CTRL-X>h
CTRL-Xh是显示当前上下文以完成的默认键组合.请让我知道这个关键组合的输出是什么.例如,我的输出看起来像这样:
tags in context :completion::complete:cd:: local-directories (_alternative _cd (eval))
要注意的关键项是“local-directories”.我们在这里看不到的是一个常见的项目’path-directories’,它指的是可以在$cdpath中找到的目录,也可能是其他位置. (我不记得了.)
如果您看到“local-directories”以外的项目,那么这将暗示这个流氓“代理”条目可能来自哪里.例如,如果我尝试从命令行的开头尝试完成而不键入任何内容,则以下是我的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文件中,以使其在会话中保持不变.如果这有帮助,请告诉我.