vim: zwei Abschnitte in zwei Dateien unterscheiden, aber nicht die gesamte Datei?

14

Ich habe ein System von Nagios 2 auf Nagios 3 aktualisiert und vergleiche jetzt einige Unterschiede zwischen den alten und neuen Konfigurationsdateien.

Es gibt erhebliche Änderungen an den Konfigurationsdateien, und ich möchte keinen Unterschied für die gesamte Datei durchführen, da vimdiff mir zu viele irrelevante Unterschiede anzeigt und Probleme beim Umgang mit #Kommentaren am Zeilenanfang usw. hat.

Kann ich vim oder eine vimdiff-ähnliche Funktion verwenden, um einen Unterschied in zwei bestimmten Abschnitten in zwei verschiedenen Dateien durchzuführen?

Zum Beispiel möchte ich nur die Linien unterscheiden, die ungefähr so ​​aussehen:

# 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
quelle

Antworten:

19

Es klingt so, als ob liniertiff.vim genau das ist, was Sie wollen: "Führen Sie ein interaktives Diff für zwei Textblöcke durch".

Sie geben jeden Block (Zeilenbereich) mit seinem :LinediffBefehl an (z. B. :4,10Linediffoder führen Sie zuerst eine visuelle Auswahl durch und geben dann ein :Linediff(was als ausgegeben wird :'<,'>LineDiff)). Die Bereiche können aus derselben Datei / demselben Puffer oder aus verschiedenen Bereichen stammen. Sobald Sie zwei Bereiche angegeben haben, wird eine neue Registerkarte geöffnet, die zwei neue Diff-Modus-Puffer (in einer Aufteilung) für die angegebenen Bereiche enthält. Sie können und :win einem dieser Puffer bearbeiten , um die ursprünglichen Bereiche zu aktualisieren. Wenn Sie fertig sind :q, verlassen Sie die Diff-Puffer und :LinediffResetentfernen Sie die Bereichsspezifizierer in den Originalpuffern.

Die Stackoverflow-Antwort, bei der ich zum ersten Mal von linediff.vim erfahren habe, schlägt auch einige Zuordnungen vor. Andere Antworten auf diese Frage erwähnen auch eine benutzerdefinierte Lösung und ein anderes Plugin, das das gleiche Problem beheben kann.

Chris Johnsen
quelle
6

Ich habe keinen wirklich einfachen Weg gefunden, dies zu tun, aber ich hatte ziemlich gute Erfolge mit dem Plugin NrrwRgn (Narrow Region), http://www.vim.org/scripts/script.php?script_id=3075 . Sie können einen Bereich eines Puffers auswählen und diesen Bereich in einem neuen Puffer öffnen. Sie können diesen neuen Puffer bearbeiten. Wenn Sie ihn schließen, kopiert das Plugin Ihren bearbeiteten Text automatisch zurück in den Bereich, aus dem er in der Originaldatei stammt. Sie können auch verschiedene Bereiche einer oder mehrerer Dateien in neue Puffer kopieren und diese neuen Puffer dann unterscheiden. So benutze ich normalerweise das Plugin, um Unterschiede zwischen ähnlichen Funktionen zu überprüfen, die in einer Datei definiert sind.

In Ihrem Fall können Sie beide Dateien in Vim öffnen und dann Vden gewünschten Abschnitt in der ersten Datei auswählen und eingeben, \nrum diesen Abschnitt in einen neuen Puffer zu kopieren. Wiederholen Sie diesen Vorgang für den ähnlichen Abschnitt in der anderen Datei. Führen Sie dann in jedem der beiden neuen Puffer aus :diffthis.

Garyjohn
quelle
Vielen Dank! Was wird \nrtun?
Stefan Lasiewski
1
Das Plugin ordnet <Leader>nr, wobei der <Leader>Standardwert "\" ist, dem Plugin-Befehl zu, der die ausgewählte Region in einen neuen Puffer kopiert.
Garyjohn
@garyjohn wie arrangierst du die NrrrRgnSplits?
Dev
1
@dev: Ich habe die folgenden zwei Zeilen der NrrwRgn-Konfiguration in meinem ~ / .vimrc: let g:nrrw_rgn_vert = 1und let g:nrrw_rgn_protect = 'n'. Bei ersteren wird NrrwRgn links vom aktuellen Fenster geöffnet. Ich habe vergessen, ob sie sich sofort nach links oder ganz links öffnen. Trotzdem benutze ich NrrwRgn nicht mehr dafür, da ich etwas Besseres gefunden habe: Linediff. Es öffnet die neuen Regionen in einem neuen Tab, den ich ordentlicher und bequemer finde. Sie finden LInediff unter http://www.vim.org/scripts/script.php?script_id=3745oder https://github.com/AndrewRadev/linediff.vim.
Garyjohn
Vielen Dank @garyjohn. NrrwRgnmacht das ganz links oder oben, was Splits so ziemlich unüberschaubar macht. Ich habe sogar die !Varianten ausprobiert, aber sie erwiesen sich als sehr fragil (Skriptfehler + keine saubere Möglichkeit, zur Originaldatei zurückzukehren). Gibt linediff.vimeinen Versuch zu , obwohl ich die Hoffnung zu tun NrrwRgnin der Zukunft verbessert.
Dev