刚开始使用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文件中,使它在会话中保持一致。 让我知道这是否有帮助。