http://www.ibm.com/developerworks/cn/linux/l-vimdiff/
http://hi.baidu.com/_jg_/blog/item/ff62e6d5d9ecf315a08bb77c.html
http://hi.baidu.com/nkhzj/blog/item/e6b5a7017222100a1d958307.html
★ 跳转到下一个diff点:
请使用 ]c 命令★ 补充一条: 如果想交换上/下、左/右两个分隔窗口的位置,可以使用 ctrl-w,r 命令
更详细的介绍如下
http://blog.chinaunix.net/u1/34500/article_129477.html
vimdiff [options] file1 file2 [file3]
[功能]
同时打开两个或者多个文件,进行比较。
[描述]
vimdiff会将两个文件的相同指出尽量列在同一位置上面,便于查对比较。其命令基本和vim是一致的。
vimdiff使用vim启动两个或者多个文件,每个文件有其自己的窗口。每个文件中不同的地方会用高亮显示出来。它在进行改变的检查以及将改动从一个版本的文件移动到另一个版本的情况下非常方便。首先你得保证安装了vim才能是用vimdiff.用这个命令安装:
#apt-get install vim-full
其他类似的工具还tkdiff,meld 和 xfdiff4等。
[举例]
*同时打开main.cpp和main2.cpp,垂直方向分屏:
$vimdiff main.cpp main2.cpp
或$vim -d main.cpp main2.cpp
这样会同时打开两个文件垂直在两栏显示,可以打开不止两个文件。
*同时打开main.cpp和main2.cpp,水平方向分屏:
$vimdiff -o main.cpp main2.cpp
这样会同时打开两个文件在上下两栏显示.
**打开文件之后
可以看见不同的地方会高亮显示,相同的地方默认会被折叠起来。如下常用操作:
*跳到下一个不同的地方:
输入"]c".
*跳到上一个不同的地方:
输入"[c".
*用另外一个窗口的不同处替换当前:
输入"do".
这里,前提是用']c'或者'[c'跳到相应的不同处,执行完毕之后,当前窗口当前位置内容被替换为另外一个窗口的当前位置内容。注意这里是两个文件的情况,当前窗口有多于两个文件时无法进行。
*先指定范围1-100行,再用另外一个窗口的不同处替换当前:
输入"1,100 diffg".
或输入"1,100 diffget".
这里,等同于do不过指定了范围,如果有缓冲还可在diffg后面指定缓冲名字。
*先指定范围1-100行,再用指定3号缓冲(假设是文件file3)的不同处替换当前:
输入"1,100 diffg 3".
或输入"1,100 diffget 3".
这里,在diffg后面指定缓冲名字。
*用当前替换另外一个窗口的不同处:
输入"dp".
这里,前提是用']c'或者'[c'跳到相应的不同处,执行完毕之后,另外一个窗口的当前位置内容被替换成当前窗口当前的位置内容。注意这里是两个文件的情况,当前窗口有多于两个文件时无法进行。
*先指定范围1-100行,再用另外一个窗口的不同处替换当前:
输入"1,100 diffpu".
或输入"1,100 diffput".
这里,等同于dp不过指定了范围,如果有缓冲还可在diffpu后面指定缓冲名字。
*先指定范围1-100行,再用指定3号缓冲(假设是文件file3)的不同处替换当前:
输入"1,100 diffpu 3".
或输入"1,100 diffput 3".
这里,在diffpu后面指定缓冲名字。
*新开一个水平窗口载入file文件进行对比:
输入":diffsplit file".
这里新开的窗口是水平排列的,在不同窗口间移动的命令同vim。
*新开一个垂直窗口载入file文件进行对比:
输入"vert diffsplit file".
这里,vert实际是vertical前缀的简写。新开的窗口是垂直排列的,在不同窗口间移动的命令同vim。
*强制更新文件的不同状态:
输入":diffupdate".
这里,当我们修改某一个文件的时候,vim会试图使它和另外一个文件的不同之处保持更新,例如插入和删除行。但是,更复杂的修改或者在一个行内的修改可能会导致不同处(vimdiff)没有及时更新,这时候可以运行这个命令(diffupdate)进行强制更新。
*修改缺省的上下文行为3行:
输入":set diffopt=context:3".
这里vimdiff 缺省是会把不同之处上下各 6 行的文本都显示出来以供参考。其他的相同的文本行被自动折叠。如果希望修改缺省的上下文行数,可以这样设置.
*打开折叠的文本:
输入"zo".
*折叠折叠的文本:
输入"zc".
*修改完毕之后保存所有文件:
输入"wqa".
**
[其他]
其实vimdiff就是vim,只是一个符号链接而已,你可以file /etc/alternatives/*|grep bin/vim看看。
启动方法
首先保证系统中的diff命令是可用的。Vim的diff模式是依赖于diff命令的。Vimdiff的基本用法就是:
# vimdiff FILE_LEFT FILE_RIGHT |
或者
# vim -d FILE_LEFT FILE_RIGHT |
图一就是vimdiff命令的执行结果的画面。
从上图我们可以看到一个清晰的比较结果。屏幕被垂直分割,左右两侧分别显示被比较的两个文件。两个文件中连续的相同的行被折叠了起来,以便使用者能把注意力集中在两个文件的差异上。只在某一文件中存在的行的背景色被设置为蓝色,而在另一文件中的对应位置被显示为绿色。两个文件中都存在,但是包含差异的行显示为粉色背景,引起差异的文字用红色背景加以突出。
除了用这种方法启动vim的diff模式之外,我们还可以用分割窗口命令来启动diff模式:
# vim FILE_LEFT |
然后在vim的ex模式(也就是"冒号"模式)下输入:
:vertical diffsplit FILE_RIGHT |
也可以达到同样的效果。如果希望交换两个窗口的位置,或者希望改变窗口的分割方式,可以使用下列命令:
1. Ctrl-w K(把当前窗口移到最上边)
2. Ctrl-w H(把当前窗口移到最左边)
3. Ctrl-w J(把当前窗口移到最下边)
4. Ctrl-w L(把当前窗口移到最右边)
其中1和3两个操作会把窗口改成水平分割方式。
回页首
光标移动
接下来试试在行间移动光标,可以看到左右两侧的屏幕滚动是同步的。这是因为"scrollbind"选项被设置了的结果,vim会尽力保证两侧文件的对齐。如果不想要这个特性,可以设置:
:set noscrollbind |
可以使用快捷键在各个差异点之间快速移动。跳转到下一个差异点:
]c |
反向跳转是:
[c |
如果在命令前加上数字的话,可以跳过一个或数个差异点,从而实现跳的更远。比如如果在位于第一个差异点的行输入"2]c",将越过下一个差异点,跳转到第三个差异点。
回页首
文件合并
文件比较的最终目的之一就是合并,以消除差异。如果希望把一个差异点中当前文件的内容复制到另一个文件里,可以使用命令
dp (diff "put") |
如果希望把另一个文件的内容复制到当前行中,可以使用命令
do (diff "get",之所以不用dg,是因为dg已经被另一个命令占用了) |
如果希望手工修改某一行,可以使用通常的vim操作。如果希望在两个文件之间来回跳转,可以用下列命令序列:
Ctrl-w, w |
在修改一个或两个文件之后,vimdiff会试图自动来重新比较文件,来实时反映比较结果。但是也会有处理失败的情况,这个时候需要手工来刷新比较结果:
:diffupdate |
如果希望撤销修改,可以和平常用vim编辑一样,直接
<ESC>, u |
但是要注意一定要将光标移动到需要撤销修改的文件窗口中。
回页首
同时操作两个文件
在比较和合并告一段落之后,可以用下列命令对两个文件同时进行操作。比如同时退出:
:qa (quit all) |
如果希望保存全部文件:
:wa (write all) |
或者是两者的合并命令,保存全部文件,然后退出:
:wqa (write, then quit all) |
如果在退出的时候不希望保存任何操作的结果:
:qa! (force to quit all) |
回页首
上下文的展开和查看
比较和合并文件的时候经常需要结合上下文来确定最终要采取的操作。Vimdiff 缺省是会把不同之处上下各 6 行的文本都显示出来以供参考。其他的相同的文本行被自动折叠。如果希望修改缺省的上下文行数,可以这样设置:
:set diffopt=context:3 |
可以用简单的折叠命令来临时展开被折叠的相同的文本行:
zo (folding open,之所以用z这个字母,是因为它看上去比较像折叠着的纸) |
然后可以用下列命令来重新折叠:
zc (folding close) |
下图是设置上下文为3行,并展开了部分相同文本的vimdiff屏幕:
回页首
结论
在无法使用图形化的比较工具的时候,或者在需要快速比较和合并少量文件的时候,Vimdiff是最好的选择。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
diff -Nur linux-2.6.30/Makefile linux-2.6.31.5/Makefile --- linux-2.6.30/Makefile 2009-06-10 11:05:27.000000000 +0800 +++ linux-2.6.31.5/Makefile 2009-10-23 06:57:56.000000000 +0800 @@ -1,7 +1,7 @@ PATCHLEVEL = 6 -SUBLEVEL = 30 -EXTRAVERSION = +SUBLEVEL = 31 +EXTRAVERSION = .5 NAME = Man-Eating Seals of Antiquity # *DOCUMENTATION*
例2:
diff -Nur linux-2.6.30/arch/alpha/include/asm/bitsperlong.h linux-2.6.31.5/arch/alpha/include/asm/bitsperlong.h --- linux-2.6.30/arch/alpha/include/asm/bitsperlong.h 1970-01-01 08:00:00.000000000 +0800 +++ linux-2.6.31.5/arch/alpha/include/asm/bitsperlong.h 2009-10-23 06:57:56.000000000 +0800 @@ -0,0 +1,8 @@ +#ifndef __ASM_ALPHA_BITSPERLONG_H +#define __ASM_ALPHA_BITSPERLONG_H + +#define __BITS_PER_LONG 64 + +#include <asm-generic/bitsperlong.h> + +#endif /* __ASM_ALPHA_BITSPERLONG_H */
diff
功能说明:比较文件的差异。
语 法:diff [-abBcdefHilnNpPqrstTuvwy][-][-C ][-D ][-I ][-S ][-W ][-x ][-X ][--help][--left-column][--suppress-common-line][文件或目录1][文件或目录2]
补充说明:diff以逐行的方式,比较文本文件的异同处。所是指定要比较目录,则diff会比较目录中相同文件名的文件,但不会比较其中子目录。
参 数:
- 指定要显示多少行的文本。此参数必须与-c或-u参数一并使用。
-a或–text diff预设只会逐行比较文本文件。
-b或–ignore-space-change 不检查空格字符的不同。
-B或–ignore-blank-lines 不检查空白行。
-c 显示全部内文,并标出不同之处。
-C或–context 与执行”-c-”指令相同。
-d或–minimal 使用不同的演算法,以较小的单位来做比较。
-D或ifdef 此参数的输出格式可用于前置处理器巨集。
-e或–ed 此参数的输出格式可用于ed的script文件。
-f或-forward-ed 输出的格式类似ed的script文件,但按照原来文件的顺序来显示不同处。
-H或–speed-large-files 比较大文件时,可加快速度。
-l或–ignore-matching-lines 若两个文件在某几行有所不同,而这几行同时都包含了选项中指定的字符或字符串,则不显示这两个文件的差异。
-i或–ignore-case 不检查大小写的不同。
-l或–paginate 将结果交由pr程序来分页。
-n或–rcs 将比较结果以RCS的格式来显示。
-N或–new-file 在比较目录时,若文件A仅出现在某个目录中,预设会显示:
Only in目录:文件A若使用-N参数,则diff会将文件A与一个空白的文件比较。
-p 若比较的文件为C语言的程序码文件时,显示差异所在的函数名称。
-P或–unidirectional-new-file 与-N类似,但只有当第二个目录包含了一个第一个目录所没有的文件时,才会将这个文件与空白的文件做比较。
-q或–brief 仅显示有无差异,不显示详细的信息。
-r或–recursive 比较子目录中的文件。
-s或–report-identical-files 若没有发现任何差异,仍然显示信息。
-S或–starting-file 在比较目录时,从指定的文件开始比较。
-t或–expand-tabs 在输出时,将tab字符展开。
-T或–initial-tab 在每行前面加上tab字符以便对齐。
-u,-U或–unified= 以合并的方式来显示文件内容的不同。
-v或–version 显示版本信息。
-w或–ignore-all-space 忽略全部的空格字符。
-W或–width 在使用-y参数时,指定栏宽。
-x或–exclude 不比较选项中所指定的文件或目录。
-X或–exclude-from 您可以将文件或目录类型存成文本文件,然后在=中指定此文本文件。
-y或–side-by-side 以并列的方式显示文件的异同之处。
–help 显示帮助。
–left-column 在使用-y参数时,若两个文件某一行内容相同,则仅在左侧的栏位显示该行内容。
–suppress-common-lines 在使用-y参数时,仅显示不同之处。