举个例子:
我是一个在mac上的bash v3.2.17,我使用的git安装通过macports与bash_completion变体。
当我输入git checkout m<tab>。例如,我把它完成了。
然而,我有一个别名git结帐,gco。当我输入gco m<tab>时,我没有得到自动完成的分支名称。
理想情况下,我想自动完成只是神奇地为我所有的别名工作。这可能吗?如果做不到这一点,我想为每个别名手动定制它。那么,我该怎么做呢?
举个例子:
我是一个在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
其他回答
在git-completion。Bash有一行:
complete -o default -o nospace -F _git git
查看这一行(和_git函数),你可以将这一行添加到你的.bash_profile:
complete -o default -o nospace -F _git_checkout gco
如果你使用别名g='git',我将这行代码添加到.bash_aliases中
complete -o default -o nospace -F _git g
这个问题有很多答案,就像我自己一样,我打赌很多读者都很困惑。对于我来说,我还需要让我的dotfile在多个平台上使用不同版本的Git。我也没有使用g=git的别名,而是将g定义为一个函数。
为了做到这一点,我必须把不同的答案拼凑成一个解决方案。虽然这重复了之前的答案,但我认为在我的船上的人可能会发现这个汇编很有用,就像我第一次遇到这个问题时一样。
这假设旧的和新的Git完成,Ubuntu默认,并在MacOS上brew安装Git。在后一种情况下,bash没有处理brew安装完成(稍后我将对此进行诊断)。
# Alias g to git
g() {
if [[ $# > 0 ]]; then
git "$@"
else
git status -sb
fi
}
# Preload git completion in Ubuntu which is normally lazy loaded but we need
# the __git_wrap__git_main function available for our completion.
if [[ -e /usr/share/bash-completion/completions/git ]]; then
source /usr/share/bash-completion/completions/git
elif [[ -e /usr/local/etc/bash_completion.d/git-completion.bash ]]; then
source /usr/local/etc/bash_completion.d/git-completion.bash
fi
if command_exists __git_complete; then
__git_complete g _git
elif command_exists __git_wrap__git_main; then
complete -o bashdefault -o default -o nospace -F __git_wrap__git_main g
fi
我知道这个问题是关于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文件中
我有一个别名g='git',结合我的git别名,我键入如下内容
$ g co <branchname>
对于我的特定用例,更简单的解决方法是在git-completion中添加一行代码。
就在这条线下面:
__git_complete git _git
我添加了这一行来处理我的单个'g'别名:
__git_complete g _git