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

rmbxnbpk  于 2022-11-27  发布在  Git
关注(0)|答案(3)|浏览(134)

我有一个Git别名update,我想给它添加分支名补全。别名的定义如下:

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

(It用它的上游版本更新本地跟踪分支,而不必 checkout 分支。尽管对特定的问题并不真正重要。)
我想让这个命令用Tab键完成已有的分支名称,我知道我可以定义一个名为_git-update的函数来控制完成,但是我缺少一些东西来让它工作:

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

我正在使用brew install zsh-completions安装在OSX上的完成,这是https://github.com/zsh-users/zsh-completions的设置。
(This问题直接类似于https://stackoverflow.com/a/41307951/169947,但针对的是Zsh而不是Bash。)

c7rzv4ha

c7rzv4ha1#

可能有点先发制人,但这是工作:

# 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非常相似,但是它们 * 是一样的 * 吗?
bmvo0sr5

bmvo0sr52#

如果你想要和另一个已有的git子命令(补全系统知道的)一样的补全,最简单的方法是:

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

null命令(:)后跟git子命令(例如git branch),告诉git补全系统使用子命令中的补全来补全您的别名。
这个功能内置在git别名系统中,使用它意味着你不必担心shell的差异。

0lvr5msh

0lvr5msh3#

我使用这个函数将工作分支附加到PS1:

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

相关问题