it-swarm.com.de

Gibt es eine Möglichkeit, vimdiff so zu konfigurieren, dass ALLE Leerzeichen ignoriert werden?

Ich verwende vim -d file1 file2, um die Unterschiede zwischen ihnen zu sehen. Das funktioniert gut, aber ich möchte Änderungen an Leerzeichen ignorieren - sie sind für Quellcodedateien irrelevant.

Vim help gibt an, dass der folgende Befehl die Magie ausführen wird:

set diffopt+=iwhite

Leider fügt dieser Befehl der Befehlszeile des diff-Tools nur -b hinzu und ignoriert nur nachfolgende Leerzeichen. Der korrekte Befehlszeilenschlüssel für diff sollte -w sein, um alle Whitespace-Änderungen zu ignorieren. Ich kann jedoch nicht herausfinden, wie die diff-Befehlszeile direkt in Vim geändert werden kann. Natürlich kann ich ein benutzerdefiniertes Diff kompilieren oder Diff durch diff.sh ersetzen, aber das sieht irgendwie hässlich aus :(.

Gibt es eine bessere Möglichkeit, die Interaktion von Vim mit dem Diff-Tool zum Anzeigen von Dateidifferenzen zu ändern?

59
grigoryvp

Ja. Setzen Sie die Option iwhite wie Sie, machen Sie jedoch diffexpr leer.

Aus dem relevanten Abschnitt der vim docs :

iwhite 

Ignorieren Sie Änderungen in der Menge des Leerraums. Fügt Das Flag "-b" zum Befehl "diff" hinzu, wenn 'Diffexpr' leer ist. Überprüfen Sie in der Dokumentation Des Befehls "diff" genau, was dies Bewirkt. Es sollte das Hinzufügen von nachlaufenden Leerzeichen ignorieren, nicht aber führende Leerzeichen.

Beachten Sie auch, dass Sie eine benutzerdefinierte Diff-Befehlszeile bereitstellen können, indem Sie diffexpr einstellen. Siehe die Diskussion auf der vimdiff manpage , insbesondere:

Die Option 'diffexpr' kann so eingestellt werden, dass etwas anderes als das Standardprogramm "Diff" verwendet wird, um zwei Dateien zu vergleichen und die Unterschiede zu ermitteln.

Wenn 'diffexpr' leer ist, verwendet Vim diesen Befehl, um die Unterschiede Zwischen Datei1 und Datei2 zu ermitteln:

diff file1 file2 > outfile
26
ire_and_curses

Dies implementiert, was Sie möchten (aus diffexpr docs wobei -b in -w geändert wurde):

set diffopt+=iwhite
set diffexpr=DiffW()
function DiffW()
  let opt = ""
   if &diffopt =~ "icase"
     let opt = opt . "-i "
   endif
   if &diffopt =~ "iwhite"
     let opt = opt . "-w " " swapped vim's -b with -w
   endif
   silent execute "!diff -a --binary " . opt .
     \ v:fname_in . " " . v:fname_new .  " > " . v:fname_out
endfunction

... Ich bin immer noch auf der Suche nach einem besseren Diffexpr-Helfer in Bezug auf die Handhabung, welche Zeilen auf welche ( GNU diff , auch mit -w anstelle von -b) abgebildet werden, ist durch die Kombination von Whitespace eher verwirrend mit geringfügigen Änderungen wie kommentierte Zeilen). Vielleicht diffchar ?

35
Adam Katz

Vielen Dank, das hat mir geholfen. Ich brauche jetzt nur noch (einfacher als das, was von Adam K vorgeschlagen wird) in meinem ~/.vimrc: 

set diffopt+=iwhite

set diffexpr=""

Und es tut es ... Das ist immer noch das mächtigste Diff-Tool, das ich kenne, viel besser als jedes andere.

16
greg

Behandlung eines Problems, das in den Kommentaren der Lösung von Adam Katz angesprochen wurde:

Abhängig von der vim-Version und dem Setup des Benutzers kann ein silent-Befehl den Bildschirm nach der Ausgabe nicht neu zeichnen. Ich bin auch auf dieses Problem gestoßen, das immer dann auftrat, wenn ich :diffo ausgeführt habe, nachdem die vorgeschlagene diffexpr verwendet wurde. Meine Lösung bestand darin, den Befehl für die unbeaufsichtigte Ausführung folgendermaßen zu ändern:

silent execute "!diff -a --binary " . opt .
 \ v:fname_in . " " . v:fname_new .  " > " . v:fname_out | redraw!

Dies erzwingt ein Neuzeichnen, nachdem der Befehl ausgegeben wurde.

0
Brian Pollack