刚开始将 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)
我不确定您是否仍在跟踪这个问题,但我想提供帮助。我已经有一段时间没有深入研究 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 文件中,以使其在会话中保持不变。如果这有帮助,请告诉我。
归档时间: |
|
查看次数: |
726 次 |
最近记录: |