使 vim 显示 git 差异,颜色类似于 git 差异命令(红色删除,绿色添加)

Making vim show a git diff with colors like a git diff command (red-delete, green-add)

我运行git config --global alias.ci commit --verbose

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

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

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

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

如何使 vim 语法突出显示以红色显示删除的行并以绿色显示添加的行?

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

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

简短版本:编辑文件 ~/.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'] 的内容。然后转到一个添加的chunk,得到['gitcommitDiff', 'diffAdded'].

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

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

当提交消息在文件 .vim/filetype.vim:

中定义为 gitcommit 文件类型时,语法突出显示有效
autocmd BufNewFile,BufRead *.git/COMMIT_EDITMSG set ft=gitcommit

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

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