Wie mache ich nur eingefügten Text in vim rückgängig?

10

TL; DR; version - Wie mache ich Text rückgängig, der aus meinem OS-Kopierpuffer eingefügt wurde, ohne anderen Text rückgängig zu machen, der seit dem Wechsel in den Einfügemodus eingegeben wurde?

Längere Beschreibung:

  1. Legen Sie etwas in den Kopierpuffer Ihres Betriebssystems (z. B. markieren Sie Text und tun Sie dies Command-cauf dem Mac)
  2. Wechseln Sie in vim ( i) in den Einfügemodus
  3. Tippe etwas (zB asdf)
  4. Fügen Sie aus dem Kopierpuffer in vim ( Command-vauf dem Mac) ein, ohne den Einfügemodus zu verlassen.
  5. Schlagen escape
  6. Versuche die Paste rückgängig zu machen ( u)

Es macht alles rückgängig, seit Sie das letzte Mal in den Einfügemodus gegangen sind. Mit anderen Worten, es wird gelöscht asdfund der gesamte Text, den ich eingefügt habe.

Wie mache ich den eingefügten Text einfach rückgängig? Muss ich immer den Einfügemodus verlassen und wieder einsteigen, bevor ich Text einfüge, um den eingefügten Text rückgängig machen zu können?

Javid Jamae
quelle

Antworten:

4

Eine Möglichkeit besteht darin, vor dem Einfügen explizit in den Einfügemodus zurückzukehren. Wenn Sie die Einfügebefehle erweitern, können Sie vor dem Einfügen auch automatisch einen Rückgängig-Punkt festlegen :

" Any text fragment pasted in insert mode should be undone separately, without
" destroying what was typed before.
inoremap <C-R> <C-G>u<C-R>

Das Obige gilt für den eingebauten i_CTRL-RBefehl. Ich weiß nicht, wie Command-vin MacVim implementiert wird, aber das Voranstellen <C-G>udes :imapBefehls sollte den gleichen Effekt erzielen.

Ingo Karkat
quelle
1
Funktioniert wie ein Zauber, danke! Ich sollte mich wahrscheinlich sowieso an die Standard-Vim-Methoden zum Einfügen halten.
Javid Jamae
Fügen Sie einfach Folgendes hinzu: :h i_CTRL-G_u(dh "Sequenz rückgängig machen, neue Änderung starten" im Einfügemodus).
Toraritte
2

In MacVim müssen Sie die Zuordnung des Menüelements aufheben, Edit > Pasteum die Verknüpfung zu überschreiben. Anschließend können Sie Cmd-V ( D-vim MacVim-Sprachgebrauch) in jedem Modus dem entsprechenden Befehl zuordnen. Ich habe dies zu meinem hinzugefügt ~/.gvimrcund jetzt funktioniert alles wunderbar:

macmenu Edit.Paste key=<nop>
noremap <D-v> "*P
cnoremap <D-v> <C-r><C-o>*
inoremap <D-v> <C-g>u<C-r><C-o>*

Dies <C-g>uist nur im Einfügemodus erforderlich, um den Rückgängig-Verlauf zu korrigieren. Die noremapund cnoremapdienen lediglich dazu, das Standard-Einfügeverhalten im Normal- und Befehlsmodus wiederherzustellen.

Vielen Dank an Ingo Karkat, der mich hier in die richtige Richtung gelenkt hat.

Sophie Alpert
quelle
1

Eigentlich besteht die Lösung darin, dass Sie zuerst in den Befehlsmodus (z. B. Esc) wechseln und den Einfügemodus erneut aufrufen müssen. Dies funktioniert jedoch nur, wenn ich manuell tippe, aber es scheint "zufällig" nicht mehr zu funktionieren, wenn ich es teste ~/.vimrc. Google hilft überhaupt nicht.

Ich verbringe viel Zeit damit, dieses Problem zu beheben, und finde nur den Grund in meinem Fall heraus:

Ordnen Sie den Einfügeschlüssel nicht dem vorhandenen Einfügeschlüssel des Terminals zu

zB Ctrl+Shift+Vwird in meiner Konsole Terminal einfügen, aber wenn ich diese Taste zuweisen <C-S-v>in ~/.vimrcder „Undo für nur einzelne Paste anstelle von mehreren Pasten“ wird nicht funktioniert.

In meinem Fall muss ich <C-v>anstelle von verwenden <C-S-v>:

inoremap <C-v> <Esc>"+pi<Esc>i<Right><Right>

Ihr Fall mag sich unterscheiden, aber der Punkt ist derselbe: Weisen Sie nicht dieselben Konflikte mit dem Einfügeschlüssel dem vorhandenen Terminalemulatorschlüssel zu.

Ich habe diese Schlussfolgerung zu 100% bewiesen, indem ich meinen Terminal-Einfügeschlüssel auf gesetzt habe Ctrl+Vund jetzt <C-v>aufhöre zu arbeiten, aber zu <C-S-v>funktionieren.

Beachten Sie auch, dass das Vim zu empfindlich und seltsam ist. Ich finde heraus, dass ich i2 rechte Tasten manuell verwenden muss, damit es in der richtigen Cursorposition funktioniert. Das bedeutet, dass ich auch i2 rechte Tasten eingeben muss ~/.vimrc. Ihr Fall mag sich unterscheiden, aber der Punkt ist der gleiche. Stellen Sie sicher, dass die Schlüssel + Reihenfolge in ~ / .vimrc 100% mit dem übereinstimmen, was Sie manuell eingeben.

林果 皞
quelle