Rückgängig machen im Einfügemodus

23

Gibt es einen Befehl, um den zuletzt im Einfügemodus ausgeführten Vorgang rückgängig zu machen?

Ich habe gerade Text aus dem falschen Register mit eingefügt <C-r>und habe zwei Möglichkeiten:

  1. Lösche von Hand, was ich gerade eingefügt habe und beginne von vorne.
  2. Wechsle in den normalen Modus, drücke uund verliere den Text, den ich vor dem Schlagen eingegeben habe <C-r>.

Gibt es einen besseren Weg?

zool
quelle

Antworten:

16

Vim bietet eine eingeschränkte Möglichkeit, den Umfang einer rückgängig zu machenden Änderung mit dem Ctrl-G uBefehl festzulegen , der die Rückgängigmachungssequenz unterbricht . Sehen

:help i_CTRL-G_u

In Ihrem Fall wäre die Lösung die folgende Neuzuordnung <C-R>:

:inoremap <C-R> <C-G>u<C-R>

Durch das Eingeben <C-O>uwerden nur die Änderungen rückgängig gemacht, die Sie seit dem Eingeben vorgenommen haben <C-R>. Sehen

:help i_CTRL-O
garyjohn
quelle
1
Das ist großartig, ich wusste nichts über diesen Befehl. Es gibt eine ziemlich lange Verzögerung zwischen dem Tippen <C-O>uund dem Anzeigen des Ergebnisses auf dem Bildschirm (ungefähr 4 Sekunden). Irgendeine Idee, wie ich das beseitigen könnte?
Zool
Das ist mir auch aufgefallen. Ich weiß es nicht; Ich werde versuchen es herauszufinden.
Garyjohn
Hey, ist es möglich, dass Sie <CR> (Wagenrücklauf) statt <CR> (Strg-R) gemeint haben?
Derwent
Nein. Die ursprüngliche Frage hatte mit dem Verhalten von <CR> zu tun, daher wird dieses Mapping verwendet. Sie können jedoch in dieser Zuordnung <CR> durch <CR> ersetzen, um die Rückgängig-Sequenz stattdessen durch ein <CR> zu unterbrechen. Weitere Beispiele finden Sie unter :help i_CTRL-G_u.
Garyjohn
6

Vom Einfügemodus:

  1. Wenn Ihr eingefügter Text kleiner als eine Zeile ist (was Ihr 2. Punkt impliziert), drücken Sie einfach <C-u>, um alle Zeichen vor dem Cursor in der aktuellen Zeile zu entfernen.

  2. Wenn eingefügter Text mehr als eine Zeile ist, Ihre zweite Lösung besser funktionieren würde, wie folgt angepasst: <C-o>u.

Beide obigen Punkte beginnen und bleiben - oder enden - im Einfügemodus. sie sind eigentlich die gleichen mit Ihren vorgeschlagenen Lösungen, nur kürzer gemacht :)

VanLaser
quelle
6

Sie können es versuchen <C-w>(löscht ein Wort links) oder <C-u>(löscht Zeichen vor dem Cursor, wenn einmal gedrückt, löscht den Zeilenumbruch, wenn ein zweites Mal gedrückt wird). Siehe :help i_CTRL-Wund :help i_CTRL-U.

Wenn Sie viel aus einem Register einfügen, ist es natürlich schneller, Ihre Änderungen rückgängig zu machen, Sie können dafür den Einfügemodus verwenden <C-o>(führen Sie einen Befehl für den normalen Modus aus und kehren Sie dann in den Einfügemodus zurück).

Im Allgemeinen ist es hilfreich, Ihre Änderungen in kleine Teile zu zerlegen, indem Sie häufig zum normalen Modus zurückkehren, damit Sie fein abgestimmte Möglichkeiten zum Rückgängigmachen haben.

cbaumhardt
quelle