zz ; http://www.ibm.com/developerworks/cn/linux/l-vimdiff/index.html

源程序文件(通常是纯文本文件)比较和合并工具一直是软件开发过程中比较重要的组成部分。现在市场上很多功能很强大的专用比较和合并工具,比如 BeyondCompare;很多IDE 或者软件配置管理系统,比如Eclipse, Rational ClearCase都提供了内建的功能来支持文件的比较和合并。

当远程工作在Unix/Linux平台上的时候,恐怕最简单而且到处存在的就是命令行工具,比如diff。可惜diff的功能有限,使用起来也不是很方便。作为命令行的比较工具,我们仍然希望能拥有简单明了的界面,可以使我们能够对比较结果一目了然;我们还希望能够在比较出来的多处差异之间快速定位,希望能够很容易的进行文件合并……。而Vim提供的diff模式,通常称作vimdiff,就是这样一个能满足所有这些需求,甚至能够提供更多的强力工具。在最近的工作中,因为需要做很多的文件比较和合并的工作,因此对Vimdiff的使用做了一个简单的总结。我们先来看看vimdiff的基本使用。

启动方法

首先保证系统中的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是最好的选择。

gvim之Vimdiff 使用相关推荐

  1. vim与gvim技巧大全

    转自:http://blog.163.com/lgh_2002/blog/static/44017526200941343548691/ 第二部分:vim tips的翻译 很多东东都对于深入认识vim ...

  2. 关于gvim的高级应用

    最近在学习linux,看中了vim编辑器,找到了这篇技巧,时间有点老了,如果有用过的同学,欢迎指教,谢谢指教 最佳vim技巧 ------------------------------------- ...

  3. The ShortKey for Gvim Vim

    ---------------------------------------- # 基础 ---------------------------------------- * # g* g#    ...

  4. vim gvim技巧大全

    vim&gvim技巧大全(0)  很多东东都对于深入认识vim有很大帮助:) ---------------------------------------- # 基础 ----------- ...

  5. gvim编辑器的快捷键

    Vim/Vi 工作模式介绍: 插入模式 和  命令模式 是vi的两个基本模式. --插入模式 ,是用来编写文本内容的. --命令模式,是用来编辑文本,如上下翻页等,复制粘贴,跳转到指定行等操作 当前编 ...

  6. gvim使用技巧翻译

    1 ;:+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++   2 ;:文档来源: http ...

  7. vim替换字符串带斜杠_Vim、gvim操作替换

    ~  回复 以下关键词  查看更多IC设计教程 ~ 目前支持的关键词有: Innovus                            ICC or IC CompilerDC or Desi ...

  8. gvim 实现自动全文排版

    gvim 是 window 下的 vim 编辑器,具体的使用和 linux 下是一样的. 下面说下对于全文内容排版问题,内容排版比较乱,看起来比较吃力,下面有一种比较方便的方式,实现对所有的内容进行自 ...

  9. windows上搭建python+gvim开发环境

    参照了 http://www.cnblogs.com/xd502djj/archive/2010/09/16/1827683.html ,发现有些问题,所以修改了一些. Vim as Python I ...

最新文章

  1. python语言怎么输入-Python input()函数:获取用户输入的字符串
  2. Win32汇编ListBox最简Demo
  3. 一文读懂常用日志框架(Log4j、SLF4J、Logback)有啥区别
  4. 5G时代 我国在通信技术领域弯道超车指日可待
  5. 科大星云诗社动态20210216
  6. 《教你10分钟制作3D网游》视频吐槽
  7. PyCharm无法找到已安装的Python类库的解决方法
  8. uni-app开发开发h5,小程序,app,注意事项
  9. pg数据库生成随机时间_postgreSQL自动生成随机数值的实例
  10. Mac上最好的白噪音软件:Noizio for Mac
  11. 诊断(UDS)协议栈设计-系列讲解
  12. unity 自动生成脚本
  13. python绘制女孩_[宜配屋]听图阁
  14. 计算机三年级到六年级知识点,小学三年级至六年级信息技术教学总结
  15. 【毕业设计】基于springboot的个人博客系统
  16. Android音频子系统(十五)------Audio调试经验
  17. Kotlin学习安卓篇(一)为什么要学习Kotlin?
  18. 【BIOS】主板BIOS的两种启动模式,传统模式(Legacy)和UEFI模式
  19. 激光打印机如何维修?
  20. 【转】一些英文词的标准缩写

热门文章

  1. js 遍历对象的方式
  2. SpringBoot项目打包成jar后读取包内文件报错问题解决方法
  3. vue引入jquery的方法
  4. 前端埋点和后端埋点能分开使用吗?【数据埋点介绍】
  5. Centos8 安装node
  6. 阿轩的复习笔记-主从库数据一致性
  7. 纯JS判断iPhone准确机型,iPhone6~iPhoneXs Max
  8. Linux-新建用户/群组以及修改文件权限
  9. 子组件调用父组件中方法的方法
  10. Python3基础--18--数据库编程(上)