vim - cómo - salir del editor vi
Evite que el cursor retroceda un carácter en la salida del modo de inserción (5)
Aunque hay trucos para manejar esto (como las asignaciones de ESC 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. Específicamente, dada la cadena abcDefg
con el cursor en la D
:
Si presiona i , la ubicación del modo de inserción estará entre
c
yD
Un ESC normal colocará el cursor sobrec
;<CO>:stopinsert<CR>
(o el método de retroceso) colocará el cursor enD
Si presiona a , la ubicación del modo de inserción estará entre
D
ye
. Un ESC normal colocará el cursor sobreD
;<CO>:stopinsert<CR>
pondrá el cursor sobree
.
Si REALMENTE quieres hacer esto, podrías mezclarlo 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: recuerda que esto solo tratará con i
y a
como métodos de entrada: si usas el modo de bloque visual, I
, o A
o lo que sea, necesitarás encontrar nuevos comandos para que coincidan (y hay una gran cantidad de ellos). Por lo tanto, recomiendo encarecidamente que no hagas esto.
Personalmente, recomendaría acostumbrarme al comportamiento predeterminado. Puedes hacer que sea lógico para i
O lógico para a
. Si cambia la configuración predeterminada a lógica para i
a expensas de la lógica para a
, se confundirá cuando use una instalación estándar de vi / vim.
...¿como lo harias?
tarea para obtener crédito adicional: encuentre una forma de forzar a vim a actualizar la posición del cursor inmediatamente después de salir del modo insertar
Aunque no recomendaría cambiar la mecánica predeterminada del cursor, una forma de lograr el comportamiento en cuestión es utilizar la siguiente asignación de modo Insertar.
:inoremap <silent> <Esc> <Esc>`^
Aquí la tecla Esc está sobrecargada en modo Insertar para ejecutar adicionalmente el comando `` ^ `que mueve el cursor a la posición donde estaba la última vez que se detuvo el modo Insertar. Dado que en este mapeo 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 Vim se compile con la función +ex_extra
.
Creo que la forma correcta de hacerlo es
au InsertLeave * call cursor([getpos(''.'')[1], getpos(''.'')[2]+1])
Qué pasa:
:imap <Esc> <Esc><Right>
inoremap <silent> <Esc> <C-O>:stopinsert<CR>
en tu .vimrc