转载自:https://www.ibm.com/developerworks/cn/linux/l-vimdiff/linux
源程序文件(一般是纯文本文件)比较和合并工具一直是软件开发过程当中比较重要的组成部分。如今市场上不少功能很强大的专用比较和合并工具,好比 BeyondCompare;不少IDE 或者软件配置管理系统,好比Eclipse, Rational ClearCase都提供了内建的功能来支持文件的比较和合并。vim
当远程工做在Unix/Linux平台上的时候,恐怕最简单并且处处存在的就是命令行工具,好比diff。惋惜diff的功能有限,使用起来也不是 很方便。做为命令行的比较工具,咱们仍然但愿能拥有简单明了的界面,可使咱们可以对比较结果一目了然;咱们还但愿可以在比较出来的多处差别之间快速定 位,但愿可以很容易的进行文件合并……。而Vim提供的diff模式,一般称做vimdiff,就是这样一个能知足全部这些需求,甚至可以提供更多的强力 工具。在最近的工做中,由于须要作不少的文件比较和合并的工做,所以对Vimdiff的使用作了一个简单的总结。咱们先来看看vimdiff的基本使用。ide
启动方法工具
首先保证系统中的diff命令是可用的。Vim的diff模式是依赖于diff命令的。Vimdiff的基本用法就是:ui
# vimdiff FILE_LEFT FILE_RIGHT |
或者spa
# vim -d FILE_LEFT FILE_RIGHT |
图一就是vimdiff命令的执行结果的画面。命令行
从上图咱们能够看到一个清晰的比较结果。屏幕被垂直分割,左右两侧分别显示被比较的两个文件。两个文件中连续的相同的行被折叠了起来,以便使用者能 把注意力集中在两个文件的差别上。只在某一文件中存在的行的背景色被设置为蓝色,而在另外一文件中的对应位置被显示为绿色。两个文件中都存在,可是包含差别 的行显示为粉色背景,引发差别的文字用红色背景加以突出。code
除了用这种方法启动vim的diff模式以外,咱们还能够用分割窗口命令来启动diff模式:ip
# vim FILE_LEFT |
而后在vim的ex模式(也就是"冒号"模式)下输入:ci
: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是最好的选择。