Skip to content

Vim - 差异比较

Vim 包含一个强大的内置文件比较工具,通常称为 vimdiff。它允许你比较两个或多个文件,并排查看它们的差异,并高亮显示更改。这对于代码审查、合并更改或理解修改非常有用。

本章内容包括:

  • 如何以 diff 模式启动 Vim。
  • 在 Vim 内部激活 diff 模式。
  • 在差异之间导航。
  • 将更改从一个文件应用到另一个文件。

你可以在终端中通过提供两个或更多文件名,直接以 diff 模式启动 Vim:

vimdiff file1.txt file2.txt [file3.txt ...]

或者,你可以使用 -d 选项:

vim -d file1.txt file2.txt

Vim 将会打开,每个文件都在一个单独的垂直分割窗口中。差异将被高亮显示:

  • 文件之间不同的行会高亮显示其不同的文本。
  • 在一个文件中存在而在另一个文件中不存在的行会显示不同的背景颜色。
  • 共同的行通常不会被高亮,或者可能有一个细微的背景。折叠区域(Folded sections)可能会隐藏未更改的行,以聚焦于差异。

例如,某个文件特有的文本可能被高亮为红色,另一个文件特有的文本为蓝色,修改过的行为紫色。在某个文件缺少行的地方可能会出现填充行(显示为 ---),以保持对齐。

要在新的水平分割窗口中打开另一个文件并进入 diff 模式:

:diffsplit filename.txt

要在新的垂直分割窗口中打开另一个文件(通常更适合比较):

:vert diffsplit filename.txt

如果你已经打开了多个窗口,可以通过移动到该窗口并输入以下命令,将每个窗口都设置为 diff 模式:

:diffthis

要关闭当前窗口的 diff 高亮显示:

:diffoff

要关闭当前标签页中所有窗口的 diff 高亮显示:

:diffoff!

有几个选项和命令可以帮助在差异间导航:

  • **切换窗口:**使用 Ctrl+w Ctrl+w 循环切换窗口,或使用 Ctrl+w <h/j/k/l> 移动到指定窗口。
  • **滚动绑定:**默认情况下,diff 模式下的窗口是滚动绑定的(:set scrollbind)。滚动一个窗口会同时滚动其他窗口。你可以使用 :set scrollbind 和 :set noscrollbind(或 :set scb! 进行切换)来切换此设置。
  • **更新差异:**如果你进行了更改,Vim 可能不会立即更新 diff 高亮显示。使用以下命令强制更新:
  • :diffupdate
  • 在更改之间跳转:
  • ]c - 跳转到下一个差异。
  • [c - 跳转到上一个差异。

当你的光标位于高亮的差异处时,可以轻松地将更改从一个缓冲区转移到另一个缓冲区。

将更改获取到当前窗口 (dp 或 :diffput)

Section titled “将更改获取到当前窗口 (dp 或 :diffput)”

要将更改从另一个参与 diff 的缓冲区获取并应用到当前缓冲区(在当前差异块处),使用:

dp

这等同于 :diffput(不带参数时,表示从另一个缓冲区放置)。

将更改从当前窗口放置到另一个窗口 (do 或 :diffget)

Section titled “将更改从当前窗口放置到另一个窗口 (do 或 :diffget)”

要将更改从当前缓冲区获取并应用到另一个参与 diff 的缓冲区(在当前差异块处),使用:

do

这等同于 :diffget OtherBufferName。do 命令(diff obtain 的简写)是一个更方便的快捷方式。

如果你比较了两个以上的文件,可能需要使用 :diffget <buf> 或 :diffput <buf> 指定缓冲区名称或编号。

实际应用:vimdiff 对于提交前检查代码更改、在版本控制中合并分支(许多 Git 工具可以将 Vim 集成作为比较/合并工具)或比较配置文件以发现差异至关重要。