【问题标题】:Git completion for alias as if for Git itself别名的 Git 补全就像 Git 本身一样
【发布时间】:2021-06-27 15:15:57
【问题描述】:

背景

我已经成功地为各种 Git 别名配置了 Bash 补全。例如:

$ git config alias.subject
!git --no-pager show --quiet --pretty='%s'
$ function _git_subject() { _git_show; }
$ git subject my<TAB>
$ git subject my-branch

挑战

但是,我有一个 Git 别名,我不知道如何为其设置 Bash 补全。问题是我希望别名像顶级 Git 命令本身一样完成。别名是这样的:

$ git config alias.alias
alias = !"f() { if [[ \"$#\" != 1 ]]; then >&2 echo \"Usage: git alias COMMAND\"; return 1; fi; git config alias.\"$1\"; }; f"
# Example
$ git alias s
status

我尝试过使用_git、__git_main 和__git_wrap__git_main,但它们都不起作用(我认为它会导致无限循环,因为它在我按下 Tab 后永远不会返回)。

有没有办法为 Git 别名添加完成,就像它是顶级 Git 命令一样完成?或者具体来说如何完成这个别名?

试过了还是不行

function _git_alias() { _git; }
function _git_alias() { __git_main; }
function _git_alias() { __git_wrap__git_main; }

期望的行为

$ git alias su<TAB>
subject     submodule
$ git alias sub

或者,如果有一种简单的方法可以只完成别名也很酷。不过,出于好奇,我也想知道如何像顶级 Git 命令一样完成。

【问题讨论】:

    标签: bash git bash-completion git-alias


    【解决方案1】:

    我终于能够围绕“神奇的”Bash 完成变量创建一个可行的解决方案。我将这些变量更改为“假装”我们正在完成给定的命令,就像给定的 git 本身一样。

    如果有人有任何简化这一点的建议,我完全愿意接受建议。

    # This is complex because we want to delegate to the completion for Git
    # itself without ending up with an infinite loop (which happens if you try
    # to just delegate to _git).
    _git_alias() {
        if [[ "$COMP_CWORD" -lt 2 ]]; then
            return
        fi
        local old_comp_line_length new_comp_line_length
        COMP_WORDS=(git "${COMP_WORDS[@]:2}")
        ((COMP_CWORD -= 1))
        old_comp_line_length=${#COMP_LINE}
        if [[ "$COMP_LINE" =~ ^[^[:blank:]]+[[:blank:]]+[^[:blank:]]+[[:blank:]]+(.*)$ ]]; then
            COMP_LINE="git ${BASH_REMATCH[1]}"
        fi
        new_comp_line_length=${#COMP_LINE}
        (( COMP_POINT += new_comp_line_length - old_comp_line_length ))
    
        _git "$@"
    
        # git alias blah
        #            ^
        # 01234567890123
        # 0         1
        # point:  11
        # length: 13
        #
        # git blah
        #      ^
        # 01234567
        # point:  5
        # length: 7
        #
        # point = point - (old length) + (new length)
        # point = 11 - 13 + 7
        # point = -2 + 7
        # point = 5
    }
    

    【讨论】:

      猜你喜欢
      • 2012-07-13
      • 2019-12-11
      • 2013-05-04
      • 1970-01-01
      • 2011-07-06
      • 2011-08-05
      • 1970-01-01
      • 2015-11-08
      • 1970-01-01
      相关资源
      最近更新 更多