Live-Bearbeitung im Diff-Modus in vim

Live-Bearbeitung im Diff-Modus in vim

Ich möchte eine Live-Ansicht der Unterschiede, während ich eine Datei bearbeite. vimdiffkann das tun, was ich möchte, beispielsweise die Unterschiede zwischen zwei Dateien hervorheben.

Es gibt jedoch zwei Nachteile, vimdiffdie mich zurückhalten.

Erstens kann es dieselbe Datei nicht unabhängig zwischenspeichern, um einen diffVergleich zu ermöglichen. Dieses Problem kann leicht umgangen werden. Ich habe das folgende Shell-Skript (nennen wir es diffvim), um vimdiffdieselbe Datei unabhängig zwischenspeichern zu können (indem eine temporäre Kopie der zu bearbeitenden Datei erstellt wird).

#!/bin/sh

# Differentially Viming

TMPDIR=/tmp/diffvim
FILENM=$1
FILEBN=$(basename $FILENM)

if [ ! -d "$TMPDIR" ]; then
  mkdir $TMPDIR
fi

cp $FILENM $TMPDIR/$FILEBN && vimdiff $FILENM $TMPDIR/$FILEBN

Der zweite Nachteil ist, vimdiffdass das Bearbeiten derkein UnterschiedTeile einer der beiden Kopien derselben Datei lösen keine diffNeuberechnung der Unterschiede aus. Dies muss manuell durch Aufrufen von erfolgen :diffupdate. Ich möchte, dass diese Neuberechnung automatisiert wird. Der relativ bequeme Weg, den ich finde, ist, sie auszulösen, wenn ich dieEINFÜGEN-Modus und geben Sie denNORMALModus. Dies kann wiederum einfach erreicht werden, indem ich meiner .vimrcDatei die folgende Zuordnung hinzufüge:

inoremap <Esc> <Esc>:diffu<CR>

Allerdings ist es noch nicht die perfekte Lösung. Denn wenn ich einige Änderungen imNORMALModus, d.h. ohne Ein- und Aussteigen in denEINFÜGENModus wird die Neuberechnung nach Abschluss der Bearbeitung immer noch nicht automatisch ausgelöst. Daher füge ich meiner .vimrcDatei ein weiteres Mapping hinzu:

nnoremap <Esc> :diffu<CR>

Aber dieses Mal passiert etwas Seltsames. Wenn ich eine Datei zum Bearbeiten öffne, funktionieren einige der Standardtastenkombinationen nicht richtig. Wenn ich beispielsweise die Taste hoder drücke l(d. h. wenn einer dieser Befehle der erste ist, den ich nach dem Öffnen der Datei eingebe), lande ich inEINFÜGENModus, While-Taste joder GLöschen einer Zeile oder des gesamten Inhalts usw. Wenn ich aber nach dem Öffnen der Datei Esczuerst die Taste drücke, funktionieren diese Befehle einwandfrei.

Irgendeine Idee, was schief läuft? Kennen Sie eine Problemumgehung?

Antwort1

Nachdem ich in vimdoc nachgeschaut habe autocmd, glaube ich, die Lösung gefunden zu haben, die genau das tut, was ich will:

autocmd CursorMoved,CursorMovedI * diffupdate

Vielen Dank an Ingo für seinen Vorschlag!

Antwort2

<Esc>wird auch in mehreren Tastencodes von Sondertasten verwendet und spielt beim Drucken auf dem Terminal eine Rolle.

Es ist keine gute Idee, es zu überlasten, insbesondere bei etwas so Invasivem wie Ihrem. Verwenden Sie einen anderen Schlüssel, z. B. <Leader><Leader>, oder definieren Sie einen Auslöser für Ereignisse:

:autocmd InsertEnter,InsertLeave * diffupdate

verwandte Informationen