实现zsh别名的自动完成功能

时间:2014-07-25 02:23:52

标签: bash zsh bash-completion oh-my-zsh zsh-completion

我正在使用令人敬畏的zsh框架oh-my-zsh。每天我点击gc这是git commit的别名我点击了<Tab><Tab>,它给了我正确的提交文件。我真的很想知道它是如何实现的,所以我可以实现我自己的想法,使用别名导航到子目录。

我的意思是使用此别名~/workspace/a-repo导航到-w a<Tab><Tab>,该别名完成到a-repo,并向我提供一些建议,这些建议是~/workspace内的文件夹。我已经创建了这个别名,但我需要知道如何为它添加正确的自动完成/建议。

这是我的别名:

-w() { cd ~/workspace/"$*" }

1 个答案:

答案 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
  • 通过定义一个字符串shell参数来隐式定义它,其值以/开头(这也意味着您不能使用~作为主目录的快捷方式)
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