vimdiff命令是Vim提供的文件差异比较工具,vimdiff的作用与打开Vim时增加启动参数 -d 完全一致,即 vimdiff file1 file2 等价于 vim -d file1 file2 。下文仅以vimdiff工具的使用为例讲解Vim针对文件差异比较提供的能力。

1. 启动Vim diff模式

默认情况下,vimdiff打开的窗口都是垂直分割的 (等价于启动Vim时使用了 -O 参数),如果想使用水平分割Vim窗口的方式显示文件的diff结果,可以使用 vimdiff -o file1 file2。关于Vim多窗口显示下的窗口切换等操作,可以参考Vim窗口分割方法

如果真正diff的某个文件进行了修改,vimdiff会自动重新比较文件参与,如果实时diff失败了,可以通过Vim命令行窗口 :diffupdate 来手工刷新比较结果。

如果已经打开了Vim,仍然可以通过Vim命令行命令 :diffsplit:diffthis:diffpatch 三个命令进入diff模式。

打开Vim的diff窗口后,可以使用 :qa 命令退出所有窗口,关于Vim的退出,推荐阅读14种退出Vim的方法及区别

2. vimdiff配色设置

默认情况下,被diff的两个文件中连续相同的多个行会被折叠起来,只在某一文件中存在的行以蓝色背显示,而在另一文件中的对应位置将显示绿色;两个文件中都存在但包含差异的行会以粉色背景显示,而引起差异的文字将用红色背景突出显示。

vimdiff配置

可以通过Vim命令行模式或在Vim配置文件中使用 :highlight 命令对vimdiff的各种配色进行个性化设置,例如,:highlight DiffAdd 可用来设置新增行的颜色,:highlight highlight DiffText 可用来设置具有差异的文件的颜色。

xterm 可支持显示 256 种颜色,能通过数字直接引用对应的颜色,例如,一个可用的个性化vimdiff配色方案如下:

1
2
3
4
5
6
7
8
" 新增的行 "
highlight DiffAdd ctermbg=235 ctermfg=108 guibg=#262626 guifg=#87af87 cterm=reverse gui=reverse
" 删除的行 "
highlight DiffDelete ctermbg=235 ctermfg=131 guibg=#262626 guifg=#af5f5f cterm=reverse gui=reverse
" 差异的行 "
highlight DiffChange ctermbg=235 ctermfg=103 guibg=#262626 guifg=#8787af cterm=reverse gui=reverse
" 差异的文字 "
highlight DiffText ctermbg=235 ctermfg=208 guibg=#262626 guifg=#ff8700 cterm=reverse gui=reverse

上述配置的显示效果如下图所示。

vimdiff颜色

3. 差异结果跳转

默认情况下,在某个窗口中移动光标时,对应的另一侧屏幕也会同步进行滚动。可以在Vim普通模式下使用 ]c 命令正向跳转到当前diff结果的下一个差异点,如果要反向跳转到上一个差异点,可以使用 [c 命令。

此外,如谈谈Vim中的操作符和动作命令一文所介绍,还可以在跳转命令前加上执行次数指示Vim 重复执行 相应次数的跳转命令,实现一次跳过多个差异点的效果。

例如,如果当前光标位于第 1 个差异点,普通模式下执行 2]c 命令后会直接跳过下一个差异点,将光标跳转到第 3* 个差异点处。

4. vimdiff折叠和展开

默认情况下,vimdiff会把不同之处上下各 6 行的文本显示出来以供参考。其他的相同文本行会被自动折叠。如果希望修改缺省的上下文行数,可以通过 diffopt=context 选项进行设置,例如,:set diffopt=context:10 将设置diff相同文本的上下文行数为10。

也可以用Vim折叠命令 zo 来展开被折叠的相同文本行,如果希望重新折叠相同的文本行,可以在Vim普通模式下使用 zc 命令进行折叠关闭操作。此外,不管是打开还是关闭Vim折叠,都可以使用 za 命令,推荐阅读Vim代码折叠

vimdiff折叠

5. 文件合并

大多数情况下,对文件进行diff操作后都会进行文件合并。针对当前光标所在差异点,如果希望把当前文件中的内容复制到另一个文件里,可以使用 dp 命令 (dp的含义是diff put)。

类似地,如果希望把另一个文件的内容复制到当前行中,可以使用 do 命令 (do的含义是 diff get,但由于 dg 已经作为Vim diff模式的设置选项 digraph 的缩写形式,所以使用diff obtain来表示)。

vimdiff-put-get

6. 在vimrc文件中个性化设置vimdiff

Vim的配置文件 .vimrc可以显式地针对Vim diff模式进行差异化设置,对应配置的基本结构如下:

1
2
3
4
5
6
if &diff
" vim diff 模式下的特殊配置 "
set nonu
else
....
endif

嗯,扫一扫就可以找到小女子我啦~