改进vimdiff相似性搜索机制的方法

时间:2016-04-09 16:49:24

标签: vim

我正在努力了解vimdiff是如何工作的。

这里我尝试区分两个简单的文件。第一名:

abcdefghijklmnopqrstuvwxyz

foo

abcdefghijklmnopqrstuvwxyz iii

bar

第二名:

abcdefghijklmnopqrstuvwxyz

abcdefghijklmnopqrstuvwxyz

这是diffmerge实用程序的结果:

enter image description here

这是vim的结果:

enter image description here

请注意,vim没有看到abc...xyzabc...xyz iii行之间的相似性,也没有在一行上直观地排列它们。

在这种情况下是否有一些设置可以改善vimdiff?

1 个答案:

答案 0 :(得分:1)

正如评论中指出的那样,vim使用外部实用程序diff,它不执行单词差异,也不能找到移动和修改的行。

即使诉诸diffexpr也不能令人满意,因为Vim希望来自外部实用程序的数据处于“ed”样式差异。这排除了使用替代的diff实用程序,这些实用程序可以生成单词甚至基于char的差异,例如diffmerge。

一些勤劳的插件作者已经熟悉的解决方法是将这些更复杂的差异的结果包装起来并将其输出转换为“ed”样式差异以供Vim使用。我知道有两个这样的插件采用这种方法:chardiffvim-diff-enhanced。两者都给你字差异。此外,Vim-diff-enhanced允许您在各种差异算法(myers,直方图,耐心)之间切换,因此可以根据具体情况决定哪种差异产生最佳结果。

我使用vim-diff-enhanced,它比默认差异更好,但仍然不是很好。 (注意:这取决于git。)例如,我尝试了你的测试,如问题中所述,并且它没有认识到第5行和第3行是相同的(即使使用:set diffopt + = iwhite)。虽然,如果我删除或添加了第一个示例文件的第2行的内容,那么vimdiff会匹配您从diffmerge获得的结果。