举个例子:

我是一个在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

我知道这个问题是关于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文件中

另一个选项是使用~/。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环境中。如果你找到了方法,请评论或编辑。

这个论坛页面展示了一个解决方案。

把这些行放到你的.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的脚本,但只有这个对我有效。(巴尔谢策的脚本对我的一些别名有问题。)