我想了解
vimdiff是如何工作的.
在这里,我尝试区分两个简单的文件.第一名:
abcdefghijklmnopqrstuvwxyz
foo
abcdefghijklmnopqrstuvwxyz iii
bar
第二名:
abcdefghijklmnopqrstuvwxyz
abcdefghijklmnopqrstuvwxyz
这是diffmerge实用程序的结果:
这是vim的结果:
请注意,vim没有看到abc … xyz和abc … xyz iii行之间的相似性,并且没有在一行上直观地排列它们.
在这种情况下是否有一些设置可以改善vimdiff?
最佳答案 正如评论中指出的那样,vim使用外部实用程序diff,它不会执行单词差异,也不能找到移动和修改的行.
即使采用diffexpr也不能令人满意,因为Vim希望来自外部实用程序的数据处于“ed”样式差异.这排除了使用替代的diff实用程序,这些实用程序可以生成单词甚至基于char的差异,例如diffmerge.
一些勤劳的插件作者已经熟悉的解决方法是包装这些更复杂的差异的结果,并将他们的输出转换为“ed”样式差异,供Vim使用.我知道有两个这样的插件采用这种方法:chardiff和vim-diff-enhanced.两者都给你字差异.此外,Vim-diff-enhanced允许您在各种差异算法(myers,直方图,耐心)之间切换,因此可以根据具体情况决定哪种差异产生最佳结果.
我使用vim-diff-enhanced,它比默认差异更好,但仍然不是很好. (注意:这取决于git.)例如,我尝试了你的测试,如问题中所述,并且它没有认识到第5行和第3行是相同的(即使使用:set diffopt = iwhite).虽然,如果我删除或添加了第一个示例文件的第2行的内容,那么vimdiff会匹配您从diffmerge获得的结果.