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

Ste*_*ski 15 vim vimdiff

我将一个系统从 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
    }
Run Code Online (Sandbox Code Playgroud)

Chr*_*sen 20

听起来linediff.vim可能是您想要的:“对两个文本块执行交互式差异”。

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

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


gar*_*ohn 6

我还没有找到一种非常直接的方法来做到这一点,但是我在 NrrwRgn(窄区域)插件http://www.vim.org/scripts/script.php?script_id=3075 上取得了相当不错的成功。它允许您选择缓冲区的一个区域并在新缓冲区中打开该区域。您可以编辑该新缓冲区,当您关闭它时,插件会自动将您编辑的文本复制回原始文件中的区域。您还可以将一个或多个文件的不同区域复制到新缓冲区中,然后区分这些新缓冲区。这就是我通常使用插件的方式——检查一个文件中定义的相似函数之间的差异。

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