Was ist die empfohlene Methode zum Kopieren von Änderungen mit vimdiff?

117

Wenn ich Dateien vergleiche und ein Quellcode-Repository aktualisiere, verwende ich gerne vimdiff. Um Änderungen von einer Datei in die andere zu kopieren, verwende ich normalerweise eine Tastenfolge wie die folgende:

Shift + V (select line)
k or j; { or }; Up or down arrow keys (select more lines)
y  (copy selected lines)
Ctrl + w, left/right arrow (move to other pane)
p (paste lines)

Vim, der die Tastaturkürzel beherrscht, dürfte es sicherlich einfacher haben, diese gleiche Aufgabe zu erledigen. Ist dort eines? Was verwenden Sie, um Quellcodeänderungen manuell zu aktualisieren?

Alex Leach
quelle
2
Vielen Dank, dass Sie meine vage Vorstellung von "Das ist nicht das, was es sein sollte" in eine aussagekräftige Frage gestellt haben. Die Antwort ist etwas, was ich vor langer Zeit hätte lernen sollen.
Caleb
1
Die besten Antworten auf Ihre Frage finden Sie hier: stackoverflow.com/questions/5288875/…
erik

Antworten:

181

do(diff get) und dp(diff put) ist was Sie brauchen. Hier ist eine kleine Liste weiterer hilfreicher Normalmodus-Befehle in diesem Zusammenhang.

]c               - advance to the next block with differences
[c               - reverse search for the previous block with differences
do (diff obtain) - bring changes from the other file to the current file
dp (diff put)    - send changes from the current file to the other file
zo               - unfold/unhide text
zc               - refold/rehide text
zr               - unfold both files completely
zm               - fold both files completely

HINWEIS:
Beide dound dpfunktionieren, wenn Sie sich im normalen Modus in einem Block oder nur in einer Zeile unter einem Block befinden, jedoch nicht im visuellen Modus. Wenn Sie Textzeilen im visuellen Modus auswählen, müssen Sie die normalen Befehle verwenden

  • :'<,'>diffget und
  • :'<,'>diffput.

Siehe auch :h copy-diffs.

:diffupdate Durchsucht die Dateien erneut nach Änderungen.

Marco
quelle
4
Wahr. Ich fand es anfangs ziemlich verwirrend, da ganze (zusammenhängende) Blöcke kopiert werden. Zusammen mit dem automatischen Ausblenden identischer Zeilen durch den Diff-Modus dachte ich: "Was zum Teufel ist gerade passiert?", Bevor ich jeden Zug in beiden Fenstern dreifach überprüfte. Angenommen, Sie haben den Einzug in eine der Dateien geändert. dann stelle ich mir vor, alles wird verschoben. Für eine feinere Steuerung (dh visuelle Auswahl) habe ich festgestellt, dass die vollständigen Befehle :[range]diffgetund :[range]diffputbenötigt werden.
Alex Leach
8
Sie können den visuellen Modus zusammen mit diffgetund verwenden diffput: ① Rufen Sie den visuellen Modus auf und markieren Sie Text / Linien. ② Geben Sie dann ein :diffput, um die ausgewählten Zeilen in die andere Datei zu verschieben oder :diffgetdie ausgewählten Zeilen aus der anderen Datei abzurufen.
Erik
6
Hallo, weiß jemand, ob es für NUR eine Zeile ein Äquivalent von "do" (Differenz erhalten) gibt? Angenommen, Sie haben einen Codeblock (mehr als eine Zeile), der unterschiedlich ist. Wenn Sie mit dem Cursor in einer beliebigen Zeile dieser Codes "tun", wird die Differenz für den gesamten Codeblock ermittelt Ich möchte nur die Differenz für EINE Leitung erhalten. Jedes Mal muss ich diese Zeile visuell auswählen, gefolgt von "diffget", ein bisschen langweilig ...
wiswit
12
Es ist wichtig zu beachten, dass der Befehl zum Rückgängigmachen nur in dem Puffer funktioniert, der geändert wurde. Wenn Sie also einen dpanderen Puffer verwenden und Ihre Meinung ändern, müssen Sie zum Rückgängigmachen in den anderen Puffer wechseln.
Random832
1
@wiswit: Vum die ganze Zeile auszuwählen, dofunktioniert dann das Kopieren über eine bestimmte Zeile in der aktuellen Version (8.0), ganz gleich, was es wert ist.
Dannysauer