我试图了解vimdiff的工作方式。
在这里,我尝试比较两个简单的文件。第一:
abcdefghijklmnopqrstuvwxyz
foo
abcdefghijklmnopqrstuvwxyz iii
bar
Run Code Online (Sandbox Code Playgroud)
第二:
abcdefghijklmnopqrstuvwxyz
abcdefghijklmnopqrstuvwxyz
Run Code Online (Sandbox Code Playgroud)
这是diffmerge实用程序的结果:
这是vim的结果:
请注意,vim看不到abc...xyz
和abc...xyz iii
行之间的相似性,也没有在视觉上将它们排列在一行上。
在这种情况下是否有一些设置可以改善vimdiff?
正如评论中指出的,vim 使用外部实用程序diff
,它不进行单词比较,也无法找到移动和修改的行。
即使诉诸 diffexpr 也不能令人满意,因为 Vim 期望来自外部实用程序的数据采用“ed”样式 diff。这排除了使用替代的 diff 实用程序来进行基于单词甚至字符的差异,例如 diffmerge。
一些勤奋的插件作者提出的解决方法是包装这些更复杂的 diff 的结果,并将其输出转换为“ed”样式 diff 供 Vim 使用。我知道有两个这样的插件采用这种方法:chardiff
和vim-diff-enhanced
。两者都会给你单词差异。此外,Vim-diff-enhanced 允许您在各种 diff 算法(迈尔斯、直方图、耐心)之间切换,因此人们可以根据具体情况决定哪种 diff 产生最佳结果。
我使用 vim-diff-enhanced,它比默认的 diff 更好,但仍然不是很好。(注意:这取决于 git。)例如,我尝试了您的测试,如问题中所述,它没有识别出第 5 行和第 3 行是相同的(即使使用 :set diffopt+=iwhite )。不过,如果我在第一个示例文件的第 2 行中删除或添加了某些内容,则 vimdiff 会与从 diffmerge 获得的结果相匹配。