举个例子:

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

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

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

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


当前回答

您只需要找到完整的命令并复制具有别名的行即可。

我有别名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

其他回答

您还可以尝试使用Git别名。例如,在我的~/。gitconfig文件,我有一个看起来像这样的部分:

[alias]
        co = checkout

所以你可以输入git com <TAB>,这应该扩展到git co master,这是git checkout命令。

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

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

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

$ 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-alias项目(在Linux上),这是可能的。对Mac的支持是实验性的,但用户已经报告成功。

您可以将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也将照常工作。