[TOC]

前言

描述:源程序文件(通常是纯文本文件)比较和合并工具一直是软件开发过程中比较重要的组成部分,现在市场上很多功能很强大的专用比较和合并工具:

  • 比如 BeyondCompare很多IDE或者软件配置管理系统,比如Eclipse, Rational ClearCase都提供了内建的功能来支持文件的比较和合并;

当远程工作在Unix/Linux平台上的时候,恐怕最简单而且到处存在的就是命令行工具,比如diff(可惜diff的功能有限,使用起来也不是很方便);

Vim提供的diff模式通常称作vimdiff作为命令行的比较工具,我们仍然希望能拥有简单明了的界面,可以使我们能够对比较结果一目了然;我们还希望能够在比较出来的多处差异之间快速定位,希望能够很容易的进行文件合并;


vimdiff 使用

Vim的diff模式是依赖于diff命令的,且vimdiff中快捷键与vim有共通的地方;

Vimdiff的基本用法就是:

# 打开两个对比文件
vimdiff FILE_LEFT FILE_RIGHT
vim -d FILE_LEFT FILE_RIGHT

# 用分割窗口命令来启动diff模式:
vim FILE_LEFT
:vertical diffsplit FILE_RIGHT #底行模式(垂直排列)

同时操作两个文件在比较和合并告一段落之后,可以用下列命令对两个文件同时进行操作。

#比如同时退出:
:qa (quit all)
#如果希望保存全部文件:
:wa (write all)
#或者是两者的合并命令,保存全部文件,然后退出:
:wqa (write, then quit all)
#如果在退出的时候不希望保存任何操作的结果:
:qa! (force to quit all)


光标移动

接下来试试在行间移动光标,可以看到左右两侧的屏幕滚动是同步的,这是因为”scrollbind”选项被设置了的结果,vim会尽力保证两侧文件的对齐:

ctrl+w             #光标左右切换两个文件之间来回跳转
:set noscrollbind # 如果不想要这个特性,可以设置

#使用快捷键在各个差异点之间快速移动。跳转到下一个差异点:
]c #下一个
[c #上一个

如果在命令前加上数字的话,可以跳过一个或数个差异点从而实现跳的更远,比如如果在位于第一个差异点的行输入”2]c”,将越过下一个差异点,跳转到第三个差异点。

如果希望交换两个窗口的位置或者希望改变窗口的分割方式可以使用下列命令:

#其中1和3两个操作会把窗口改成水平 hT 分割方式
1. Ctrl - w - K(把当前窗口移到最上边)
2. Ctrl - w - H(把当前窗口移到最左边)
3. Ctrl - w - J(把当前窗口移到最下边)
4. Ctrl - w - L(把当前窗口移到最右边)


文件合并

文件比较的最终目的之一就是合并,以消除差异。

#如果希望把一个差异点中当前文件的内容复制到另一个文件里,可以使用命令模式
dp | (diff "put")
#如果希望把另一个文件的内容复制到当前行中,可以使用命令
do | (diff "get",之所以不用dg,是因为dg已经被另一个命令占用了)
#在修改一个或两个文件之后,vimdiff会试图自动来重新比较文件,来实时反映比较结果。但是也会有处理失败的情况,这个时候需要手工来刷新比较结果:
:diffupdate

如果希望撤销修改可以和平常用vim编辑一样直接, u,但是要注意一定要将光标移动到需要撤销修改的文件窗口中。

  1. 先指定范围1-100行,再用当前窗口的不同处替换到另外一个窗口:
    输入"1,100 diffpu".或输入"1,100 diffput".
    输入"1,100 diffg 3".或输入"1,100 diffget 3". #这里,在diffg后面指定缓冲名字
    #这里等同于dp不过指定了范围,如果有缓冲还可在diffpu后面指定缓冲名字。

2.先指定范围1-100行,再用另外一个窗口的不同处替换当前:

输入"1,100 diffg".或输入"1,100 diffget".
#*先指定范围1-100行,再用指定3号缓冲(假设是文件file3)的不同处替换当前:
输入"1,100 diffg 3".或输入"1,100 diffget 3". #这里,在diffg后面指定缓冲名字
#等同于do不过指定了范围,如果有缓冲还可在diffg后面指定缓冲名字。


上下文的展开和查看

描述:比较和合并文件的时候经常需要结合上下文来确定最终要采取的操作,Vimdiff 缺省是会把不同之处上下各 6 行的文本都显示出来以供参考。

其他的相同的文本行被自动折叠,如果希望修改缺省的上下文行数,可以这样设置:

:set diffopt=context:3  #就是不同之处的上3行和下3行不能折叠
#打开折叠代码。之所以用z这个字母,是因为它看上去比较像折叠着的纸:)
zo (folding open)
#重新折叠起来
zc (folding close)


基础示例

描述:两个文件中都存在但是包含差异的行显示为粉色背景,引起差异的文字用红色背景加以突出。

vimdiff  FILE_LEFT  FILE_RIGHT

WeiyiGeek.