【问题标题】:Implementing autocompletion to zsh aliases实现 zsh 别名的自动补全
【发布时间】:2014-09-16 19:08:36
【问题描述】:
我正在使用很棒的 zsh 框架 oh-my-zsh。每天我都点击gc 这是git commit 的别名我点击<Tab><Tab> 它给了我正确的文件提交。我真的很想知道它是如何实现的,所以我可以实现自己的想法,即使用别名导航到子目录。
我的意思是使用这个别名-w a<Tab><Tab> 导航到~/workspace/a-repo,它完成到a-repo,并给了我一些建议,它们是~/workspace 中的文件夹。我已经创建了这个别名,但我需要知道如何为其添加正确的自动完成/建议。
这是我的别名:
-w() { cd ~/workspace/"$*" }
【问题讨论】:
标签:
bash
zsh
bash-completion
oh-my-zsh
zsh-completion
【解决方案1】:
对于gc(我假设在oh-my-zsh的git插件中定义为alias gc='git commit -v')zsh在内部替换别名(gc)在寻找尝试完成之前使用实际命令(git commit -v)。这适用于每个别名(除非设置了 shell 选项 COMPLETE_ALIASES,这将允许为别名设置单独的完成)。
至于你想要做什么:看到-w 实际上是一个函数而不是别名,你确实必须编写自己的完成。但是有一个更简单的方法来解决它:静态命名目录。
命名目录通常只是系统上用户的主目录。最常见的可能是~,表示当前用户的主目录。其他用户目录命名为~USERNAME。您还可以定义自己的静态命名目录。有两种方法可以做到这一点:
哈希 -d w=~/workspace
- 通过定义一个字符串 shell 参数来隐式定义它,该参数的值以
/ 开头(这也意味着您不能使用 ~ 作为主目录的快捷方式)
w="${HOME}/工作区"
在这两种情况下,您现在都可以使用~w 来引用您的工作区,在第二种情况下,您也可以使用$w(例如用于引用的字符串)。输入cd ~w/a-repo 将带您到~/workspace/a-repo。制表符补全的工作方式与任何其他路径一样,因此按~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