Wie bestimmt vim die Größe eines einzelnen "Schnitts" bei Verwendung von "u" und "CTL-R"?

17

Bei der Verwendung von uoder CTL-Rzum Rückgängigmachen oder erneuten Ausführen einer Bearbeitung in vim werden anscheinend Textblöcke geändert, nicht nur der letzte Tastenanschlag.

Wodurch wird die Größe des Blocks bestimmt, der als einzelne Bearbeitung betrachtet wird?

DQdlM
quelle

Antworten:

19

Sie suchen nach der Definition von undo-blocks.

Von :h undo-blocks:

Ein Befehl zum Rückgängigmachen macht normalerweise einen eingegebenen Befehl rückgängig, unabhängig davon, wie viele Änderungen dieser Befehl vornimmt. Diese Folge von rückgängig zu machenden Änderungen bildet einen Rückgängig-Block. Wenn also die eingegebenen Tasten eine Funktion aufrufen, werden alle Befehle in der Funktion zusammen rückgängig gemacht.

Derselbe Block wird für verwendet redo. Von :h redo:

Die letzten Änderungen werden gespeichert. Mit den Befehlen "Rückgängig" und "Wiederherstellen" können Sie den Text auf den Stand vor jeder Änderung zurücksetzen. Sie können die Änderungen auch erneut anwenden und den Text vor dem Rückgängigmachen wiederherstellen.

vappolinario
quelle
4
Sie können einen einzelnen Rückgängig-Block auch manuell mit dem Befehl CTRL-G uim Einfügemodus aufteilen. Dies ist hilfreich, wenn Sie über einige Makros im Einfügemodus verfügen.
Fruglemonkey
8

Vim modale Bearbeitung wird häufig als betrachteter Operator (zB c, d...) , um eine Anwendung über Bewegung (zB iw, w, }, ...). Als wunderbares Nebenprodukt wird Vim klobig rückgängig gemacht. Während andere Editoren raten müssen, um viele kleine Undos in Undo-Blöcke zu verwandeln, macht Vim dies auf natürliche Weise. Ein weiterer Nebeneffekt ist, dass Sie einen Wiederholungsoperator .(auch als Punktbefehl bezeichnet) erhalten.

In Ihrer Frage werden Tastenanschläge speziell erwähnt. Ich gehe also davon aus, dass Sie wissen möchten, wie Sie kleine Änderungen im Einfügemodus rückgängig machen können. Die Antwort ist, dass dies nicht "der Weg der Vim" ist. "The Vim Way" bedeutet, dass Sie sich jeweils für einen kurzen Burst im Insert-Modus befinden. Dies bedeutet, dass Sie bei Fehlern im Einfügemodus häufig einfach in den normalen Modus wechseln und den Text korrigieren oder einfach einen Vorgang rückgängig machen uund den Text neu schreiben.

Manchmal muss ein Rückgängig-Block im Einfügemodus geteilt werden. Dies kann <c-g>uim Einfügemodus über erfolgen. Siehe :h :undojund :h undo-blocksfür weitere Informationen.

Für weitere Hilfe schlage ich Folgendes vor:

:h undo-blocks
:h :undoj
:h undo-tree
:h persistent-undo
:h undo.txt

Es gibt auch einige Screencasts zu diesem Thema:

Peter Rincker
quelle
"Chunky Undo" - die beste Beschreibung, die ich je gesehen habe.
Matt Parker
6

Sie können sich das auch so vorstellen: Jedes Mal, wenn Sie in den Einfügemodus wechseln, um Text zu bearbeiten, und Sie drücken Esc, wird ein Block gebildet. Wenn Sie versuchen, diesen Block rückgängig zu machen, gehen Sie zu derselben Position, bevor Sie in den Einfügemodus gewechselt sind.

Daher können Sie Ihre Änderungen "speichern", indem Sie den Einfügemodus von Zeit zu Zeit verlassen: Nehmen wir an, Sie gehen in den Einfügemodus und schreiben eine Funktion. Sie können mit dem Codieren fortfahren und zur nächsten Funktion wechseln. Manchmal ist es jedoch vorzuziehen, zum normalen Modus zurückzukehren und erneut in den Einfügemodus zu wechseln. Auf diese Weise können Sie Ihren Code auf einfache Weise strukturieren lassen, und wenn Sie zurückgehen müssen, können Sie wissen, an welcher Position Sie landen werden.

Hinweis: Wenn Sie Pfeile zum Bewegen verwenden, ist dies so, als hätten Sie Esc+ [ hjkl] gedrückt.

Wylex
quelle