举个例子:

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

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

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

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


当前回答

如果你使用别名g='git',我将这行代码添加到.bash_aliases中

complete -o default -o nospace -F _git g

其他回答

如上面的评论所述,

complete -o default -o nospace -F _git_checkout gco

将不再工作。然而,在git-completion中有一个__git_complete函数。Bash可以用来为别名设置补全,如下所示:

__git_complete gco _git_checkout

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

$ g co <branchname>

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

就在这条线下面:

__git_complete git _git

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

__git_complete g _git

我知道这个问题是关于bash的,但如果你使用zsh,这个改变@hesky-fisher回答将修复它。

From

# For each defined alias, extract the necessary elements and use them
# to call wrap_alias.
eval "$(alias -p | sed -e 's/alias \([^=][^=]*\)='\''\([^ ][^ ]*\) *\(.*\)'\''/wrap_alias \1 \2 '\''\3'\'' /')"

to:

# For each defined alias, extract the necessary elements and use them
# to call wrap_alias.
eval "$(alias | sd '^([^=]+)=(.+)' 'wrap_alias $1=$2')"

你需要sd(这可以用sed代替,但sd在我看来更好)

这样做是因为zsh没有别名-p,并且zsh中的别名输出不输出

alias <something>=<value>

就像在狂欢,但是

<something>=<value>

顺便说一下,我把初始化代码放在。zlogin文件中

在git-completion。Bash有一行:

complete -o default -o nospace -F _git git

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

complete -o default -o nospace -F _git_checkout gco

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

[alias]
        co = checkout

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