2010-02-19 14 views
28

... ¿cómo lo haría?Evitar que el cursor retroceda un carácter en el modo de inserción salir

tarea para crédito adicional: encontrar una manera de forzar vim para actualizar la posición del cursor inmediatamente después de salir del modo de inserción

+6

pregunta interesante. Me pregunto cuál es la razón detrás de este comportamiento. Lo acabo de aceptar. –

+2

Lo probé. Es un poco incómodo. Con el cursor en movimiento, puedo * ver * si dejo el modo de edición. –

+1

@StefanoBorini Hay una parte de la explicación en [esta pregunta aquí] (http://stackoverflow.com/questions/3676388/cursor-positioning) en SO. Según lo entiendo: cuando salgas del modo Insertar, vi no sabe si ingresaste usando 'a' o' i', por lo que asume 'a'. Y realmente: el cursor no se "desliza" cuando se usa 'a' y Esc repetidamente. –

Respuesta

20

Aunque no recomendaría cambiar la mecánica predeterminada del cursor, una forma de de lograr el comportamiento en cuestión es usar el siguiente modo Insertar mapeo.

:inoremap <silent> <Esc> <Esc>`^ 

Aquí la tecla Esc está sobrecargado en el modo Insertar para funcionar, además, el comando ``^`que se mueve el cursor a la posición en la que fue la última modo Insertar momento en que se detuvo. Dado que en esta asignación se ejecuta inmediatamente después de salir del modo Insertar con Esc, el cursor deja un carácter a la derecha en comparación con su posición con el comportamiento predeterminado.

A diferencia de algunas otras soluciones, esta no requiere que se compile Vim con la función +ex_extra.

+0

Esto no funciona con 'a'. – DrAl

+0

Sí, y es más consistente, creo. Agregar ya significa mover el cursor un carácter a la derecha independientemente de que haya ingresado caracteres o no. –

+0

Eso depende de dónde piense que está el cursor: si considera que el cursor está justo después del carácter resaltado, 'a' se inserta en la posición actual y' i' mueve el cursor hacia atrás y lo inserta. De cualquier forma es lógico dependiendo de dónde se considere el cursor. Creo que las personas que escribieron vi lo consideraron después del personaje resaltado. – DrAl

7
inoremap <silent> <Esc> <C-O>:stopinsert<CR> 

en su .vimrc

+0

Esta asignación hará que sea lógico si ingresa el modo de inserción con 'i' pero ilógico si ingresa el modo de inserción con' a'. – DrAl

+1

bien, podría reasignar el modo normal 'i' para establecer un indicador, luego reasignar el modo de inserción' 'para verificar ese indicador, y si está establecido, use' : stopinsert ', y luego borre el indicador en ambos sentidos. – rampion

+0

No estoy seguro de que esto sea del todo ilógico para 'a'. En general, después de cada cambio, cuando dejo ese cambio, he terminado con ese cambio, y lo siguiente que me gustaría hacer probablemente implique hacer un cambio diferente. Por lo tanto, para mí, al salir del modo insertar (no importa cómo lo ingrese), generalmente preferiría que el cursor estuviera en el siguiente carácter, así que estoy listo para mi siguiente cambio, en lugar de estar preparado para cambiar lo que acabo de hacer. insertado. (principalmente copiado de mi comentario aquí: http://unix.stackexchange.com/a/11403/38050) –

-1

¿Qué hay de:

:imap <Esc> <Esc><Right> 
+0

Con ciertas configuraciones, eso moverá el cursor a la siguiente línea si la edición ocurrió al final de la actual. –

+0

@Pavel: no había pensado en eso, gracias. –

+1

Incluso ignorando lo del final de línea, esto hará que sea lógico si ingresa el modo de inserción con 'i' pero ilógico si ingresa el modo de inserción con' a'. – DrAl

16

Aunque hay trucos para manejar esto (como las ESC asignaciones mencionadas en las dos publicaciones anteriores), no hay una forma consistente de hacerlo. La razón es que no hay forma de determinar el método que se usó para ingresar al modo de inserción. En concreto, dada la cadena abcDefg con el cursor en la D:

  • Si pulsa i, la ubicación modo de inserción será entre el c y D. Un normal ESC pondrá el cursor en c; <C-O>:stopinsert<CR> (o el método de retroceso) colocará el cursor en D.

  • Si pulsa un, la ubicación modo de inserción será entre el D y e. Un normal ESC pondrá el cursor en D; <C-O>:stopinsert<CR> pondrá el cursor en e.

Si realmente quiere hacer esto, se podía eludir con algo como esto:

let insert_command = "inoremap <ESC> <C-O>:stopinsert<CR>" 
let append_command = "iunmap <ESC>" 
nnoremap i :exe insert_command<CR>i 
nnoremap a :exe append_command<CR>a 

PERO: recuerde que esto sólo se ocupará de i y a como métodos de entrada: si use el modo de bloque visual, I, o A o lo que sea, tendrá que encontrar nuevos comandos para que coincidan (y hay muchos de ellos). Por lo tanto, recomiendo encarecidamente que no hagas esto.

Personalmente, recomendaría acostumbrarme al comportamiento predeterminado. Puede hacer que sea lógico para iO lógico para a. Si cambia el valor predeterminado a lógico para i a expensas de lo lógico para a, se confundirá cuando use una instalación estándar de vi/vim.

3

yo creo la forma correcta de hacerlo es

au InsertLeave * call cursor([getpos('.')[1], getpos('.')[2]+1]) 
+0

+1 porque esto no arruina la edición visual en bloque. –

+0

Sin embargo, esto no se comporta correctamente en la columna uno. Inserte 'if (getpos ('.') [2]> 1) |' antes de la 'llamada' para corregirlo. (Además, debe ser parte de un 'augroup' para evitar saltos acumulativos hacia adelante cuando se recarga un '.vimrc' que contiene este autocomando.) –

+0

¿Puede dar un ejemplo de cómo hacer lo de' augroup'? Gracias –

Cuestiones relacionadas