En vim, ¿evita que el cursor se mueva cuando salgo del modo de edición?

9

En vim, si entro y salgo del modo de edición sin hacer nada, el cursor termina un carácter a la izquierda. Y si entro y salgo del modo agregar, el cursor se mueve hacia adelante y luego hacia atrás.

¿Alguna forma de configurar vim para dejar el cursor solo en estos casos?

Idealmente, solo quiero ingresar siempre al modo agregar, pero sin mover el cursor cuando entro o salgo del modo.

(Actualmente, generalmente uso el modo de inserción porque no estropea mi posición de cuidado al ingresar. Es decir, excepto cuando necesito agregar al final de la línea, en cuyo caso juro por vim por comportarme de una manera tan arcaica , presione Esc e ingrese al modo de agregar).

RomanSt
fuente
1
Las respuestas a esta pregunta son buenas. Solo quiero señalar que si son correctos en sus suposiciones de que usas i para ir al modo de edición, entonces eso es lo que está causando el retroceso. Si usa 'a' (no A) funcionará como espera.
Johnny
@ Johnny, no creo que lo haga. Normalmente estoy en modo "normal", moviéndome por el archivo y esas cosas. Cuando necesito hacer una edición, primero coloco el cursor, luego presiono "a", y luego descubro que lo había colocado mal, porque se mueve hacia la derecha. Dado que paso el 99% de mi tiempo de edición en editores modernos, no hay posibilidad de que recuerde colocar un personaje a la izquierda antes de presionar "a". Es por eso que esperaba una macro o algo así.
RomanSt
Es una cuestión de hábitos. Es realmente molesto, pero solo los primeros años. Que finalmente va a aprender a prensa io asin pensar en ello, y puede ser incluso s, S, ci", etc en lugar de la limitada iy a.
Luc Hermitte
1
Entiendo tu frustración pero. Intenta pensar en lo que estás haciendo. Pregúntese si hay una mejor manera de hacerlo (que usar Vim como un editor de texto normal, es decir). He encontrado con Vim que siempre hay una mejor manera, la forma en que Vim hace las cosas. Podemos ayudar, pero tenemos que saber qué estás haciendo cuando tienes problemas. ¿Entra, por ejemplo, en modo de edición cuando desea eliminar algo? No, hay 'x' para eliminar caracteres. Quiere reemplazar un personaje, luego está 'r'. Solo piensa en lo que quieres lograr.
Johnny
@johnny Entiendo de lo que estás hablando, pero requiere demasiado reaprendizaje para que tenga sentido para mí. Paso el 99% de mi tiempo de edición en Visual Studio y me encanta. Solo sé que no volveré a aprender esto, así que no tiene sentido perder el tiempo.
RomanSt

Respuestas:

9

Esta pregunta se hace con frecuencia entre los nuevos usuarios de vi / Vim, y la respuesta es que mientras está en modo normal, el cursor siempre está "en" un carácter, pero en modo de inserción el cursor siempre está "entre" dos caracteres (recuerde, el final -of-line es un personaje). Realmente no puede ver esto ilustrado también en la consola Vim, pero en la GUI notará que el cursor se convierte en una barra entre dos caracteres cuando ingresa al modo de inserción, en lugar de un bloque sobre un carácter cuando está en modo normal.

Entonces, lo que está viendo no es necesariamente el cursor que mueve un carácter hacia atrás cuando abandona el modo de inserción, sino simplemente moverse hacia un personaje. La única dirección segura de movimiento es hacia la izquierda (o hacia atrás). Por lo tanto, tiene más de una forma de ingresar al modo de inserción:

  • "a" ingresa al modo de inserción con el cursor "entre" el carácter en el que estaba el cursor y el siguiente carácter a la derecha.
  • "i" ingresa al modo de inserción con el cursor "entre" el carácter en el que estaba el cursor y el carácter anterior a la izquierda.

Algunas personas han hecho esfuerzos para suprimir este "movimiento" que no les gusta, pero que inevitablemente interfiere con los complementos y otros scripts de Vim que desean ejecutar en el futuro.

Mi sugerencia es acostumbrarse a usar los comandos "a" e "i" (y "A" e "I") en las circunstancias apropiadas.

Los comandos "o" y "O" también son útiles para aprender. Ver:

:help a
:help i
:help A
:help I
:help o
:help O

Editar: si aún está decidido a cambiar este comportamiento, pruebe este consejo: evite que el escape mueva el cursor un carácter hacia la izquierda

Heptita
fuente
1
Entiendo lo que estás diciendo, pero "i" / "Esc" / "i" / "Esc" causa un movimiento neto general real del cursor. Realmente creo que VIM simplemente no es para mí.
RomanSt
2
@romkyns: Creo que lo que debes hacer es usar en alugar de i.
Pausado hasta nuevo aviso.
1
@Dennis estuvo de acuerdo, "a" es un poco mejor porque permite que el cursor esté antes del primer carácter y después del último carácter en una línea, lo que "i" rechaza arbitrariamente. Pero lo intenté; lo que sucede es que siempre extravío el cursor antes de presionar "a", por lo que tengo que moverlo inmediatamente hacia la izquierda. Cada vez. Se cansó, así que cambié a "i".
RomanSt
@Heptite ¿Podrías señalarme una implementación tan defectuosa de algo que suprime el movimiento? Las posibilidades de que quiera usar complementos u otros scripts en el futuro son esencialmente cero.
RomanSt
1
@romkyns, (no) funciona en ambos sentidos. La reasignación <esc>evitará que la mayoría de los complementos <esc>funcionen correctamente, pero también continuará molestándote cuando uses otras características estándar que regresen al modo normal de la misma manera <esc>. Aprender a usar la tecla correcta sobre la marcha es la solución que escala / funciona a largo plazo.
Luc Hermitte
1

Creo que por quilate te refieres a tu cursor y si estás usando "i" esto se insertará directamente donde está tu cursor, "a" (que creo que estás buscando) mueve el cursor un carácter a la derecha. Además, shift-i (I) irá al comienzo de la línea y shift-a (A) irá hasta el final de la línea.

Si he entendido mal su pregunta, me disculpo.

Dan M.
fuente
1

Dado que la reasignación <ESC>se considera 'arriesgada', simplemente la combino con uno de los enfoques clave de Evitar el escape y tengo lo siguiente en mi .vimrc:

 inoremap ii <ESC>l

Nota: Asegúrese de que no haya caracteres de espacio al final de la línea.

Simple, pero totalmente certificado como "funciona bien para mí", ya que eso es exactamente lo que tendría que escribir a mano.

Ya sea que lo use ao isigo teniendo el comportamiento de retroceso y me molesta mucho, la mayoría de las veces lo siguiente que quiero escribir es d$eliminar al final de una línea, etc.

atomicules
fuente
Sorprendentemente simple solución. Lo mejor que he encontrado.
Tyler Collier
1

Aquí está mi solución:

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

Es gracioso. Esta misma pregunta existe en los tres sitios: SO, SU, Unix + Linux.

Steven Lu
fuente
No me parece divertido :) Afortunadamente, he encontrado un editor que no me vuelve loco (diakonos), por lo que esto ya no es un problema. Aún así, votaron por aquellos a quienes les gusta vim.
RomanSt