举个例子:

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

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

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

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


当前回答

这个问题有很多答案,就像我自己一样,我打赌很多读者都很困惑。对于我来说,我还需要让我的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

其他回答

您可以将Tab绑定到alias-expand-line并在~/.inputrc中完成(它的默认动作)。要做到这一点,你首先需要将每个动作绑定到一个键,然后将它们链接在一起:

"\M-z":alias-expand-line
"\M-x":complete
TAB:"\M-z\M-x"

你可以使用任何你喜欢的组合键,我使用元键,因为它是免费的。更多信息见男子3阅读线。

现在,如果你打开一个新终端,输入别名:

gco m<TAB>

线路将被改造成

git checkout master

当然,即使不涉及别名,Tab也将照常工作。

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

$ 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”。

如上面的评论所述,

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

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

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