¿Por qué `ESC` mueve el cursor hacia atrás en vim?

62

En vim, cuando presiono ESCpara volver al modo de comando, el cursor mueve un carácter a la izquierda. Esto no es lo que esperaría, ocasionalmente golpeé de inmediato lpara volver a ese lugar, tal vez para eliminar un personaje.

¿Hay alguna razón para este comportamiento? ¿Es conveniente para un patrón de uso que me falta?

Eric Wilson
fuente
1
Nunca me había dado cuenta hasta ahora ... y uso vim todos los días. No tengo idea de por qué, pero estoy interesado en escuchar las respuestas.
Gabe.
55
al volver al modo de inserción, puede presionar 'a' para agregar en lugar de 'i' para insertar. Luego volverás a la posición en la que estabas antes de presionar escape.
penguin359

Respuestas:

40

En el modo de inserción, el cursor está entre caracteres, o antes del primero o después del último carácter. En modo normal, el cursor está sobre un carácter (las nuevas líneas no son caracteres para este propósito). Esto es algo inusual: la mayoría de los editores siempre colocan el cursor entre los caracteres y hacen que la mayoría de los comandos actúen sobre el carácter después (no, estrictamente hablando ) debajo del cursor. Esto quizás se deba en parte al hecho de que antes de las GUI, los terminales de texto siempre mostraban el cursor sobre un carácter (subrayado o bloque, quizás parpadeando). Esta abstracción falla en el modo de inserción porque eso requiere una posición más (publicaciones vs cercas).

Cambiar entre modos tiene que mover el cursor por medio carácter, por así decirlo. El icomando se mueve hacia la izquierda, para colocar el cursor antes del personaje que había terminado. El acomando se mueve hacia la derecha. Salir del modo de inserción (presionando Esc) mueve el cursor hacia la izquierda si es posible (si está al comienzo de la línea, se mueve hacia la derecha).

Supongo que el Esccomportamiento tiene sentido. A menudo, está escribiendo al final de la línea, y Escsolo puede ir a la izquierda. Entonces el comportamiento general es el comportamiento más común.

Piense en el carácter debajo del cursor como el último carácter interesante y en el comando de inserción como a. Puede repetir a Escsin mover el cursor, excepto que se le golpeará una posición a la derecha si comienza al principio de una línea no vacía.

Gilles 'SO- deja de ser malvado'
fuente
21

Visualmente, tiene más sentido en gvim:

Al editar, el cursor está entre los caracteres:
ingrese la descripción de la imagen aquí

Cuando está en modo normal, está encima del último carácter:
ingrese la descripción de la imagen aquí

Así que en realidad no se vuelve un personaje, sólo por estar entre r y sal estar en r

Martin Ueding
fuente
1
Gran foto Para ser honesto, estoy en el campamento que dice que el personaje mdebe permanecer resaltado al regresar al modo normal ...
Steven Lu
Ups los enlaces de imágenes ahora están muertos.
Steven Lu
1
enlaces de imagen ahora muertos.
Steven Lu
1
Sí, alojar sus imágenes manualmente es más trabajo y menos confiable que simplemente usar la herramienta en el editor de rebajas de este sitio.
Steven Lu
1
¿Hay de nuevo todo bien con ellos? Se trata de "cursor" lo que han escrito y su texto menciona "j"
poige
15

Este comportamiento es editable como se respondió aquí , pero deténgase y piense en lo que está sucediendo por un segundo. Cuando está en modo de inserción, en realidad no está sobre un personaje sino ENTRE ellos. Cuando inserta algo, el cursor salta al final de lo que insertó para que lo siguiente que se inserte sea después de eso. Ahora piense si simplemente escribió una carta y luego quiso hacerle algo. Golpear Esccolocaría el cursor de selección directamente sobre el último carácter que insertó. Si no hiciera esto, en realidad sería bastante incómodo.

La situación en la que probablemente esté pensando es cuando está en modo de inserción moviéndose como si fuera el modo normal y luego cambia. En ese caso, parece que el cursor retrocede un carácter, pero si piensa de esa manera, muestra que estaba en modo de inserción y que lo último que hizo fue NO insertar. ¿Tal vez deberías pasar más tiempo en modo normal?

Caleb
fuente
15
Eso no tiene sentido para mí. ¿Cómo explicas el comportamiento de caminar hacia atrás de las repeticiones iy las ESCpulsaciones de teclas?
Warren Young
44
Entrar en modo de inserción, no insertar nada, luego dejarlo no es una prueba justa. ¿Por qué estaría en modo de inserción si no inserta algo? Si inserta algo, volver al modo normal lo deja con el carácter que insertó seleccionado. Muy intuitivo
Caleb
44
No se trata de "justo", se trata de poder explicativo. Si su teoría de la operación no explica todo el comportamiento, está incompleto o el comportamiento de vi es inconsistente. Prefiero creer que vi es perfecto en todos los sentidos y, por lo tanto, consistente. :)
Warren Young
99
@Warren El comportamiento de "caminar hacia atrás" de iseguido por ESCes una función de iy es totalmente independiente de ESC; específicamente, cuando golpeas, ile estás pidiendo a vim que inserte un carácter, que por definición significa "insertar un carácter antes del que estoy", en lugar de a"agregar un carácter después de este".
Kromey
3
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 implicará hacer un cambio diferente. Por lo tanto, para mí, al salir del modo de inserción (no importa cómo lo ingresé), generalmente prefiero que el cursor esté en el siguiente carácter, así que estoy listo para mi próximo cambio, en lugar de estar listo para cambiar lo que acabo de cambiar. insertado.
Kyle Strand
6

Escriba Alt+ Lpara volver al modo de comando.

No requiere ninguna reasignación o cambio de configuración de vim. Funciona porque en la mayoría de los emuladores de terminal Alt+ KEYenvía un Escseguido de KEY(en xterm puede que necesite agregar una Xterm*metaSendsEscape: truelínea en su archivo ~ / .Xdefaults). Ese comportamiento le permite incluso "crear" otras combinaciones de modo de inserción que funcionan de inmediato, como Alt+ Sa Backspace.

Por cierto, tener el cursor encima del carácter que acabas de escribir puede ser muy inconveniente. Por ejemplo, Escdwno eliminará la palabra que sigue al texto que acaba de insertar.

usuario79932
fuente
Los inconvenientes a los que se refiere se pueden evitar escribiendo siempre un espacio en modo de inserción antes del escape. Luego, el cursor que sale del modo de inserción se coloca sobre el espacio, y puede escribir Esc d epara eliminar la palabra en frente. Volví al comportamiento predeterminado porque sentí que cambió otros comportamientos ya codificados en mi cabeza.
mljrg
4

Aquí está mi solución.

Es una versión más concisa de la solución ofrecida en la página de wikia sobre esto .

au InsertLeave * call cursor([getpos('.')[1], getpos('.')[2]+1])
Steven Lu
fuente
Haga clic aquí también en +1, por citar la página wiki, a pesar de que el usuario no estaba pidiendo una forma de cambiar este comportamiento.
Kyle Strand
Notará que si profundiza lo suficiente en Vim, muchos complementos se basan en el comportamiento predeterminado (poco intuitivo), por lo que si ve que algunas cosas comen o destrozan un solo personaje al azar, esto podría ser causado. Yo no uso este autocomando; Sin embargo, funciona bien.
Steven Lu