vimdiff 快速比较和合并少量文件
纯文本文件比较和合并工具一直是软件开发过程中比较重要的组成部分,vimdiff 能够在比较出来的多处差异之间快速定位,很容易的进行文件合并操作。
在需要快速比较和合并少量文件的时候,vimdiff是很好的选择。
vimdiff 基本用法:
首先保证系统中的diff命令是可用的。vim的diff模式是依赖于diff命令的。
启动方法
1. vimdiff file1 file2 …
2. vim -d file1 file2 …
差异点跳转
接下来试试在行间移动光标,可以看到左右两侧的屏幕滚动是同步的。这是因为"scrollbind"选项被设置了的结果,vim会尽力保证两侧文件的对齐。如果不想要这个特性,可以设置:
1 | :set noscrollbind |
可以使用快捷键在各个差异点之间快速移动。跳转到下一个差异点:
]c 下一个差异点
反向跳转是:
[c 上一个差异点
如果在命令前加上数字的话,可以跳过一个或数个差异点,从而实现跳的更远。比如如果在位于第一个差异点的行输入"2]c",将越过下一个差异点,跳转到第三个差异点。
n]c 转到下面第n个差异点,n为数字
文件合并
文件比较的最终目的之一就是合并,以消除差异。如果希望把一个差异点中当前文件的内容复制到另一个文件里,可以使用命令
1 | dp (diff "put") |
如果希望把另一个文件的内容复制到当前行中,可以使用命令
1 | do (diff "get",之所以不用dg,是因为dg已经被另一个命令占用了) |
如果希望手工修改某一行,可以使用通常的vim操作。如果希望在两个文件之间来回跳转,可以用下列命令序列:
1 | ctrl-w, w |
在修改一个或两个文件之后,vimdiff会试图自动来重新比较文件,来实时反映比较结果。但是也会有处理失败的情况,这个时候需要手工来刷新比较结果:
1 | :diffupdate |
如果希望撤销修改,可以和平常用vim编辑一样,直接
1 | < esc >, u |
但是要注意一定要将光标移动到需要撤销修改的文件窗口中。
同时操作两个文件
在比较和合并告一段落之后,可以用下列命令对两个文件同时进行操作。比如同时退出:
1 | :qa (quit all) |
如果希望保存全部文件:
1 | :wa (write all) |
或者是两者的合并命令,保存全部文件,然后退出:
1 | :wqa (write, then quit all) |
如果在退出的时候不希望保存任何操作的结果:
1 | :qa! (force to quit all) |
dp 当前差异点复制到另一个文件(diff put)
do 差异点复制到当前文件(diff get, 不用dg是因为已被另一命令占用了)
:diffupdate 修改后的更新,vimdiff也会自动来重新比较
u 撤销修改
上下文展开和查看
比较和合并文件的时候经常需要结合上下文来确定最终要采取的操作。vimdiff 缺省是会把不同之处上下各 6 行的文本都显示出来以供参考。其他的相同的文本行被自动折叠。如果希望修改缺省的上下文行数,可以这样设置:
1 | :set diffopt=context:3 |
可以用简单的折叠命令来临时展开被折叠的相同的文本行:
1 | zo (folding open,之所以用z这个字母,是因为它看上去比较像折叠着的纸) |
然后可以用下列命令来重新折叠:
1 | zc (folding close) |
下图是设置上下文为3行,并展开了部分相同文本的vimdiff屏幕:
使用颜色说明
# 比较文件连续的相同行被折叠
# 只在某一文件存的行背景设置成蓝色,其他文件为绿色
# 比较文件都有并包含差异的行设置成粉色背景,差异的文字用红色背景标注
结论
在无法使用图形化的比较工具的时候,或者在需要快速比较和合并少量文件的时候,vimdiff是最好的选择。