我有一个目录,里面放着我所有的项目,就拿它~/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)