Vim: mueve el cursor a su última posición

251

¿Es posible en (g) Vim mover el cursor a su posición anterior (mientras está en modo normal)? Sería ideal hacer un ciclo de ida y vuelta en la lista de posiciones anteriores del cursor. Pero también bastaría con cambiar a la última ubicación (algo así como cd -bash con directorios).

Aquí hay una pequeña demostración:

line |1| <- cursor position
line 2
line 3
line 4

Y supongamos que lo hice 2j, así es como es ahora:

line 1
line 2
line |3| <- cursor position
line 4

Ahora me gustaría presionar algo (que no sea 2kobviamente) para volver a la primera posición y posiblemente a las posiciones anteriores.

Idan K
fuente

Respuestas:

409

La forma más rápida es golpear:

''

(dos apóstrofes) o:

``

(dos backticks) Tenga en cuenta que la diferencia es que la tecla de retroceso va a la misma ubicación en la línea, mientras que el apóstrofe va al comienzo de la línea. En un teclado del Reino Unido, el apóstrofe es más accesible, por lo que tiendo a usarlo. Hay un montón de marcas útiles como esta, ver :help mark-motions.

Para algunos otros movimientos (no 2jcreo), también está la lista de salto que te permite navegar de un lado a otro entre varios movimientos. CtrlOy CtrlIhaga esta navegación, pero vea :help jump-motionspara más información.

DrAl
fuente
3
en realidad ninguno de esos se comporta exactamente como esperaba, pero supongo que no hay nada más disponible.
Idan K
1
@Idan K: ¿cómo `` (doble retroceso) no te da exactamente lo que quieres? (Excepto por el aspecto de "historia").
Dan
3
@Dan: si lo intento en el ejemplo anterior, veo este comportamiento: me paro en la línea 1, luego presiono jdos veces seguidas (ahora estoy en la línea 3) y luego presiono la tecla de retroceso doble me lleva a la línea 1 y espero para pasar a la línea 2.
Idan K
2
Creo que tiene que moverse (2j o algo), luego editar (o realizar cualquier acción para modificar el texto) y luego usar '' para volver a la posición anterior. No es lógico usar "2j", no hacer nada y volver a la posición anterior
Asenar
8
@IdanK El jumplist solo se actualiza (es decir, se registra la posición anterior del cursor) cuando usa un "salto" real, que es (creo) cualquier comando de movimiento que no sean los i j k lmovimientos. (La lista completa, de los documentos de ayuda, es "'"', "`", "G", "/", "?", n", "N", "%", "(", ")", "[[", "]]", "{", "}", ":s", ":tag", "L", "M", H" and the commands that start editing a new file). Entonces no, esto no se "deshacerá" 2jo algo similar, pero funcionará para casi todo lo demás. Esto tiene sentido porque 2jet al. ya tienen inversiones simples ( 2k, etc.), mientras que las demás no.
Kyle Strand
61

También puede usar g;y g,para retroceder y avanzar en la lista de sus ubicaciones de edición anteriores .

En teclados no estadounidenses

En mis diseños de teclado suizo y alemán, escribir ;inconvenientemente requiere usar la Shifttecla. Por lo tanto, definí g-como un alias más conveniente para g;en $MYVIMRC:

" Map g- as an alias for g;
nnoremap g- g;
Serge Stroobandt
fuente
Si bien me gusta mucho, solo saltará entre los cambios en un archivo. Si edita el búfer 1, luego edite el búfer 2, no volverá al búfer 1.
thouliha
39

¿Por qué nadie descubrió el problema con la respuesta de DrAl ? ¡El ''o ``no resolverá el problema original de esta publicación! Estos dos comandos no funcionarán para algunos movimientos del cursor como 2j, al menos para mí. Hará que el novato vim esté más confundido.

El comportamiento de ''o ``, y CtrlIo CtrlOse basa en la lista de salto. El 2jno guardará los cambios de posición en la lista de salto, por lo que estos comandos no funcionarán 2j.

''o ``cambiar entre la última posición y la posición actual. CtrlIy CtrlOtrabajar a través del historial de la lista de salto.

g;y g,moverse a través de las posiciones de edición, que también se usan con mucha frecuencia.

ZhaoGang
fuente
1
¡Gracias por señalar esto! Me pregunto, ¿qué funcionará para casos como 2jentonces?
33

Desde la ayuda (: ayuda a saltar):

: ju [mps] Imprime la lista de saltos (no un comando de movimiento). {no en Vi} {no disponible sin el | + jumplist | característica}

                          *jumplist*

Los saltos se recuerdan en una lista de saltos. Con el comando CTRL-O y CTRL-I, puede ir a las posiciones del cursor antes de los saltos más antiguos, y regresar nuevamente. Por lo tanto, puede moverse hacia arriba y hacia abajo en la lista. Hay una lista de salto separada para cada ventana. El número máximo de entradas se fija en 100. {no disponible sin | + jumplist | característica}

Facundo Casco
fuente