vim: diff dwie sekcje w dwóch plikach, ale nie cały plik?

14

Zaktualizowałem system z Nagios 2 do Nagios 3, a teraz porównuję pewne różnice w starych i nowych plikach konfiguracyjnych.

Istnieją znaczące zmiany w plikach konfiguracyjnych i nie chcę wykonywać różnic dla całego pliku, ponieważ vimdiff pokazuje mi zbyt wiele nieistotnych różnic i ma problem z radzeniem sobie z #komentarzami na początku wierszy itp.

Czy mogę użyć vim lub funkcji podobnej do vimdiff, aby wykonać różnicę na dwóch konkretnych sekcjach w dwóch różnych plikach?

Na przykład chcę odróżnić tylko te linie, które wyglądają mniej więcej tak:

# 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
    }
Stefan Lasiewski
źródło

Odpowiedzi:

19

Wygląda na to, że linediff.vim może być tym, czego chcesz: „Wykonaj interaktywny diff na dwóch blokach tekstu”.

Każdy blok (zakres linii) określasz za pomocą jego :Linediffpolecenia (np. :4,10LinediffLub dokonujesz selekcji wizualnej, a następnie wpisujesz :Linediff(która wychodzi jako :'<,'>LineDiff). Zakresy mogą pochodzić z tego samego pliku / bufora lub różnych. Po określeniu dwóch zakresów otwiera się nowa karta, która ma dwa nowe bufory trybu różnicowego (podzielone) dla określonych zakresów. Możesz edytować oraz :ww jednym z tych buforów, aby zaktualizować oryginalne zakresy. Kiedy skończysz, :qwyjdź z buforów różnic i :LinediffResetpozbyć się specyfikatorów zakresu w oryginalnych buforach.

Stackoverflow odpowiedź gdzie po raz pierwszy dowiedział się o linediff.vim sugeruje również kilka odwzorowań. Inne odpowiedzi na to pytanie wspominają również o niestandardowym rozwiązaniu i innej wtyczce, która może rozwiązać ten sam problem.

Chris Johnsen
źródło
6

Nie znalazłem naprawdę prostego sposobu na zrobienie tego, ale miałem całkiem niezły sukces z wtyczką NrrwRgn (Narrow Region), http://www.vim.org/scripts/script.php?script_id=3075 . Pozwala wybrać region bufora i otworzyć ten region w nowym buforze. Możesz edytować ten nowy bufor, a po jego zamknięciu wtyczka automatycznie kopiuje edytowany tekst z powrotem do regionu, z którego pochodzi w oryginalnym pliku. Możesz także skopiować różne regiony jednego lub więcej plików do nowych buforów, a następnie różnicować te nowe bufory. Tak zwykle używam wtyczki - do sprawdzania różnic między podobnymi funkcjami zdefiniowanymi w jednym pliku.

W twoim przypadku możesz otworzyć oba pliki w Vimie, a następnie użyć, Vaby wybrać interesującą cię sekcję w pierwszym pliku i wpisać, \nraby skopiować tę sekcję do nowego bufora. Powtórz dla podobnej sekcji w innym pliku. Następnie w każdym z dwóch nowych buforów wykonaj polecenie :diffthis.

garyjohn
źródło
Dziękuję Ci! Co \nrzrobisz
Stefan Lasiewski,
1
Wtyczka mapy <Leader>nr, gdzie <Leader>domyślnie `\`, do komendy pluginu który kopiuje wybrany region do nowego bufora.
garyjohn
@garyjohn, jak układasz NrrrRgnpodziały?
dev
1
@dev: Mam następujące dwa wiersze konfiguracji NrrwRgn w moim ~ / .vimrc: let g:nrrw_rgn_vert = 1i let g:nrrw_rgn_protect = 'n'. W pierwszym przypadku NrrwRgn dzieli się na lewo od bieżącego okna. Zapomniałem, czy otwierają się natychmiast po lewej, czy po lewej. To powiedziawszy, nie używam już NrrwRgn do tego, ponieważ znalazłem coś lepszego: Linediff. Otwiera nowe regiony w nowej karcie, którą uważam za ładniejszą i wygodniejszą. LInediff można znaleźć na stronie http://www.vim.org/scripts/script.php?script_id=3745lub https://github.com/AndrewRadev/linediff.vim.
garyjohn
Wielkie dzięki @garyjohn. NrrwRgnrobi skrajnie lewą lub górną część, co sprawia, że ​​podziały są praktycznie niemożliwe do zarządzania. Próbowałem nawet !wariantów, ale okazały się bardzo delikatne (błędy skryptu + brak czystego sposobu powrotu do oryginalnego pliku). Daje linediff.vimszansę zbyt chociaż mam nadzieję, NrrwRgnpoprawia się w przyszłości.
dev