Come posso passare alla posizione della mia ultima modifica?


68

Apporto spesso modifiche al centro di un file di grandi dimensioni, utilizzo ggper saltare all'inizio per verificare qualcosa, quindi mi rendo conto di aver dimenticato di impostare un segno in cui stavo modificando. Esiste un modo integrato per saltare alla posizione dell'ultima riga modificata?

Risposte:


84

Il `.comando ti porterà all'ultima modifica.

La `va a un marchio, ed .è un segno di "speciale" che è impostata automaticamente alla posizione in cui è stata fatta l'ultima modifica. Vedi :help `.per qualche informazione in più.

C'è anche quello ``che ti riporterà al punto in cui si trovava il cursore prima di eseguire l'ultimo salto. Vedi : aiuto`` per maggiori informazioni.

Un altro segno utile è `^; questa è la posizione in cui il cursore è stato l'ultima volta in cui la modalità di inserimento è stata interrotta. Vedere :help `^.

Per :help mark-motionsulteriori informazioni generali sull'uso dei segni (vedere alcuni altri segni "speciali" che vengono impostati automaticamente).


7
È inoltre possibile utilizzare g;e g,per spostarsi tra le posizioni nell'elenco delle modifiche. Vedi :h g;e:h g,
Peter Rincker,

3
Puoi anche usare '(apostrofo) invece di `(backtick).
Sparhawk,

21

Ecco un altro approccio che si adatta al tuo determinato scenario e passerà al punto in cui ti trovavi immediatamente prima gg(non all'ultima riga modificata).

Uso CtrlO

Quando si preme gg, la posizione del cursore precedente viene inserita nell'elenco di salto . Da :help jumplist:

I salti sono ricordati in una lista di salti. Con l' CTRL-Oe CTRL-I comando è possibile andare a posizioni cursore prima salti più grandi, e viceversa. Quindi puoi spostarti su e giù nell'elenco. C'è una jump list separata per ogni finestra. Il numero massimo di voci è fissato a 100.

[...]

Se si utilizza un comando Jump, il numero di riga corrente viene inserito alla fine dell'elenco Jump. Se la stessa riga era già nell'elenco di salto, viene rimossa. Il risultato è che quando si ripete CTRL-Osi ritorna alle vecchie posizioni solo una volta.

Ciò richiede l'utilizzo di Vim (non vi) con la +jumplistfunzione. Se :echo has('jumplist')stampa 1, allora puoi usare questo.


19

Per aggiungere alla risposta di dnetserr e al commento di Peter Rincker, Vim mantiene un elenco di modifiche e ha alcuni comandi associati a questo.

:changes

elencherà le modifiche, mostrandoti dove erano e cosa erano. Per esempio:

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

La linea con gli >spettacoli dove ti trovi nello stack di modifica, un po 'come la jump list ( :jumps) o tag stack ( :tags). Inoltre, come la jump list e lo stack di tag, puoi attraversare questo elenco.

In modalità normale, i movimenti devono g;passare a una posizione di modifica precedente e g,passare a quella successiva. Puoi anche digitare il numero della modifica prima g;o g,per passare a quella modifica dall'elenco. Sopra, 2g;mi porterebbe al punto in cui si è verificato il cambiamento che coinvolge stdio.h.

Quando si è nel mezzo della pila, i numeri dagli :changesaggiornamenti mostrano le distanze relative. Per esempio:

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

Questo dimostra che posso tornare indietro di uno ( 1g;o solo g;) o in avanti di uno ( 1g,o solo g,).

Questo è fantastico se il cambiamento che vuoi ottenere si è effettivamente verificato alcune modifiche fa

Lo svantaggio di questo è che non sembra agire come un movimento normale. Ad esempio, non si può fare dg;per eliminare dal cursore nella posizione cambiamento precedente, mentre d'.e d'^fare il lavoro come movimenti.


15

g; andrà alla riga precedentemente modificata.


3
Puoi anche usare g, (virgola) per passare a una posizione di modifica più recente.
James,

5

Poiché il comando di annullamento in Vi fungerà da ri-do quando l'ultimo comando è stato annullato, ho usato uucome mezzo per tornare al punto in cui sono stato modificato l'ultima volta.

Se stai eseguendo Vim con nocompatibleset (come la maggior parte delle persone), vuoi usare useguito da CTRL+Rper annullare e ripetere. Altrimenti uufunzionerà come in Vi.


Lo farà se :set nocompatiblenon viene utilizzato.
Muru,

2
My vim(with nocompatible) fa due annullamenti con uu, ma io uso ue CTRL+rper lo stesso effetto.
Shahbaz,

Questa risposta ha il vantaggio che funziona anche con vi, nel caso in cui non abbiate vim su Aix / HPUX / Solaris / altre varianti Unix.
Guntram Blohm,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.