Annulla <CR> in modalità inserimento


21

A volte in modalità inserimento ho colpito <CR>per errore e devo colpire il backspace più volte (dipende dal rientro) per tornare dove mi trovavo.

per esempio

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

Il cursore è []e premo <CR>:

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

Ora devo colpire backspace due volte per tornare alla riga precedente (questo caso non è poi così male ma non ha molta rientranza).

Conosci un modo migliore di fare?


1
ctrl+wdue volte sembra funzionare ed essere abbastanza facile
reergymerej,

Risposte:


10

Che ne dite di:

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

<C-o>eseguirà un comando in modalità normale ( :left 0), che rimuoverà tutti i rientri, posizionando anche il cursore all'inizio della riga. <BS>ti riporterà all'ultima riga.

Questo è un po 'come un "indietro J".

Sfortunatamente, la mappatura di Maiusc + Invio o Ctrl + Invio non sembra possibile, quindi scelgo <C-\>, essendo "vicino all'invio".


"Near the enter" dipende dalla tua tastiera: quelli del Regno Unito hanno `` accanto al turno di sinistra :-)
TripeHound

2
Perché non usare <C-u>invece di <C-o>:left 0<CR>?
Jamessan,

@jamessan Funziona come un "arretrato J": quindi foo<CR>bar<C-\>ti lascerò con foobar. IMHO è più utile, ma YMMV.
Martin Tournoij,

Giusto, ma quello che sto dicendo è che <C-u>(cioè i_CTRL-U ) dovrebbe essere lo stesso di <C-o>:left 0<CR>.
Jamessan,

1
@jamessan Bene, dipende dalla posizione del cursore. La digitazione foo<CR>bar<C-u>ti lascerà con foo<CR>(+ qualsiasi rientro automatico che Vim potrebbe aver aggiunto). <C-o>:left 0<CR>si comporterà sempre lo stesso indipendentemente dalla posizione del cursore.
Martin Tournoij,

21

Ho questo nel mio vimrc, la seconda parte è rilevante:

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

Cosa fa: ogni volta che premi Enterin modalità inserimento, "interromperà anche la sequenza di annullamento, avvierà una nuova modifica" (vedi h: i_CTRL-G_u). Ciò significa che, se colpisci Enterper errore, ora puoi annullare la modifica senza rimuovere le precedenti righe inserite, con ESC u ao con Ctrl-o u, come proposto da Statox. Fondamentalmente, ogni riga può essere annullata separatamente.

fonte

MODIFICA / AGGIORNAMENTO: Se ti capita di usare l'emulazione Vim in Emacs, aka modalità malvagia , puoi usare questo pacchetto per un effetto simile.


Ora sono curioso della prima parte e di come si <c-y>collega al menu a comparsa.
8bittree

2
Vedi questa risposta: vi.stackexchange.com/a/3844/1800 . Ctrl-yin modalità inserimento completerà la selezione popup corrente e anche la mappatura sopra consentirà Enterdi completare.
VanLaser,

Bel trucco. Tuttavia, probabilmente sostituirei l'ultima parte "<c-g>u<cr>"con &paste ? "<cr>" : "<c-g>u<cr>", altrimenti la prossima volta che incolperai per errore 200 righe di HTML ti divertirai molto a annullarlo. :)
lcd047

2
... e la spiegazione: quando pasteè attiva, le mappature della modalità Inserisci sono disabilitate (secondo l'aiuto di Vim)
VanLaser

1
Mi piace di più questa soluzione perché le altre soluzioni basate su Backspace, Ctrl-W e Ctrl-U potrebbero non funzionare a seconda di come backspaceè impostata l' opzione.
doubleDown

4

Il modo in cui lo faccio è Ctrl-wBackspace.

Ctrl-wper eliminare l'ultima parola (ho dimenticato se questo è vim standard o meno), e poiché sono solo spazi, mi riporterà all'inizio della riga. Quindi Backspacemi riporterà alla riga precedente in cui mi trovavo.


Dolce, non sapevo Ctrl-wdell'uso in modalità insert. Ma Carpetsmoker ♦ è ancora più veloce. Quindi l'associazione di default di `Ctrl- \` non sembra così utile.
nobe4,

1
Ctrl + w è "standard Vim" ;-) See: :help i_CTRL-W. E premere due volte sembra fare anche il trucco?
Martin Tournoij,

1
Ho appena visto sulla pagina di aiuto che <C-u>potrebbe essere più utile in quanto elimina tutti i personaggi della nuova riga
nobe4

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.