源程序文件(通常是纯文本文件)比较和合并工具一直是软件开发过程中比较重要的组成部分。现在市场上很多功能很强大的专用比较和合并工具,比如 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 命令使用技巧相关推荐

  1. 在此处打开命令窗口_这样操作方便多了!简单DOS命令实用技巧详解

    分享简单DOS命令实用技巧,让我们的工作.生活更加方便快捷.小编致力于分享分享智能数码.弱电组网.电脑软硬件资讯及实用技巧. 先跟着小编一起来了解一下DOS命令是一个什么样子的存在?技术大牛,请忽略, ...

  2. Metasploit reload命令使用技巧

    Metasploit reload命令使用技巧 在Metasploit框架中,不仅自带了大量渗透测试模块.而且,还支持用户导入第三方模块,编辑模块等.当用户编辑模块或导入第三方模块后,默认将不会自动加 ...

  3. Metasploit irb命令使用技巧

    Metasploit irb命令使用技巧   在Metasploit终端,提供了一个irb命令技巧,可以用来启动交互式Ruby.然后,在Ruby中执行Linux Shell命令或Ruby命令.其中,启 ...

  4. Metasploit search命令使用技巧

    Metasploit search命令使用技巧 Metasploit提供了大量的模块.当用户希望快速找到针对某漏洞模块时,则可以使用search命令进行搜索.搜索模块时,用户可以指定搜索类型.CVE  ...

  5. Metasploit advanced命令使用技巧

    Metasploit advanced命令使用技巧 在Metasploit中,在配置模块时,通常使用show options命令查看模块选项.但是,该命令仅输出的是一些基本选项.用户可以使用advan ...

  6. 100条Vista命令行技巧Tips,您知道几条?

    原文:[url]http://gnaw0725.blogbus.com/logs/5011924.html[/url] 100条Vista命令行技巧Tips,您知道几条? 自从去年装上Vista,也有 ...

  7. 十个有用的linux命令行技巧

    我记得我第一次使用 Linux 的时候,我还习惯于 Windows 的图形界面,我真的很讨厌 Linux   终端.那时候我觉得命令难以记忆,不能正确使用它们.随着时间推移,我意识到了 Linux   ...

  8. 20个超高效的Linux命令与技巧

    简介:这里有一些很有用的 Linux 命令,终端技巧和快捷方式,可以在使用Linux命令行时节省大量时间. 在本文中,我将向您演示一些专业的Linux命令技巧,这些技巧将使您节省大量时间,在某些情况下 ...

  9. 每个 Linux 用户都应该知道的命令行技巧

    每个 Linux 用户都应该知道的命令行技巧 原创 2015-09-11 伯乐在线 程序员的那些事 [伯乐在线导读]:有网友在问答网站Quora上提问:"有哪些省时小技巧,是每个Linux用 ...

最新文章

  1. TensorFlow(2)图(默认图与自定义图) TensorBoard可视化
  2. Flutter之第一个 Flutter App(四)
  3. 冷热分治,DT时代的数据存储必由之路
  4. Android改变字体方法——Typeface
  5. c++进制转换代码_轻松实现C/C++各种常见进制相互转换,你还不会你就落后了
  6. Java基础篇(02):特殊的String类,和相关扩展API
  7. 智能机器人建房子后房价走势_日本房价走势分析:房产投资是否“未来可期”?...
  8. 恭喜 | 黑龙江大学自然语言处理实验室获得NLPCC2019跨领域移植中文依存句法分析封闭测试第一名!...
  9. kingbase 修改数据库密码
  10. cartpole 离散型动作 A3C
  11. php中求10递归算法,php递归算法
  12. python获取本机IP地址
  13. a one-way repeated-measures ANOVA
  14. Java那些不为人知的技巧
  15. 运动会分数统计的实验报告(数组实现)
  16. 大型项目前端架构浅谈(8000字原创首发)
  17. 航天信息多个税盘一台电脑上一键迁移恢复免重复安装工具
  18. 减震透气的清爽跑鞋,让跑步更轻松,咕咚10K悦弹体验
  19. 活动目录之故障解决:域控制器不同步处理办法
  20. 微信小程序开发之微信支付(四)组合签名(时间戳,随机串) 用户确认支付

热门文章

  1. 我们什么时候需要函数隐藏
  2. Java实现咖啡馆选餐系统
  3. java中字输入输出异常_Java:详解Java中的异常(Error与Exception)
  4. 打开php文件url格式,url格式是什么
  5. RefSeq Protein Accession转换为蛋白质(YP_009227197转换成Protein)
  6. 扫描NFC卡,获取卡号存储到本地并可以以Excel形式导出数据
  7. Java实现最近点问题
  8. FPGA系列7——Xilinx复数乘法器(Complex Multiplier v6.0)使用小结
  9. python 收银系统_实现全栈收银系统(Node+Vue)(一)
  10. 价值7000万的商业模式,羊毛出在狗身上,猪来买单