Bash完成:在别名完成中荣誉资源库特定的Git别名

说bash配置了以下别名:

alias up =“git –git-dir /path/to/backup/.git”

而那个特定的仓库 – 只有那个仓库 – 有下面的git别名:

[alias]
backup = commit --allow-empty-message

如何可以自动完成备份?

这会自动完成备份,但不会完成:

cd /a/different/dir
git --git-dir=/path/to/backup/.git ba

这自动完成与标准git命令,但不备份:

complete -o bashdefault -o default -o nospace -F __git_wrap__git_main up

编辑:Etan是对的,完成函数需要看到展开的别名,所以我创建了以下:

CompletableAlias() {
    if (($#<2)); then
        return 1
    fi
    source_c="$1"
    target_c="$2"
    target_a=( "${@:2}" )
    target_s="${target_a[*]}"
    alias "${source_c}=${target_s}"
    completion_modifier="__${source_c}_completion"
    completion_original="$( complete -p "$target_c" 2>/dev/null |
                            sed 's/.*-F\W\+\(\w\+\).*/\1/'
                          )"
    if [[ -n "$completion_original" ]]; then
        read -r -d '' completion_function <<-EOF
        function $completion_modifier() {
            COMP_LINE="\${COMP_LINE/#${source_c}/${target_s}}"
            ((COMP_POINT+=${#target_s}-${#source_c}))
            ((COMP_CWORD+=${#target_a[@]}-1))
            COMP_WORDS=( ${target_a[@]} \${COMP_WORDS[@]:1} )
            $completion_original
        }
EOF
        eval "$completion_function"
        completion_command="$( complete -p "$target_c" |
                               sed "s/${completion_original}/${completion_modifier}/;
                                    s/\w\+\$/${source_c}/"
                             )"
        $completion_command
    fi
}


source "/usr/share/bash-completion/completions/git"

CompletableAlias "up" "git" "--git-dir" "/path/to/backup/.git"

但有不可思议的问题:

> up bac< Tab>不工作
> up< Tab>使用默认完成,不列出git子命令
>和更多…

编辑2:更新脚本以修复上述问题使用在Re: Bash completion of aliased commands的建议。显然这是一个很常见的任务。但现在我遇到这个错误消息:

$ cd /a/different/dir
$ up backup<Tab> fatal: Not a git repository (or any of the parent directories): .git
你不应该在这种复杂的情况下真正使用别名,使用bash functions.别名更像是C中的预处理器(在使用意义上),当函数更像…代码函数。我发现他们也更“自动完成”。

你也可以看看这个问题是如何解决在其他shell,如fish

http://stackoverflow.com/questions/29954852/bash-completion-honor-repository-specific-git-alias-in-alias-completion

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:Bash完成:在别名完成中荣誉资源库特定的Git别名