我正在使用令人敬畏的zsh框架oh-my-zsh。每天我点击gc
这是git commit
的别名我点击了<Tab><Tab>
,它给了我正确的提交文件。我真的很想知道它是如何实现的,所以我可以实现我自己的想法,使用别名导航到子目录。
我的意思是使用此别名~/workspace/a-repo
导航到-w a<Tab><Tab>
,该别名完成到a-repo
,并向我提供一些建议,这些建议是~/workspace
内的文件夹。我已经创建了这个别名,但我需要知道如何为它添加正确的自动完成/建议。
这是我的别名:
-w() { cd ~/workspace/"$*" }
答案 0 :(得分:3)
对于gc
(我假设在 oh-my-zsh 的git插件中定义为alias gc='git commit -v'
),zsh
内部替换了别名(gc
)与实际命令(git commit -v
)在寻找完成尝试之前。这适用于每个别名(除非设置了shell选项COMPLETE_ALIASES
,这将允许为别名设置单独的完成)。
至于你想做什么:看到-w
实际上是一个函数而不是别名,你确实必须编写自己的完成。但是有一个更简单的方法:静态命名目录。
命名目录通常只是系统上用户的主目录。对于当前用户的主目录,最常见的可能是~
。其他用户目录名为~USERNAME
。您还可以定义自己的静态命名目录。有两种方法可以做到这一点:
hash -d
显式定义名称,类似于别名:hash -d w=~/workspace
/
开头(这也意味着您不能使用~
作为主目录的快捷方式)w="${HOME}/workspace"
在这两种情况下,您现在都可以使用~w
来引用您的工作区,在第二种情况下,您也可以使用$w
(例如,在引用的字符串中使用)。输入cd ~w/a-repo
即可转到~/workspace/a-repo
。 Tab-completion的工作方式与任何其他路径一样,因此按~w/a<Tab>
将显示~w/a-repo
完成。
此外,如果您设置shell选项AUTO_CD(setopt AUTO_CD
),则只需键入路径(或目录名称)即可切换到目录,而无需cd
。
% w="/tmp"
% cd ~w
% pwd
/tmp
% mkdir 1 2 3
% setopt AUTO_CD
% ~w/<TAB>
1 2 3
% ~w/1
% pwd
/tmp/1