自定义别名的Zsh完成-Git分支名称

时间:2018-11-12 21:25:05

标签: git zsh tab-completion zsh-completion

我有一个Git别名update,我想为其配备分支名称补全。别名的定义如下:

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

(它会使用上游版本更新本地跟踪分支,而不必检出该分支。不过,对于特定问题而言,它并不重要。)

我希望该命令为其参数$1用制表符填写现有的分支名称。我知道我可以定义一个名为_git-update的函数来控制完成,但是我缺少一些功能来使它起作用:

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

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

(此问题与https://stackoverflow.com/a/41307951/169947直接相似,但对于Zsh而不是Bash。)

2 个答案:

答案 0 :(得分: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

可能的改进:

  • 上述规范是否正确?即在 ~/.zshrc 中使用全局 shell 函数?
  • 选择与 git rebase 和 git log 非常相似,但它们相同吗?

答案 1 :(得分:0)

我使用此函数将工作分支附加到我的 PS1:

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