vim:比较两个文件中的两个部分,而不是整个文件?


14

我将系统从Nagios 2升级到Nagios 3,现在我正在比较旧配置文件和新配置文件中的一些差异。

配置文件有重大更改,我不想对整个文件进行差异化处理,因为vimdiff向我显示了太多无关紧要的差异,并且#在行首等处难以处理注释等。

我可以使用vim或类似vimdiff的功能对两个不同文件中的两个特定部分执行比较吗?

例如,我只想比较看起来像这样的行:

# Define a service to check the load on the local machine. 

define service{
    use                             local-service         ; Name of service template to use
    host_name                       localhost
    service_description             Blah Blah
    check_command                   Blah Blah
    }

Answers:


19

听起来好像linediff.vim可能就是您想要的:“在两个文本块上执行交互式diff”。

您可以使用:Linediff命令指定每个块(行范围)(例如:4,10Linediff,或先进行视觉选择,然后键入:Linediff(显示为:'<,'>LineDiff))。范围可以来自相同的文件/缓冲区或不同的文件/缓冲区。指定两个范围后,它将打开一个新选项卡,该选项卡具有两个新的差异模式缓冲区(在拆分中)用于指定范围。您可以编辑和:w在这些缓冲区中的任意一个中更新原始范围。完成后,请:q移出diff缓冲区并:LinediffReset摆脱原始缓冲区中的范围说明符。

我最初了解linediff.vim 的Stackoverflow答案还建议了一些映射。关于该问题的其他答案还提到了自定义解决方案和可以解决同一问题的另一个插件。


6

我还没有找到一种非常简单的方法来执行此操作,但是使用NrrwRgn(狭窄区域)插件http://www.vim.org/scripts/script.php?script_id=3075取得了不错的成绩。它使您可以选择缓冲区的区域并在新缓冲区中打开该区域。您可以编辑该新缓冲区,然后在关闭它时,插件会自动将您编辑的文本复制回原始文件所在的区域。您还可以将一个或多个文件的不同区域复制到新缓冲区中,然后比较这些新缓冲区。这就是我通常使用插件的方式-检查一个文件中定义的相似功能之间的差异。

在您的情况下,您可以在Vim中打开两个文件,然后使用V来选择第一个文件中感兴趣的部分,然后键入\nr以将该部分复制到新的缓冲区中。对另一个文件中的类似部分重复上述操作。然后在两个新缓冲区的每一个中,执行:diffthis


谢谢!怎么\nr办?
Stefan Lasiewski

1
该插件映射<Leader>nr,其中<Leader>默认为'\`,到插件的命令,复制所选择的区域,以一个新的缓冲区。
garyjohn

@garyjohn您如何安排NrrrRgn拆分?
dev

1
@dev:在〜/ .vimrc中有以下两行NrrwRgn配置:let g:nrrw_rgn_vert = 1let g:nrrw_rgn_protect = 'n'。对于前者,NrrwRgn在当前窗口的左侧打开。我忘记了它们是立即打开到左侧还是最左侧。也就是说,我不再使用NrrwRgn了,发现了更好的东西:Linediff。它将在新选项卡中打开新区域,我发现它更整洁,更方便。您可以在http://www.vim.org/scripts/script.php?script_id=3745或找到LInediff https://github.com/AndrewRadev/linediff.vim
garyjohn

非常感谢@garyjohn。NrrwRgn做最左边或最上面,这使得拆分几乎无法控制。我什至尝试了这些!变体,但事实证明它们非常脆弱(脚本错误+没有返回原始文件的干净方法)。会给linediff.vim一个尝试过,尽管我很希望NrrwRgn在未来得到改善。
dev

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.