
Ich möchte eine Live-Ansicht der Unterschiede, während ich eine Datei bearbeite. vimdiff
kann das tun, was ich möchte, beispielsweise die Unterschiede zwischen zwei Dateien hervorheben.
Es gibt jedoch zwei Nachteile, vimdiff
die mich zurückhalten.
Erstens kann es dieselbe Datei nicht unabhängig zwischenspeichern, um einen diff
Vergleich zu ermöglichen. Dieses Problem kann leicht umgangen werden. Ich habe das folgende Shell-Skript (nennen wir es diffvim
), um vimdiff
dieselbe 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, vimdiff
dass das Bearbeiten derkein UnterschiedTeile einer der beiden Kopien derselben Datei lösen keine diff
Neuberechnung 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 .vimrc
Datei 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 .vimrc
Datei 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 h
oder 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