zsh:使用 Git 命令完成功能的 Tab 补全

JJD*_*JJD 6 zsh git autocomplete function

在 zsh 中,我使用以下函数通过一个命令删除本地和远程分支

gpDo () {
    git branch -d "$1" && git push --delete origin "$1"
}
Run Code Online (Sandbox Code Playgroud)

目前,Git 分支的自动完成功能不起作用。我必须手动输入整个分支名称。我怎样才能让选项卡完成工作为这样的功能?

Gil*_*il' 6

我假设您正在使用由 启用的\xe2\x80\x9cnew\xe2\x80\x9d 完成系统compinit。如果您正在使用 oh-my-zsh,那就是。

\n\n

您需要告诉 zsh 使用 git 分支名称gpDo。Git 已经提供了一种完成分支名称的方法。从 zsh 5.0.7 开始,这是这个功能__git_branch_names,但这不是一个稳定的接口,因此它可能在其他版本中发生变化。要使用此功能,请将这一行放入您的.zshrc

\n\n
compdef __git_branch_names gpDo\n
Run Code Online (Sandbox Code Playgroud)\n\n

使用此声明,gpDo仅当您在命令行上完成某项操作git至少一次后,完成后才会起作用。这是由于 zsh 中函数自动加载的一个怪癖造成的。或者,_git 2>/dev/null在你的; 中运行.zshrc:这会导致错误,因为在无效上下文中调用完成函数,但该错误是无害的,并且加载和相关函数(包括 __git_branch_names` )的副作用_git仍然存在。

\n\n

或者,定义您自己的 git 分支完成函数。快速而肮脏的方法:

\n\n
_JJD_git_branch_names () {\n  compadd "${(@)${(f)$(git branch -a)}#??}"\n}\n
Run Code Online (Sandbox Code Playgroud)\n