1

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

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

这是我的别名:

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

1 回答 1

3

在这种情况下(我假设它在oh-my-zsh的 git 插件中gc定义)在内部用实际命令( )替换别名( ),然后再寻找完成。这适用于每个别名(除非设置了 shell 选项,这将允许为别名设置单独的完成)。alias gc='git commit -v'zshgcgit commit -vCOMPLETE_ALIASES

至于你想要做什么:看到-w它实际上是一个函数而不是别名,你确实必须编写自己的完成。但是有一个更简单的方法来解决它:静态命名目录

命名目录通常只是系统上用户的主目录。最常见的可能~是当前用户的主目录。其他用户目录命名为~USERNAME. 您还可以定义自己的静态命名目录。有两种方法可以做到这一点:

  • 用于hash -d显式定义名称,类似于别名:
哈希 -dw=~/workspace
  • 通过定义一个字符串 shell 参数来隐式定义它,该参数的值以 an 开头/(这也意味着您不能用~作主目录的快捷方式)
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
于 2014-07-25T09:53:08.857 回答