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

7202
Stefan Lasiewski

Я обновил систему с 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 } 
12

3 ответа на вопрос

14
Chris Johnsen

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

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

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

6
garyjohn

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

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

Спасибо! Что будет `\ nr` делать? Stefan Lasiewski 12 лет назад 0
Плагин карты `nr`, где ``по умолчанию` \\ `- команде плагина, которая копирует выбранную область в новый буфер. garyjohn 12 лет назад 1
@garyjohn как вы организуете сплит `NrrrRgn`? dev 7 лет назад 0
@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 7 лет назад 1
Большое спасибо @garyjohn. `NrrwRgn` делает крайний левый или верхний край, что делает сплиты практически неуправляемыми. Я даже попробовал варианты `!`, Но они оказались очень хрупкими (ошибки скрипта + нет чистого способа вернуться к исходному файлу). Я тоже попробую `linediff.vim`, хотя я надеюсь, что в будущем NrrwRgn улучшится. dev 7 лет назад 0
-1
Rick Howe

Как насчет spotdiff.vim ( http://www.vim.org/scripts/script.php?script_id=5509 ), который я недавно опубликовал?