为什么 zsh (oh-my-zsh) 完成不存在的目录?

asg*_*eo1 7 osx subversion zsh autocomplete oh-my-zsh

更新 3我已经发现这些烦人的自动完成选项实际上是usernames。即它们存在于/etc/passwd我有用户,例如 _kadmin_admin 和 _kadmin_changepw 以及许多其他以下划线开头的用户中。这可能特定于 OSX。

当 Oh-my-zsh 找不到任何其他匹配项时,它会自动补全这些用户名。我尝试将这些用户名添加到 中的“不要完成无趣的用户”列表中~/.oh-my-zsh/lib/completion.zsh,但这没有用。我不确定为什么?

有没有办法阻止 oh-my-zsh 自动完成用户名?


我对 ZSH 或 oh-my-zsh 中的一些奇怪行为感到沮丧。我不确定是哪个原因造成的。

自动完成似乎正在搜索一些我不想要的奇怪目录。它们似乎是一些 SVN 目录,我对此一无所知,也不知道为什么它们会在路径中。(我什至不使用SVN)

这种行为似乎只有在当前目录中没有其他匹配项时才会发生 - 然后它必须查看我不知道的其他路径。

例子:

注意:我的主目录中没有匹配的内容 mi

?  ~  cd mi<tab>
?  ~  cd _kadmin
Run Code Online (Sandbox Code Playgroud)

也就是说,它变成mi_kadmin。我不知道为什么它与该目录匹配。

如果我尝试实际更改到该目录,无论如何我都会收到错误消息(因为它不是完整的目录名称):

?  ~  cd _kadmin
cd:cd:10: no such file or directory: _kadmin
Run Code Online (Sandbox Code Playgroud)

如果我一直按<tab>,它将匹配完整的目录名称:

?  ~  cd mi<tab><tab><tab>
?  ~  cd kadmin_admin
?  ~_svn
?  ~_svn pwd
/var/empty
Run Code Online (Sandbox Code Playgroud)

我不知道那里发生了什么。我不知道 kadmin_admin 是什么。为什么当我改变它时,为什么我现在会得到一个目录名称~_svn,然后如果我PWD显示/var/empty

这是我的路径:

/Users/asgeo1/.rvm/gems/ruby-1.9.3-p194/bin:/Users/asgeo1/.rvm/gems/ruby-1.9.3-p194@global/bin:/Users/asgeo1/.rvm/rubies/ruby-1.9.3-p194/bin:/Users/asgeo1/.rvm/bin:/usr/local/php54/bin:/Users/asgeo1/Projects/dotfiles/bin:/Applications/Postgres.app/Contents/MacOS/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/X11/bin
Run Code Online (Sandbox Code Playgroud)

那里没有什么明显的,我可以看到。

请有人对此有所了解。这让我很沮丧!

编辑:似乎有人之前有过类似的问题: 停止选项卡完成建议“消息总线” 虽然那里没有答案:(

更新:这是 oh-my-zsh 应用的 cd 函数:

?  ~  which cd
cd () {
    if [[ "x$*" = "x..." ]]
    then
            cd ../..
    elif [[ "x$*" = "x...." ]]
    then
            cd ../../..
    elif [[ "x$*" = "x....." ]]
    then
        cd ../../..
    elif [[ "x$*" = "x......" ]]
    then
            cd ../../../..
    else
            builtin cd "$@"
    fi
}
Run Code Online (Sandbox Code Playgroud)

D_B*_*Bye 5

_kadmin可能是该kadmin工具的完整功能- 而不是目录。如果您尝试完成zsh无法作为命令、目录或有效且已知的命令参数完成的内容,它将开始提供完成功能作为可能的扩展候选。默认情况下,zsh它带有许多完成程序,其中许多您可能不需要——有 AIX、BSD、Cygwin、各种 Linux 发行版等的捆绑包,它们都被读取并安装到 shell 中。如果您尝试对zsh找不到的东西进行扩展,它会为您提供所有已安装的完成功能。

您可以zsh通过将其放入以下内容来配置不提供完整功能~/.zshrc

zstyle ':completion:*:functions' ignored-patterns '_*'
Run Code Online (Sandbox Code Playgroud)

重新加载文件,您将不再为您尚未安装的工具提供补全功能。查看zshcompsys联机帮助页以了解(更多)详细信息。

编辑 回复更新 3

如果_kadmin实际上是一个用户帐户,您可以配置zsh为在完成时不提供它。似乎该方法是列出您希望 shell 考虑的用户帐户,这将任何名称限制为仅提供给列出的用户帐户。该zstyle行是这样的:

zstyle ':completion:*' users asgeo1 root
Run Code Online (Sandbox Code Playgroud)

我认为您可以在users标签后列出任意数量的用户。然后 shell 将只提供这些用户的主目录作为cd函数或内置函数的可能完成。

我不知道为什么将用户名添加到文件中的忽略模式completion.zsh不起作用 - 您在进行更改后是否重新加载了配置?