如何使用 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 日)
completion
:tcsh
:通过删除包装函数来修复回归。签字人:岩井隆史
在 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