vimdiff 等同于 vim -d 命令,即 Vim 编辑器的 diff 模式。
该命令后面通常会接两个或多个文件名作为参数,这些文件会同时在 Vim 编辑器的分割窗口中打开,并高亮显示文件中内容有差异的部分。
同时该模式下还提供部分快捷按键用于完成文件内容的合并等操作。

启动 vimdiff

vimdiff 命令常用于编辑同一文件的不同历史版本,对各文件的内容进行比对与调整。如下面两个文件:

  1. $ cat file1
  2. Line one
  3. Line 2
  4. Line three
  5. Line 4
  6. Line 5
  7. Line 6
  1. $ cat file2
  2. Line 1
  3. Line 2
  4. Line 3
  5. Line 4
  6. Line 5
  7. Line 6
  8. Line 7
  9. Line 8

可以使用 vim -O2 file1 file2 命令,在左右排列的两个窗口中同时打开 file1 和 file2 两个文件,如下图所示:

vimdiff 命令使用介绍 - 图1

vim -O2 file1 file2

vimdiff file1 file2 命令会以同样的形式打开这两个文件,并且用不同的背景色高亮显示彼此间有差别的内容,如下图:

vimdiff 命令使用介绍 - 图2

vimdiff file1 file2

从上面的两幅截图中可以得出 vimdiff 标记差别内容时的几个规则:

  • 只在某一个文件中存在的行背景色设置为蓝色,而另一文件中的对应位置则被标记为绿色。(或者说,相对于另一个文件,当前文件中“多余”的行标记为蓝色,“缺少”的行则标记为绿色)
  • 两个文件中同时存在但是内容有差异的行,都标记为粉色,而引起差异的文字标记为红色

除了 vimdiff FILE_LEFT FILE_RIGHT 或者 vim -d FILE_LEFT FILE_RIGHT 的形式外,也可以通过在 Vim 中输入命令进入 diff 模式。

比如先进入 Vim 编辑 FILE_LEFT 文件(vim FILE_LEFT),再输入以下命令进入 diff 模式:
:vertical diffsplit FILE_RIGHT

比较16进制

vim查看2进制和16进制

光标移动

可以使用下列两种快捷键,在文件的各个差异点之间前后移动:

  • ], c:跳转到下个差异点
  • [, c:跳转到上个差异点

至于光标在两个窗口之前的切换,可以使用如下按键:

  • Ctrl-w, l:光标切换到右侧的窗口
  • Ctrl-w, h:光标切换到左侧的窗口
  • Ctrl-w, w:光标在两个窗口间彼此切换

内容合并

可以使用 d, p (即 diff put)命令,将当前差异点中的内容覆盖到另一文件中的对应位置。
如当光标位于左侧文件(file1)中的第一行时,依次按下 dp 键,则 file1 中的 Line one 被推送到右侧,并替换掉 file2 中对应位置上的 Line 1 。截图如下:

vimdiff 命令使用介绍 - 图3

d p

可与上一幅截图对比查看效果。

d, o (即 diff obtain)命令可以将另一窗口中差异点处的内容拉取到当前位置并进行替换操作。截图如下:

vimdiff 命令使用介绍 - 图4

d o

即在 file1 的第一行执行 d o 命令后,file2 中的第一行内容 Line 1 被拉取到 file1 中并替换掉原来位置上的 Line one

同时操作两个文件

vimdiff 实际上是 Vim 编辑器的 diff 模式,因此适用于 Vim 编辑器的命令和快捷键也同样可以在该模式下使用。常用的几个命令如下:

  • :qa:退出所有文件
  • :wa:保存所有文件
  • :wqa:保存并退出所有文件
  • qa!:强制退出(不保存)所有文件
  • z o:查看被折叠的内容
  • z c:重新折叠

其他常用的命令与快捷键可参考 Vim 速查手册