使 vim 显示带有颜色的 git diff,例如 git diff 命令(red-delete,green-add)

Posted

技术标签:

【中文标题】使 vim 显示带有颜色的 git diff,例如 git diff 命令(red-delete,green-add)【英文标题】:Making vim show a git diff with colors like a git diff command (red-delete, green-add) 【发布时间】:2015-07-26 16:13:03 【问题描述】:

我跑了git config --global alias.ci commit --verbose

这使得运行git ci 就像运行git commit --verbose 一样

--verbose 标志在提交消息模板中显示了一个差异,它没有被注释,因此语法突出显示对其起作用,但被自动识别为实际上并未提交到存储库的日志中。当然,可以很长,但对于创建更好的提交 cmets 很有用。 (而且,如果你不需要它,你可以忽略它。)

无论如何,如果我运行git diff,删除的行(以“-”开头)为红色,添加的行(以“+”开头)为绿色。

如果我运行git ci,vim 语法会突出显示被删除为常规颜色(白色)的行,以及被添加为青色的行。

如何让 vim 语法高亮显示已删除的行以红色显示,添加的行以绿色显示?

vim 状态行显示它正在编辑文件“~/code.git/.git/COMMIT_EDITMSG”。我对 vim 语法高亮不太了解,但我知道它是可配置的。我不确定这种情况如何配置,因为我假设 vim 使用文件扩展名来决定要遵循哪些语法突出显示规则(我可能会离开这里)并且 git 没有给这个文件一个扩展名。

编辑:实际上,vim 必须检测到这是一个 git 提交文件,因为它的语法将前 50 个字符突出显示为黄色。假设这是为了表明什么可以很好地适合补丁的电子邮件主题行。

【问题讨论】:

当我运行git diff 时,-/+ 不是红色/绿色。这就是我要找的东西:git config --global color.ui auto。设置好配置后,git diff现在和giit diff --color一样 【参考方案1】:

简短版:编辑一个文件~/.vim/after/syntax/gitcommit.vim,并添加如下内容:

hi diffAdded   ctermfg=green
hi diffRemoved ctermfg=red

更长的版本,解释我是如何到达那里的:

编辑提交消息时,运行:set ft。这将显示 Git 提交文件的文件类型为 gitcommit。因此,要修改提交消息的突出显示,您需要编辑文件syntax/gitcommit.vim,并且由于您希望您的更改覆盖正常突出显示,您需要将其放在after/ 目录中。因此~/.vim/after/syntax/gitcommit.vim

现在,找出要更改的内容。有一段非常有用的代码,是我从某个地方(从 tpope,IIRC)获得的,之后我一直在愉快地使用它:

nmap <C-S-P> :call <SID>SynStack()<CR>
function! <SID>SynStack()
  if !exists("*synstack")
    return
  endif   
  echo map(synstack(line('.'), col('.')), 'synIDattr(v:val, "name")')
endfunc

这样,打开一个详细提交,转到已删除的块,然后按 Ctrl-Shift-P。它将显示类似['gitcommitDiff', 'diffRemoved'] 的内容。然后转到添加的块,并获取['gitcommitDiff', 'diffAdded']

查看/usr/share/vim/vim74/syntax/gitcommit.vim 会显示正在发生的事情:syntax/gitcommit.vim 包括syntax/diff.vim,这是diff 的标准突出显示文件。因此上面的模式。

查看/usr/share/vim/vim74/syntax/diff.vim 的末尾,您会发现可能需要更改的其他模式。

【讨论】:

:set filetype=gitcommit 在编辑 .git/rebase-apply/patch 时帮了我大忙,由于某种原因,它似乎没有被自动识别为 gitcommit【参考方案2】:

当提交消息在文件 .vim/filetype.vim 中定义为 gitcommit 文件类型时,语法突出显示有效:

autocmd BufNewFile,BufRead *.git/COMMIT_EDITMSG set ft=gitcommit

【讨论】:

【参考方案3】:

与接受的答案相同,但我发现一些不同的颜色对对比有用:

hi diffAdded cterm=bold ctermfg=DarkGreen
hi diffRemoved cterm=bold ctermfg=DarkRed

hi diffFile cterm=NONE ctermfg=DarkBlue
hi gitcommitDiff cterm=NONE ctermfg=DarkBlue
hi diffIndexLine cterm=NONE ctermfg=DarkBlue
hi diffLine cterm=NONE ctermfg=DarkBlue

【讨论】:

以上是关于使 vim 显示带有颜色的 git diff,例如 git diff 命令(red-delete,green-add)的主要内容,如果未能解决你的问题,请参考以下文章

当我在vim中填写git commit消息时,如何在文件列表中显示不同的颜色

将“git difftool”传递给寻呼机时如何保持颜色

Linux学习笔记(十七) vim

git命令行的颜色配置

如何让 diff 像 git-diff 一样工作?

vim diff 使用