我一直在考虑切换到zsh和prezto已有一段时间了,但是我想先解决一些麻烦。
这些最大的事实是,'cd'的标签完成似乎以某种方式搞砸了。例如,我的git项目在我的主目录中有一个名为“git”的目录,我经常想从主目录移动到它,也就是说,我写这个:
~ >>> cd g[TAB]
~ >>> cd git
由于“git”是唯一以“g”开头的文件夹,我显然希望这是标签完成的结果。但是,使用ZSH和prezto,它会像这样完成它:
~ >>> cd g[TAB]
~ >>> cd gnats
再次使用tab也会尝试将子文件夹完成为“gnats”,两者都不存在!
到目前为止,我已经发现这很可能是由prezto引起的,因为禁用它会恢复到预期的行为。
任何想法我必须添加什么配置来解决这个问题?
答案 0 :(得分:2)
最可能的罪魁祸首是shell选项CDABLE_VARS
。您可以检查它是否设置为setopt | grep cdablevars
。由于它不是默认设置,您可以在 prezto 中找到它所在的位置,或者在 prezto 之后使用setopt nocdablevars
显式取消它。
如果设置了CDABLE_VARS
,则 zsh 会处理cd
不是目录的参数,并且不会以/
开头,就像它们以{{1}开头一样}}。这延伸到~
的自动完成。
如果目录名称以cd
开头(如~
暗示的那样), zsh 会检查是否可以替换第一个CDABLE_VARS
的元素以几种不同的方式。在您的情况下,/
被解释为静态命名目录,可以通过以下方式定义:
~gnats
是用户某人的主目录。将shell参数设置为以~someone
开头的字符串值:
/
使用% SOMEWHERE=/some/directory
% print ~SOMEWHERE
/some/directory
:hash -d
我猜想在这种情况下,它是用户 gnats 的主目录。据我所知,似乎至少在Debian和Ubuntu上创建了它。