VIM: различие двух разделов в двух файлах, но не весь файл?

14

Я обновил систему с Nagios 2 до Nagios 3, и теперь я сравниваю некоторые различия в старых и новых файлах конфигурации.

В конфигурационные файлы внесены существенные изменения, и я не хочу выполнять diff для всего файла, потому что 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
    }
Стефан Ласевский
источник

Ответы:

18

Похоже, что linediff.vim может быть тем, что вы хотите: «Выполнить интерактивный анализ на двух блоках текста».

Вы указываете каждый блок (диапазон строк) с помощью его :Linediffкоманды (например :4,10Linediff, или сначала делаете визуальный выбор, а затем вводите :Linediff(что получается как :'<,'>LineDiff)). Диапазоны могут быть из одного файла / буфера или разных. После того, как вы указали два диапазона, откроется новая вкладка с двумя новыми буферами в режиме сравнения (в разделении) для указанных диапазонов. Вы можете редактировать и :wв любом из этих буферов обновлять исходные диапазоны. Когда вы закончите, :qвыйдите из буферов различий и :LinediffResetизбавьтесь от спецификаторов диапазона в исходных буферах.

Stackoverflow ответ , где я впервые узнал о linediff.vim также предлагает несколько отображений. В других ответах на этот вопрос также упоминается нестандартное решение и другой плагин, который может решить эту же проблему.

Крис Джонсен
источник
6

Я не нашел действительно простого способа сделать это, но у меня был довольно хороший успех с плагином NrrwRgn (Узкая область), http://www.vim.org/scripts/script.php?script_id=3075 . Это позволяет вам выбрать область буфера и открыть эту область в новом буфере. Вы можете редактировать этот новый буфер, и когда вы закрываете его, плагин автоматически копирует ваш отредактированный текст обратно в область, из которой он пришел в исходном файле. Вы также можете скопировать различные области одного или нескольких файлов в новые буферы, а затем изменить эти новые буферы. Вот как я обычно использую плагин - чтобы проверить различия между похожими функциями, определенными в одном файле.

В вашем случае вы можете открыть оба файла в Vim, а затем использовать Vдля выбора интересующего раздела в первом файле и ввести \nrтекст, чтобы скопировать этот раздел в новый буфер. Повторите для аналогичного раздела в другом файле. Затем в каждом из двух новых буферов выполните :diffthis.

garyjohn
источник
Спасибо! Что будет \nrделать?
Стефан Ласевский
1
Плагин <Leader>nr, где по <Leader>умолчанию `\`, подключается к команде плагина, которая копирует выбранную область в новый буфер.
garyjohn
@garyjohn как ты организуешь NrrrRgnраскол?
Dev
1
@dev: В моей ~ / .vimrc есть следующие две строки конфигурации NrrwRgn: let g:nrrw_rgn_vert = 1и let g:nrrw_rgn_protect = 'n'. В первом случае NrrwRgn разделяется на левую часть текущего окна. Я забыл, открываются ли они сразу слева или далеко слева. Тем не менее, я больше не использую NrrwRgn для этого, найдя что-то лучшее: Linediff. Он открывает новые регионы в новой вкладке, которая мне кажется более удобной и удобной. Вы можете найти LInediff в http://www.vim.org/scripts/script.php?script_id=3745или https://github.com/AndrewRadev/linediff.vim.
garyjohn
Большое спасибо @garyjohn. NrrwRgnделает крайний левый или верхний, что делает сплиты практически неуправляемыми. Я даже попробовал !варианты, но они оказались очень хрупкими (ошибки скрипта + нет чистого способа вернуться к исходному файлу). Дам linediff.vimпопробовать тоже , хотя я надеюсь , NrrwRgnулучшает в будущем.
Дев