ZSH + Prezto:CD标签完成问题

时间:2014-11-23 10:47:43

标签: zsh cd tab-completion prezto

我一直在考虑切换到zsh和prezto已有一段时间了,但是我想先解决一些麻烦。

这些最大的事实是,'cd'的标签完成似乎以某种方式搞砸了。例如,我的git项目在我的主目录中有一个名为“git”的目录,我经常想从主目录移动到它,也就是说,我写这个:

~ >>> cd g[TAB]
~ >>> cd git

由于“git”是唯一以“g”开头的文件夹,我显然希望这是标签完成的结果。但是,使用ZSH和prezto,它会像这样完成它:

~ >>> cd g[TAB]
~ >>> cd gnats

再次使用tab也会尝试将子文件夹完成为“gnats”,两者都不存在!

到目前为止,我已经发现这很可能是由prezto引起的,因为禁用它会恢复到预期的行为。

任何想法我必须添加什么配置来解决这个问题?

1 个答案:

答案 0 :(得分:2)

最可能的罪魁祸首是shell选项CDABLE_VARS。您可以检查它是否设置为setopt | grep cdablevars。由于它不是默认设置,您可以在 prezto 中找到它所在的位置,或者在 prezto 之后使用setopt nocdablevars显式取消它。

说明:

如果设置了CDABLE_VARS,则 zsh 会处理cd不是目录的参数,并且不会以/开头,就像它们以{{1}开头一样}}。这延伸到~的自动完成。

如果目录名称以cd开头(如~暗示的那样), zsh 会检查是否可以替换第一个CDABLE_VARS的元素以几种不同的方式。在您的情况下,/被解释为静态命名目录,可以通过以下方式定义:

  1. 自动显示主目录:~gnats是用户某人的主目录。
  2. 将shell参数设置为以~someone开头的字符串值:

    /
  3. 使用% SOMEWHERE=/some/directory % print ~SOMEWHERE /some/directory hash -d

  4. 我猜想在这种情况下,它是用户 gnats 的主目录。据我所知,似乎至少在Debian和Ubuntu上创建了它。