对于那些了解 zsh 完成但不知道其所有功能的人来说,背景信息:zsh 的独特且真正有用的功能之一如下:
[/usr/dir1/dir2/dir3/]$ cd dir1 dirnew
/usr/dirnew/dir2/dir3
[/usr/dirnew/dir2/dir3]$
即,如果用户可以用另一个目录替换层次结构中的特定目录。这是一个非常方便的功能。(假设 dirnew 确实有 dir2/dir3)。如果 dirnew 没有 dir2/dir3,则此命令将失败。
但是,我不知道如何才能完成 cd,因为目录名很长。当我这样做时cd <TAB>
,除了当前目录中的目录之外,还应该显示当前层次结构中的目录。一旦我从层次结构中选择或输入其中一个目录,如果我<TAB>
再次按下,我应该从具有类似层次结构的父级目录中获得完成选项。在上面的例子中,假设 /usr/ 有 dirnew 和 diranother beisdes dir1。dirnew 有 dir2/dir3,但 diranother 是空的。
cd dir1 <TAB>
应该给我 new 作为选项,但没有 diranother。
答案1
要么你使用的是旧版本的 Zsh,要么你的配置破坏了它。Zsh 的cd
补全功能具有该功能,并且能够正常工作。你可以在不使用任何配置的情况下运行 zsh 来验证这一点:
zsh -f # all settings at their default values
autoload compinit && compinit
mkdir -p tmp/a/b
mkdir -p tmp/c/b
mkdir -p tmp/b
cd tmp/a/b
cd a [TAB]
我正在运行 Zsh 5.1,它正确地完成了c
。如果我创建第二个可能的完成,例如mkdir -p d/b
,它会给我c
和d
。