¿Por qué el cursor se mueve al inicio de la línea después de <Esc>?


12

He notado que mientras editaba a lo largo de una línea en un archivo .txt en modo de inserción, el cursor se moverá al comienzo de la línea después de una escritura usando la secuencia de teclas:

<esc>:w

Me gustaría cambiar este comportamiento de modo que el cursor permanezca en posición después de: escribir. es posible? No necesito que el cursor permanezca en modo de inserción, solo me gustaría que mantenga su última posición después de una escritura.

Estoy usando gVim 7.4 en Windows. Mi .vimrc es muy básico, no creo que ninguna de mis configuraciones interfiera con este comportamiento. También he eliminado el abastecimiento de mswin.vim y example.vim de mi .vimrc (como se incluye con el instalador oficial de Windows vim.org).

Después de leer los comentarios a continuación, volví a mirar el problema y me di cuenta de que el cursor solo se desliza hacia el extremo izquierdo después de escribir en líneas que están formadas por espacios en blanco. En otras palabras, el cursor solo se desliza hacia el extremo izquierdo en esc-: w cuando la línea es una sangría colgante sin otros caracteres además de los espacios . El .vimrc maneja los comportamientos de sangría con esta configuración:

set tabstop=4
set softtabstop=4
set shiftwidth=4
set expandtab
set autoindent 

Por lo tanto, una nueva línea creada debajo de una línea con sangría contendrá 4 espacios en blanco finales como los primeros 4 espacios de la línea (que quiero mantener). Sobre la tecla 'esc' presione el cursor desliza hacia el extremo izquierdo del búfer.

¿Hay alguna manera de retener la posición del cursor al presionar 'esc' para volver al modo normal, en una línea compuesta por espacios en blanco al final (como sangría)?


3
Nunca he notado este comportamiento en Vim en ninguna plataforma ... ¿Qué sucede si inicia gVim como: gvim -u NONE -U NONE(puede usar cmd.exe o hacer un acceso directo)? Esto evitará cargar sus archivos (g) vimrc.
Martin Tournoij

1
¿Es ese tu archivo vimrc completo ? Mi primera sospecha sería que un autocmd en su archivo vimrc está eliminando los espacios en blanco finales. ¿Cambia el comportamiento cuando inicia gVim sin ningún archivo vimrc (vea el comentario anterior)?
Martin Tournoij

Lo anterior no es mi .vimrc completo, también hay otras configuraciones. Ejecutar gVim sin un .vimrc (: scriptnames muestra que no hay .vimrc o .gvimrc) resuelve mi problema. Tienes toda la razón, necesito revisar mi .vimrc o alguna otra fuente que pueda estar causando esto.
Jim

Aparentemente, esta eliminación de espacios en blanco en nuevas líneas es un comportamiento deseable, estoy leyendo aquí , está destinado a mantener el archivo limpio de espacios en blanco.
Jim

Se trata de abrir nuevas líneas ... ¿No se trata de escribir en un archivo?
Martin Tournoij

Respuestas:


11

Mirando la documentación para autoindent tiene una respuesta de por qué y cómo solucionarlo. :help 'autoindent':

Copie la sangría de la línea actual cuando comience una nueva línea (escribiendo <CR> en modo Insertar o usando el comando "o" u "O"). Si no escribe nada en la nueva línea excepto <BS>o CTRL-Dy luego escribe <Esc>, CTRL-Oo <CR>, la sangría se elimina nuevamente. Mover el cursor a otra línea tiene el mismo efecto, a menos que el indicador 'I' esté incluido en 'cpoptions'.

En otras palabras, si desea que no pierda la sangría, escriba algo y luego retroceda antes de presionar Esc, y el espacio inicial permanecerá.

Alternativamente, si solo desea volver al nivel de sangría cuando regrese al modo de inserción y también lo esté utilizando 'cindent', use en Shift-Slugar de i, lo que borrará la línea (ya vacía) y comenzará en el nivel de sangría apropiado. Esta no es una solución tan general como la anterior, pero prefiero esto cuando escribo código C, para que mis archivos no se guarden realmente con líneas de solo espacios en blanco.


Esta es una respuesta definitiva a mi pregunta de la documentación original. Gracias por el resumen y la narración. No habría pensado en investigar: h autoindent para esta información. Gracias también a @Carpetsmoker por la discusión que condujo a una solución.
Jim

Esto resolvió un problema que tenía al involucrar la reasignación de o y O para no abandonar el modo de inserción, sino para mantener la sangría. Esto se puede hacer haciendo nnoremap o o <BS><Esc><DEL>, ynnoremap O O <BS><Esc><DEL>
Max Coplan

¡Muchas gracias!
Max Coplan
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.