Machen Sie <CR> im Einfügemodus rückgängig

21

Manchmal habe ich im Einfügemodus versehentlich <CR>die Rücktaste mehrmals gedrückt (abhängig von der Einrückung), um dorthin zurückzukehren, wo ich war.

z.B

<div>
  <p> This is some text []</p>
</div>

Der Cursor ist []und ich drücke <CR>:

<div>
  <p> This is some text 
  []</p>
</div>

Jetzt muss ich zweimal die Rücktaste drücken, um zur vorherigen Zeile zurückzukehren (dieser Fall ist nicht so schlimm, hat aber nicht viele Einrückungen).

Kennen Sie einen besseren Weg?

nobe4
quelle
1
ctrl+wzweimal scheint zu funktionieren und ziemlich einfach zu sein
reergymerej

Antworten:

10

Wie wäre es mit:

inoremap <C-\> <C-o>:left 0<Cr><BS>

<C-o>Führt einen Normalmodus-Befehl ( :left 0) aus, der alle Einrückungen entfernt. Dadurch wird der Cursor auch an den Zeilenanfang gesetzt. <BS>bringt Sie zurück in die letzte Zeile.

Dies ist ein bisschen wie ein "Rückwärts J".

Leider scheint die Zuordnung von Umschalt + Eingabetaste oder Strg + Eingabetaste nicht möglich zu sein, daher wähle ich <C-\>"in der Nähe der Eingabetaste".

Martin Tournoij
quelle
"Near the Enter" hängt von Ihrer Tastatur ab: In Großbritannien steht "" neben der Linksschicht :-)
TripeHound
2
Warum nicht <C-u>statt verwenden <C-o>:left 0<CR>?
Jamessan
@jamessan Das funktioniert als "rückwärts J": Also foo<CR>bar<C-\>wirst du mit lassen foobar. IMHO ist es nützlicher, aber YMMV.
Martin Tournoij
Richtig, aber ich sage, dass <C-u>(dh i_CTRL-U ) dasselbe sein sollte wie <C-o>:left 0<CR>.
Jamessan
1
@ Jamessan Nun, das hängt von der Cursorposition ab. Wenn foo<CR>bar<C-u>Sie etwas eingeben , erhalten Sie foo<CR>(+ einen von Vim eventuell hinzugefügten automatischen Einzug). <C-o>:left 0<CR>verhält sich unabhängig von der Cursorposition immer gleich.
Martin Tournoij
21

Ich habe dies in meinem vimrc, der zweite Teil ist relevant:

inoremap <expr> <silent> <cr> pumvisible() ? "<c-y>" : "<c-g>u<cr>"

Was dies bewirkt: Jedes Mal, wenn Sie Enterim Einfügemodus drücken , wird "die Rückgängig-Sequenz unterbrochen , neue Änderung gestartet" (siehe h: i_CTRL-G_u). Das bedeutet, dass wenn Sie drücken Sie Enterversehentlich, Sie können jetzt rückgängig machen Ihre Änderung ohne vorherige eingefügten Zeilen zu entfernen, entweder mit ESC u aoder mit Ctrl-o u, wie Statox vorgeschlagen. Grundsätzlich kann jede Zeile einzeln rückgängig gemacht werden.

Quelle

BEARBEITEN / AKTUALISIEREN: Wenn Sie die Vim-Emulation in Emacs verwenden, auch bekannt als Böse-Modus , können Sie dieses Paket für einen ähnlichen Effekt verwenden.

VanLaser
quelle
Jetzt bin ich gespannt auf den ersten Teil und den <c-y>Zusammenhang mit dem Popup-Menü.
8bittree
2
Siehe diese Antwort: vi.stackexchange.com/a/3844/1800 . Ctrl-yim Einfügemodus wird die aktuelle Popup-Auswahl vervollständigt, und die obige Zuordnung wird es auch ermöglichen, Enterzu vervollständigen.
VanLaser
Guter Trick. Allerdings würde ich wahrscheinlich den letzten Teil "<c-g>u<cr>"durch ersetzen &paste ? "<cr>" : "<c-g>u<cr>", da Sie sonst beim nächsten Einfügen aus Versehen 200 Zeilen HTML-Code viel Spaß daran haben, ihn rückgängig zu machen. :)
lcd047
2
... und die Erklärung: Wenn eingeschaltet pasteist, sind Zuordnungen im
Einfügemodus
1
Diese Lösung gefällt mir besser, da die anderen Lösungen, die auf Rücktaste, Strg-W und Strg-U basieren, je nach backspaceEinstellung der Option möglicherweise nicht funktionieren .
DoubleDown
4

So mache ich es Ctrl-wBackspace.

Ctrl-wum das letzte wort zu löschen (ich habe vergessen, ob dies standard vim ist oder nicht) und da es nur ein Leerzeichen ist, werde ich zum anfang der zeile zurückkehren. Dann Backspacebringe ich mich zurück zur vorherigen Zeile, in der ich war.

Juan Enrique Muñoz Zolotoochin
quelle
Süß, ich wusste nichts über die Ctrl-wVerwendung im Einfügemodus. Der Carpetsmoker ♦ ist aber noch schneller. Daher scheint die Standardbindung von "Strg-" nicht so nützlich zu sein.
nobe4
1
Strg + w "Standard Vim" ;-) Siehe auch : :help i_CTRL-W. Und zweimal drücken reicht auch?
Martin Tournoij
1
Ich habe gerade auf der <C-u>
Hilfeseite gesehen,