如何使用 zsh compinit 启用 git 文件选项卡完成?

Posted

技术标签:

【中文标题】如何使用 zsh compinit 启用 git 文件选项卡完成?【英文标题】:How to enable git file tab completion with zsh compinit? 【发布时间】:2010-12-11 04:51:41 【问题描述】:

zsh tab 补全有问题:运行后:

autoload -U compinit
compinit

文件的 Git 选项卡完成不再起作用。例如,如果我键入 git add my_f 来完成 my_file,则什么也不会发生。 zsh git 补全似乎只适用于 git 分支和标签。

没有 compinit 的东西,git 文件完成工作,但我当然错过了所有花哨的分支完成的东西。

那么...有没有办法在 zsh 中同时完成 git 文件完成和 git 分支完成?这对我真的很有帮助。

【问题讨论】:

在我的 .zshrc 中,我有 'autoload -U compinit' 然后 'compinit' 在单独的行上,并且完成对我来说很好。您是在运行单个命令,还是格式让我感到困惑? git add 之后完成文件也适用于我 (zsh 4.3.10-dev-1)。一件令人惊讶的事情是,它仅在完成git add 时提供未跟踪和已跟踪但已修改的文件(这没关系,因为这些是您唯一需要添加的内容)。对于git diff,它提供所有跟踪的文件和所有分支。 @Chris Johnsen:你说得对,它确实适用于适合当前 git 命令的文件,例如 git add 中未跟踪的文件。我尝试完成而没有注意这一点。所以非常感谢! 如果你在一个 git rebase 进程中并且想要解决冲突 git add 不提供你想要使用的文件。 【参考方案1】:

(我在这里添加一个答案主要是为了将其从未回答的列表中删除。)

从 cmets 中可以看出,它确实有效。我相信整个 zsh 的情况最近也有了显着改善:

提交 06f44c3cc5ca5eca638f300a518c65aa98d26d6d

日期:2010 年 9 月 6 日星期一 08:33:19 -0400

完成:与zsh兼容

修改 git-completion.bash 使其在使用 bashcompinit 时也可以与 zsh 一起使用。 ...

所以,如果您遇到这个谷歌搜索,并且您的完成不起作用,请尝试升级您的 git-completion.bash(链接指向来自 git.git HEAD 的 blob)。当前的 git 版本是 1.7.3.2;它应该进入下一个。

【讨论】:

虽然最近有一些工作使 git.git 的 contrib/git-completion.bash 可以通过 zsh 下的 bashcompinit 使用,典型的 zsh 安装更有可能使用 zsh 自带的 git 补全:Completion/Unix/Command/_git. 我不知道它是什么时候改变的,但我刚刚检查了一下,我的完成在 Zsh 下的 Git 上运行得非常好。 (我已经习惯了它失败了,以至于我认为我已经多年没有尝试过使用它了。)我在 Git 1.8.3.4 上,因为它值得【参考方案2】:

请注意,在 Git 2.30(2021 年第一季度)中,zsh 的命令行完成说明(在 contrib/ 中)已更新。

参见Alexey (ogonkov)commit 3ebd945(2020 年 7 月 2 日)。(由 Junio C Hamano -- gitster -- 合并于 commit bbdbe08,2020 年 11 月 2 日)

completion:修复zsh安装说明

签字人:Alexey审核人:Stefan Haller

修复完成配置中的错误脚本。 zsh 在这里想要 bash 完成路径,而不是自身的路径。 添加compinit自动加载命令,因为如果不加载,整个事情就不起作用了。

所以命令是:

# The recommended way to install this script is to make a copy of it in
# ~/.zsh/ directory as ~/.zsh/git-completion.zsh and then add the following
# to your ~/.zshrc file:
#
#  fpath=(~/.zsh $fpath)
#  autoload -Uz compinit && compinit

警告:在 Git 2.30(2021 年第一季度)中,Zsh 自动完成功能(contrib/)已被修补,正如其作者“Felipe Contreras”所提到的in here。

见commit af806a2,commit 441ecda,commit 8030684,commit 5a364d2,commit 35a4170,commit bbd7f45,commit 2769e56,commit 9d76052,commit 9a397ea,commit cf6ce01,commit 5d64fb2,@987654338 @,commit 35e29fb,commit ecaf798,commit 2f459b0,commit 94b2901,commit a7804a1,commit 3791968,commit aa1f1f8,commit 162f1a5,commit bed6356,commit 81f717b,commit 81f717b,commit 81f717b,@9876 2020 年 10 月 27 日)和commit 44b37ab、commit cb9dcbd、commit 2c7cdc5、commit 5eb25bc、commit 4ce2b51(2020 年 10 月 24 日)Felipe Contreras (felipec)。(由Junio C Hamano -- gitster -- 在@98765435 中合并@,2020 年 11 月 9 日)

completion: bash: 移除 zsh 包装器

签字人:Felipe Contreras

它已经被弃用了八年多,它从来没有更新过,而且维护起来很麻烦。

是时候继续前进了。


在 Git 2.30(2021 年第一季度)中,有一个针对最近损坏的修补程序。

参见commit 0764964(2020 年 12 月 5 日)和 commit c5dd0c8(2020 年 11 月 30 日)Felipe Contreras (felipec)。(由 Junio C Hamano -- gitster -- 合并到 commit 7d92da3,2020 年 12 月 8 日) sup>抄送:SZEDER Gábor签字人:Felipe Contreras签字人:Junio C Hamano

completion: bash: 修复 gitk 别名回归

很久以前,在引入 _git_complete 助手时,_gitk__gitk_main 替换,并且指向 __git_wrap_main_gitk 的向后兼容占位符被保留。

当调用“__git_complete gitk __gitk_main”时,创建了__git_wrap__gitk_main 助手,它基本上就是“__git_func_wrap __gitk_main”加上complete 选项。

不幸的是,commit b0a4b2d257(“completion:添加对向后兼容性的支持”,2012-05-19,Git v1.7.11-rc0 -- merge)错过了对 _gitk 的调用的先前实例在_git_gitk

所以,基本上我们有__git_wrap__git_main -> __git_func_wrap __git_main -> __git_complete_command gitk -> _git_gitk -> _gitk -> __git_wrap__gitk_main -> __git_func_wrap __gitk_main -> __gitk_main

从来没有必要打电话给__git_func_wrap 两次。 由于_git_gitk总是在包装器内部调用,所以它可以直接调用__gitk_main

然后,在commit 441ecdab37 ("completion: bash: remove old compat wrappers", 2020-10-27, Git v2.30.0 -- merge 在batch #4 中列出) _gitk 被删除,这会触发以下错误:

_git_gitk:9: command not found: _gitk  

让我们调用正确的函数:__gitk_main。


使用 Git 2.34(2021 年第四季度),更新到 tcsh 的命令行补全(在 contrib/ 中)。

参见Takashi Iwai (tiwai) 的commit ff7b83f(2021 年 8 月 18 日)。(由 Junio C Hamano -- gitster -- 合并于 commit 4c3bddb,2021 年 9 月 3 日)

completiontcsh:通过删除包装函数来修复回归。

签字人:岩井隆史

在 bash 补全中清理旧的兼容包装器导致 tcsh 补全仍然使用它们。 让我们更新 tcsh 调用站点以解决它。

修复:441ecda (completion: bash: remove old compat wrappers, 2020-10-27, Git v2.30.0-rc0 -- merge 在batch #4 中列出) ("completion: bash: remove旧的兼容包装器")

【讨论】:

以上是关于如何使用 zsh compinit 启用 git 文件选项卡完成?的主要内容,如果未能解决你的问题,请参考以下文章

zsh compinit: insecure files, run compaudit for list.

mac 每次启动终端都会提示 zsh compinit: insecure directories and files, run compaudit for list.Ignore insecure

oh my zsh 如何启用插件

如何在“oh my zsh”中运行“nvm”?

配置oh-my-zsh

vim + oh-my-zsh + git搭建开发环境