2016-04-09 9 views
3

Ich versuche zu verstehen, wie vimdiff arbeiten.Der Weg zur Verbesserung vimdiff Ähnlichkeitssuche Mechanismus

Hier habe ich versucht, zwei einfache Dateien zu vergleichen. Die erste:

abcdefghijklmnopqrstuvwxyz 

foo 

abcdefghijklmnopqrstuvwxyz iii 

bar 

Die zweite:

abcdefghijklmnopqrstuvwxyz 

abcdefghijklmnopqrstuvwxyz 

Hier ist Ergebnis von DiffMerge Dienstprogramm:

enter image description here

Und hier ist das Ergebnis von vim:

enter image description here

Beachten Sie, dass vim die Ähnlichkeit zwischen den Zeilen abc...xyz und abc...xyz iii nicht erkennt und sie nicht visuell in einer Zeile anordnet.

Gibt es einige Einstellungen, um vimdiff in solchen Fällen zu verbessern?

+0

'vimdiff' ruft nur das externe Dienstprogramm' diff' auf und parst das (was diese Art von Änderungen nicht sieht). 'diffmerge' verwendet offensichtlich einen fortgeschritteneren Algorithmus. – Carpetsmoker

+0

Okay. Ich glaube, es könnte eine akzeptierte Antwort sein ...) – jsv

+0

Ich weiß nicht, wie Vim die Daten analysiert, und Sie können vielleicht die 'diffexpr'-Einstellung verwenden, um dies in Vim zu erreichen (siehe ': h diff-diffexpr ') ... Es ist also vielleicht nicht völlig unmöglich, das in Vim zu machen, aber es wird sicherlich mehr Arbeit sein, als nur eine Einstellung zu setzen ... – Carpetsmoker

Antwort

0

Wie in den Kommentaren darauf hingewiesen, verwendet vim das externe Dienstprogramm diff, das weder Word-Diffs noch verschobene und geänderte Zeilen findet.

Auch der Rückgriff auf Diffexpr ist nicht zufriedenstellend, da Vim erwartet, dass die Daten des externen Dienstprogramms in einem "ed" -Stil diff vorliegen. Dies schließt die Verwendung alternativer Diff-Dienstprogramme aus, die Word- oder sogar char-basierte Diffs wie Diffmerge erzeugen.

Die Umgehungslösung, die einige fleißige Plugin-Autoren entwickelt haben, besteht darin, die Ergebnisse dieser anspruchsvolleren Diffs zu umhüllen und ihre Ausgabe in den "ed" -Stylendiff für Vim zu konvertieren. Ich kenne zwei solcher Plugins, die diesen Ansatz verwenden: chardiff und vim-diff-enhanced. Beides gibt dir das Wort diffs. Zusätzlich ermöglicht Vim-diff-enhanced das Umschalten zwischen verschiedenen Diff-Algorithmen (Myers, Histogramm, Geduld), so dass man entscheiden kann, welches Diff von Fall zu Fall das beste Ergebnis liefert.

Ich benutze vim-diff-enhanced, und es ist besser als die Standard-diff, aber immer noch nicht groß. (Anmerkung: Es hängt von Git ab.) Zum Beispiel habe ich Ihren Test, wie in der Frage beschrieben, ausprobiert, und er erkannte NICHT, dass die Zeilen 5 und 3 identisch waren (sogar mit: set diffopt + = iwhite). Obwohl, wenn ich etwas zu Zeile 2 der ersten Beispieldatei entfernte oder hinzufügte, stimmte vimdiff mit den Ergebnissen überein, die Sie von diffmerge erhalten hatten.

Verwandte Themen