¿Cómo salto a la ubicación de mi última edición?

68

A menudo hago cambios en el medio de un archivo grande, uso ggpara saltar a la parte superior para verificar algo, y luego me doy cuenta de que olvidé establecer una marca donde estaba editando. ¿Hay una forma integrada de saltar a la ubicación de la última línea cambiada?

Bdesham
fuente

Respuestas:

84

El `.comando lo llevará a su último cambio.

El `va a una marca, y .es una marca "especial" que se establece automáticamente en la posición donde se realizó el último cambio. Consulte :help `.para obtener más información.

También existe lo ``que lo llevará de regreso a donde estaba el cursor antes de que hiciera su último salto. Ver : ayuda`` para más información.

Otra marca útil es `^; Esta es la posición donde el cursor fue la última vez que se detuvo el modo de inserción. Ver :help `^.

Consulte :help mark-motionspara obtener información más general sobre el uso de marcas (incluidas algunas otras marcas "especiales" que se configuran automáticamente).

howardh
fuente
77
También puede usar g;y g,para moverse entre las posiciones en la lista de cambios. Ver :h g;y:h g,
Peter Rincker
3
También puede usar '(apóstrofe) en lugar de `(retroceso).
Sparhawk
21

Aquí hay otro enfoque que se ajusta a su escenario dado, y saltará a donde estaba inmediatamente antes de gg(no a la última línea cambiada).

Utilizar CtrlO

Cuando presiona gg, su antigua posición del cursor se empuja a la lista de salto . De :help jumplist:

Los saltos se recuerdan en una lista de saltos. Con el comando CTRL-Oy CTRL-Ipuede 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.

[...]

Si usa un comando de salto, el número de línea actual se inserta al final de la lista de salto. Si la misma línea ya estaba en la lista de salto, se elimina. El resultado es que al repetir CTRL-O, volverá a las posiciones anteriores solo una vez.

Esto requiere que esté usando Vim (no vi) con la +jumplistfunción. Si :echo has('jumplist')imprime 1, entonces puede usar esto.

wchargin
fuente
19

Para agregar a la respuesta de dnetserr y al comentario de Peter Rincker, Vim mantiene una lista de cambios y tiene algunos comandos asociados con esto.

:changes

enumerará los cambios, mostrándole dónde estaban y qué eran. Por ejemplo:

change line  col text
    2     8   17 #include <stdio.h>
    1     3    0 #include "stm32f407.auto.h"
>

La línea con los >espectáculos muestra en qué parte de la pila de cambios se encuentra, algo así como la lista de salto ( :jumps) o la pila de etiquetas ( :tags). También, como la lista de salto y la pila de etiquetas, puede recorrer esta lista.

En el modo normal, los movimientos son g;ir a una ubicación de cambio anterior e g,ir a la siguiente. También puede escribir el número del cambio antes g;o g,para ir a ese cambio de la lista. Arriba, 2g;me llevaría a donde ocurrió el cambio que involucra stdio.h.

Cuando está en el medio de la pila, los números de las :changesactualizaciones muestran las distancias relativas. Por ejemplo:

change line  col text
    1     8   17 #include <stdio.h>
>   0     3    0 #include "stm32f407.auto.h"
    1    10    4 other

Esto muestra que puedo retroceder uno ( 1g;o solo g;) o avanzar uno ( 1g,o solo g,).

Esto es genial si el cambio al que quieres llegar realmente ocurrió hace algunas modificaciones

La desventaja de esto es que no parece actuar como un movimiento normal. Por ejemplo, no se puede hacer dg;para eliminar desde el cursor hasta el punto de cambio anterior, mientras que d'.y d'^hacer el trabajo como movimientos.

John O'M.
fuente
15

g; irá a la línea editada previamente.

dnetserr
fuente
3
También puede usar g, (coma) para ir a una nueva posición de edición.
James
5

Como el comando Deshacer en Vi actuará como rehacer cuando se deshizo el último comando, lo he utilizado uucomo un medio para volver a donde edité por última vez.

Si está ejecutando Vim con nocompatibleset (como lo hace la mayoría de la gente), desea usar useguido de CTRL+Rpara deshacer y rehacer. De uulo contrario funcionará como en Vi.

hlovdal
fuente
Lo hará si :set nocompatibleno se usa.
muru
2
Mi vim(con nocompatible) hace dos deshacer con uu, pero yo uso uy CTRL+rpara el mismo efecto.
Shahbaz
Esta respuesta tiene la ventaja de que también funciona con vi, en caso de que no tenga vim en Aix / HPUX / Solaris / otras variantes de Unix.
Guntram Blohm