举个例子:

我是一个在mac上的bash v3.2.17,我使用的git安装通过macports与bash_completion变体。

当我输入git checkout m<tab>。例如,我把它完成了。

然而,我有一个别名git结帐,gco。当我输入gco m<tab>时,我没有得到自动完成的分支名称。

理想情况下,我想自动完成只是神奇地为我所有的别名工作。这可能吗?如果做不到这一点,我想为每个别名手动定制它。那么,我该怎么做呢?


当前回答

我有一个别名g='git',结合我的git别名,我键入如下内容

$ g co <branchname>

对于我的特定用例,更简单的解决方法是在git-completion中添加一行代码。

就在这条线下面:

__git_complete git _git

我添加了这一行来处理我的单个'g'别名:

__git_complete g _git

其他回答

您还可以尝试使用Git别名。例如,在我的~/。gitconfig文件,我有一个看起来像这样的部分:

[alias]
        co = checkout

所以你可以输入git com <TAB>,这应该扩展到git co master,这是git checkout命令。

首先,查找原始的补全命令。例子:

$ complete | grep git

complete -o bashdefault -o default -o nospace -F __git_wrap__git_main git

现在将这些添加到你的启动脚本(例如~/.bashrc):

# copy the original statement, but replace the last command (git) with your alias (g)
complete -o bashdefault -o default -o nospace -F __git_wrap__git_main g

# load dynamically loaded completion functions (may not be required)
_completion_loader git

可能不需要_completion_loader行。但是对于某些情况,补全函数只在您第一次键入命令并按下TAB之后才会动态加载。因此,如果你没有使用原始命令,并尝试alias + TAB,你可能会得到一个错误,如“bash: completion: function '_docker' not found”。

在git-completion。Bash有一行:

complete -o default -o nospace -F _git git

查看这一行(和_git函数),你可以将这一行添加到你的.bash_profile:

complete -o default -o nospace -F _git_checkout gco

另一个选项是使用~/。bash_completion文件。要创建git checkout的gco别名,只需输入以下内容:

_xfunc git __git_complete gco _git_checkout

然后在~/。Bashrc你只需要输入别名本身:

alias gco='git checkout'

两行。就是这样。

解释:

~/bash_completion在主bash_completion脚本的末尾被引用。在gentoo中,我在/usr/share/bash-completion/bash_completion中找到了主脚本。

_xfunc git位负责为您获取git完成文件,因此您不需要在~/.bashrc中放入任何其他内容。

接受的答案要求您复制.git- complete .sh并从~/中获取它。bashrc文件,我发现蹩脚。


PS:我仍在努力弄清楚如何不将整个git-completion脚本源到我的bash环境中。如果你找到了方法,请评论或编辑。

理想情况下,我想自动完成只是神奇地为我所有的别名工作。这可能吗?

是的,对于complete-alias项目(在Linux上),这是可能的。对Mac的支持是实验性的,但用户已经报告成功。