在Vim中比较窗口差异

5
我正在处理一个变得相当复杂的脚本。我怀疑有几个部分的代码几乎是相同的。我能否(以及如何)在vim中打开该文件,并在同一文件的两个(或多个)窗口上比较窗口内容?vimdiff似乎仅适用于两个文件。如果我复制该文件并尝试vimdiff两个版本,那么差异原点仍然锁定在文件开头。虽然我可以取消滚动锁定窗口,并将窗口移动到我想要比较的文件部分,但差异并不会显示出来。有什么提示或技巧吗?我可以将我想要比较的部分剪切并粘贴到不同的文件中,然后应用vimdiff,但那样做的话我就可能会忘记哪个部分来自何处,当我尝试将单独的文件拼接在一起时,我确信还有更简单,更容易的方法。
2个回答

2

我通常做的是将副本与diff进行比较

:%w %.alt
:vert diffsplit %.alt

然后愉快地重新排列“alt”版本,以便伪匹配位对齐。
请注意,(大概)git 包含了很棒的合并/差异 cow-powers,应该能够检测到子文件移动块更改。

虽然我还没有实践过这个方法,但我有一个预感,非常好的 git 插件 fugitive for vim 可能能够利用其中一些功能使此操作更容易。注意:在可用之前可能需要脚本编写,但我仍然认为分享这个想法是很好的(如果您先完成了,请分享脚本!)


好的,使用%来引用当前缓冲区的文件名很不错,我之前并不知道!但我仍然不确定如何重新排列alt右侧版本以使匹配的位对齐。:se noscrollbind似乎有所帮助,但我该如何让vim突出显示两个窗口之间的差异呢? - ChrisDR
我的意思是字面上重新排列(我使用C/C#,所以d2]M会删除两个方法,导航到插入点,P即可); 另外,“右Alt版本”的拼写错误只是“Alt版本”。我知道这仍然是手动劳动,但(除了使用Git的复制/移动检测功能的想法),我不知道有更好的方法。使用临时副本的技巧非常巧妙。 - sehe

1

作为一种备选方案,我偶尔使用的并且在我看来非常好用的是linediff.vim

它允许您使用可视模式从任意缓冲区(或相同的缓冲区)选择两个文本块,并在它们上运行vimdiff。它的美妙之处在于,当您编辑和保存临时差异缓冲区时,您会更新原始缓冲区中的更改,而不保存。

我的一个用例是当我解决与脚本重构和重新排序相关的合并问题时,其中一个函数已经被移动并可能也被修改。为了确保您不会失去来自任何祖先的修改,您可以通过可视选择它们并运行linediff命令来对比函数的两个版本。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接