Deshacer <CR> en modo de inserción

21

A veces, en el modo de inserción, presiono <CR>por error y tengo que presionar la tecla de retroceso varias veces (depende de la sangría) para volver a donde estaba.

p.ej

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

El cursor es []y presiono <CR>:

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

Ahora tengo que presionar la tecla de retroceso dos veces para volver a la línea anterior (este caso no es tan malo pero no tiene mucha sangría).

¿Conoces una mejor manera de hacerlo?

nobe4
fuente
1
ctrl+wdos veces parece funcionar y ser bastante fácil
reergymerej

Respuestas:

10

Qué tal si:

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

<C-o>ejecutará un comando de modo normal ( :left 0), que eliminará todas las sangrías, esto también colocará el cursor al comienzo de la línea. <BS>te llevará de vuelta a la última línea.

Esto es un poco como un "al revés J".

Desafortunadamente, mapear Shift + Enter o Ctrl + Enter no parece posible, así que elijo <C-\>, como "cerca de la entrada".

Martin Tournoij
fuente
"Near the enter" depende de su teclado: los del Reino Unido tienen `` junto al desplazamiento a la izquierda :-)
TripeHound
2
¿Por qué no usar en <C-u>lugar de <C-o>:left 0<CR>?
jamessan
@jamessan Esto funciona como un "al revés J": por lo que foo<CR>bar<C-\>te dejará con foobar. En mi humilde opinión es más útil, pero YMMV.
Martin Tournoij
Correcto, pero lo que digo es que <C-u>(es decir, i_CTRL-U ) debería ser lo mismo que <C-o>:left 0<CR>.
jamessan
1
@jamessan Bueno, eso depende de la posición del cursor. Escribir foo<CR>bar<C-u>te dejará con foo<CR>(+ cualquier sangría automática que Vim pueda haber agregado). <C-o>:left 0<CR>siempre se comportará igual independientemente de la posición del cursor.
Martin Tournoij
21

Tengo esto en mi vimrc, la segunda parte es relevante:

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

Qué hace esto: cada vez que pulse Enteren modo de inserción, también "romperá la secuencia de deshacer, comenzará un nuevo cambio" (ver h: i_CTRL-G_u). Esto significa que, si acierta Enterpor error, ahora puede deshacer su cambio sin eliminar las líneas insertadas anteriormente, ya sea con ESC u ao con Ctrl-o u, como propuso Statox. Básicamente, cada línea se puede deshacer por separado.

fuente

EDITAR / ACTUALIZAR: Si utiliza la emulación Vim en Emacs, también conocido como modo malvado , puede usar este paquete para obtener un efecto similar.

VanLaser
fuente
Ahora tengo curiosidad sobre la primera parte y cómo se <c-y>relaciona con el menú emergente.
8bittree
2
Vea esta respuesta: vi.stackexchange.com/a/3844/1800 . Ctrl-yen el modo de inserción completará la selección emergente actual, y la asignación anterior también permitirá Entercompletarla.
VanLaser
Buen truco. Sin embargo, probablemente me sustituir la última parte "<c-g>u<cr>"de &paste ? "<cr>" : "<c-g>u<cr>", de lo contrario la próxima vez que se pega por error 200 líneas de HTML usted tendrá un montón de diversión deshacerlo. :)
lcd047
2
... y la explicación: cuando pasteestá activado, las asignaciones del modo Insertar están desactivadas (según la ayuda de Vim)
VanLaser
1
Esta solución me gusta más porque las otras soluciones que dependen de Retroceso, Ctrl-W y Ctrl-U podrían no funcionar dependiendo de cómo backspacese configure la opción.
doubleDown el
4

La forma en que lo hago es Ctrl-wBackspace.

Ctrl-wpara eliminar la última palabra (olvidé si esto es vim estándar o no), y dado que son solo espacios, me llevará de regreso al comienzo de la línea. Luego Backspaceme llevará de vuelta a la línea anterior donde estaba.

Juan Enrique Muñoz Zolotoochin
fuente
Dulce, no sabía sobre el Ctrl-wuso en modo de inserción. Pero el Carpetsmoker ♦ es aún más rápido. Por lo tanto, el enlace predeterminado de `Ctrl- \` no parece tan útil.
nobe4
1
Ctrl + W es "Vim estándar" ;-) Ver: :help i_CTRL-W. ¿Y presionarlo dos veces parece hacer el truco también?
Martin Tournoij
1
Acabo de ver en la página de ayuda que <C-u>puede ser más útil, ya que elimina todos los caracteres en la nueva línea
nobe4
1

Mi salida de esto es (desde el modo de inserción) UpCtrl-oJDel. Posiblemente no sea la combinación más eficiente, pero es lo que estoy haciendo sin necesidad de pensarlo.

lcd047
fuente
Ver también: ¿Cómo unir líneas sin producir un espacio? .
Martin Tournoij