举个例子:
我是一个在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>时,我没有得到自动完成的分支名称。
理想情况下,我想自动完成只是神奇地为我所有的别名工作。这可能吗?如果做不到这一点,我想为每个别名手动定制它。那么,我该怎么做呢?
当前回答
您可以将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也将照常工作。
其他回答
如果你使用别名g='git',我将这行代码添加到.bash_aliases中
complete -o default -o nospace -F _git g
您还可以尝试使用Git别名。例如,在我的~/。gitconfig文件,我有一个看起来像这样的部分:
[alias]
co = checkout
所以你可以输入git com <TAB>,这应该扩展到git co master,这是git checkout命令。
另一个选项是使用~/。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环境中。如果你找到了方法,请评论或编辑。
Felipe Contreras对Git补全功能(参见Git 2.30中的Zsh补全)非常积极,他提出(可能是Git 2.31, Q1 2021)一个公共函数将有助于别名自动补全。
他的建议:
Back in 2012 I argued for the introduction of a helper that would allow users to specify aliases like: git_complete gf git_fetch Back then there was pushback because there was no clear guideline for public functions (git_complete vs _git_complete vs _GIT_complete), and some aliases didn't actually work. Fast-forward to 2020 and there's still no guideline for public functions, and those aliases still don't work (even though I sent the fixes). This has not prevented people from using this function that is clearly needed to setup custom aliases (this page), and in fact it's the recommended way. But it is cumbersome that the user must type: __git_complete gf _git_fetch Or worse: __git_complete gk __gitk_main 8 years is more than enough time to stop waiting for the perfect to come; let's define a public function (with the same name) that is actually user-friendly: __git_complete gf git_fetch __git_complete gk gitk While also maintaining backwards compatibility. The logic is: If $2 exists, use it directly If not, check if __$2_main exists If not, check if _$2 exists If not, fail
在git-completion。Bash有一行:
complete -o default -o nospace -F _git git
查看这一行(和_git函数),你可以将这一行添加到你的.bash_profile:
complete -o default -o nospace -F _git_checkout gco