Zsh,带前缀的目录制表符补全

Zsh,带前缀的目录制表符补全

我有一个目录,里面放着我所有的项目,就拿它~/projects作为例子吧。我创建了一个名为的命令s,它接受一个参数,并将我移动到该目录。例如:s foo将我移动到~/projects/foo

我想要的是某种完成命令,它的作用就像cd我可以继续点击tab以进一步进入~/projects/...目录。

基本上,cd前缀始终存在。

我已经研究过 zstyle 补全man zshcompsys,但意识到我对它了解不够,无法正确理解它。

答案1

以下是一个例子我自己的.zshrc我保留为复制/粘贴片段:

# Try using the below template to set up zsh functions that act
# as aliases to cd and allow you to get autocomplete nicely.

project() { cd /path/to/project/$1; }
compctl -W /path/to/project/ -/ project

只需编辑/path/to/project上面两行的部分就可以了。

答案2

实现类似效果的另一种方法是定义目录的别名:

setopt auto_cd
alias -d s=~/projects

键入~s/ Tab以更改为的子目录;您也可以在命令参数中~/projects使用。~s

答案3

您可以直接向命名目录哈希表添加条目:

hash -d s="${HOME}/projects"

现在您可以简单地使用~s来引用您的目录,并且可以在cd命令中使用 Tab 补全:cd ~s/Tab

如果您有 zsh 的autocd选项集,则可以省略cd

答案4

您可以修改CDPATH

export CDPATH="$CDPATH:$HOME/Repositories:$HOME/Repositories/jc/Projects"

现在,您可以从每个其他目录访问指定目录内的所有子目录,就好像它们是当前目录的子目录一样:

➜  ~ /tmp
➜  /tmp pwd
/tmp
➜  /tmp MyAwesomeProject 
~/Repositories/jc/Projects/MyAwesomeProject
➜  MyAwesomeProject git:(master) pwd
/Users/rafael/Repositories/jc/Projects/MyAwesomeProject
➜  MyAwesomeProject git:(master)

相关内容