vim: відрізняється два розділи у двох файлах, але не весь файл?


13

Я модернізував систему з 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
    }

Відповіді:


16

Здається, що linediff.vim може бути те, що ви хочете: "Виконайте інтерактивну різницю на двох блоках тексту".

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

Відповідь Stackoverflow, де я вперше дізнався про linediff.vim, також пропонує пару відображень. Інші відповіді на це питання також згадують користувацьке рішення та інший плагін, який може вирішити цю проблему.


6

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

У вашому випадку ви можете відкрити обидва файли у Vim, а потім скористатися, Vщоб вибрати розділ, що цікавить перший файл, і введіть, \nrщоб скопіювати цей розділ у новий буфер. Повторіть подібний розділ в іншому файлі. Потім у кожному з двох нових буферів виконайте виконання :diffthis.


Дякую! Що буде \nrробити?
Стефан Ласевський

1
Плагін відображає <Leader>nr, де <Leader>за замовчуванням використовується `\`, на команду плагіна, яка копіює вибраний регіон у новий буфер.
garyjohn

@garyjohn як ти влаштовуєш NrrrRgnрозколи?
дев

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покращує в майбутньому.
dev

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.