举个例子:
我是一个在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',结合我的git别名,我键入如下内容
$ g co <branchname>
对于我的特定用例,更简单的解决方法是在git-completion中添加一行代码。
就在这条线下面:
__git_complete git _git
我添加了这一行来处理我的单个'g'别名:
__git_complete g _git
其他回答
如果你使用别名g='git',我将这行代码添加到.bash_aliases中
complete -o default -o nospace -F _git g
您只需要找到完整的命令并复制具有别名的行即可。
我有别名d-m=“码头机”。d-m是docker-machine的别名。
所以在Mac上(通过brew),补全文件在cd ' brew——prefix ' /etc/bash_completion.d/。 对于我的案例,我编辑了名为docker-machine的文件。 在最下面是:
complete -F _docker_machine docker-machine
所以我添加了另一行,用我的别名:
complete -F _docker_machine docker-machine
complete -F _docker_machine d-m
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
我有一个别名g='git',结合我的git别名,我键入如下内容
$ g co <branchname>
对于我的特定用例,更简单的解决方法是在git-completion中添加一行代码。
就在这条线下面:
__git_complete git _git
我添加了这一行来处理我的单个'g'别名:
__git_complete g _git
这个论坛页面展示了一个解决方案。
把这些行放到你的.bashrc或.bash_profile中:
# Author.: Ole J
# Date...: 23.03.2008
# License: Whatever
# Wraps a completion function
# make-completion-wrapper <actual completion function> <name of new func.>
# <command name> <list supplied arguments>
# eg.
# alias agi='apt-get install'
# make-completion-wrapper _apt_get _apt_get_install apt-get install
# defines a function called _apt_get_install (that's $2) that will complete
# the 'agi' alias. (complete -F _apt_get_install agi)
#
function make-completion-wrapper () {
local function_name="$2"
local arg_count=$(($#-3))
local comp_function_name="$1"
shift 2
local function="
function $function_name {
((COMP_CWORD+=$arg_count))
COMP_WORDS=( "$@" \${COMP_WORDS[@]:1} )
"$comp_function_name"
return 0
}"
eval "$function"
}
# and now the commands that are specific to this SO question
alias gco='git checkout'
# we create a _git_checkout_mine function that will do the completion for "gco"
# using the completion function "_git"
make-completion-wrapper _git _git_checkout_mine git checkout
# we tell bash to actually use _git_checkout_mine to complete "gco"
complete -o bashdefault -o default -o nospace -F _git_checkout_mine gco
这个解决方案类似于balshetzer的脚本,但只有这个对我有效。(巴尔谢策的脚本对我的一些别名有问题。)