10

我有一个 Git 别名update,我想为它配备分支名称完成功能。别名定义如下:

[alias]
        update = "!f() { git push . origin/$1:$1; }; f"

(它使用其上游版本更新本地跟踪分支,而无需签出分支。不过,对于特定问题并不重要。)

我希望该命令对其$1参数的现有分支名称进行制表符补全。我知道我可以定义一个调用_git-update来控制完成的函数,但我缺少一些让它工作的部分:

_git-update ()
{
  ***some-function-here*** "$(__git_branch_names)"
}

我正在使用安装在 OS X 上的补brew install zsh-completions全,它是在https://github.com/zsh-users/zsh-completions上设置的。

(这个问题直接类似于https://stackoverflow.com/a/41307951/169947,但适用于 Zsh 而不是 Bash。)

4

2 回答 2

4

可能有点先发制人,但这是有效的:

# provides completion options similar to git branch/rebase/log
_complete_like_git_branch() {
  __gitcomp_nl_append "FETCH_HEAD"
  __gitcomp_nl_append "HEAD"
  __gitcomp_nl_append "ORIG_HEAD"
  __gitcomp_nl_append "$(__git_heads)"
  __gitcomp_nl_append "$(__git_remote_heads)"
  __gitcomp_nl_append "$(__git_tags)"
  __gitcomp_nl_append "$(__git_complete_refs)"
}

_git_rebase_chain() { _complete_like_git_branch }

# my git "bang" alias of git log
_git_lgk() { _complete_like_git_branch }

参考:contrib/completion/git-completion.bash

可能的改进:

  • 以上规范正确吗?即在?中使用全局shell 函数~/.zshrc
  • 选项与 git rebase 和 git log 超级相似,但它们是一样的吗?
于 2021-04-15T07:23:25.693 回答
0

我使用此功能将工作分支附加到我的 PS1:

    parse_git_branch() {
        git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/(\1)/'
    }

于 2021-04-22T04:13:30.880 回答