Jak przejść do lokalizacji mojej ostatniej edycji?

68

Często wprowadzam zmiany w środku dużego pliku, ggprzeskakuję na górę, aby coś sprawdzić, a potem zdaję sobie sprawę, że zapomniałem zaznaczyć miejsce, w którym edytowałem. Czy istnieje wbudowany sposób przeskakiwania do lokalizacji ostatnio zmienionej linii?

bdesham
źródło

Odpowiedzi:

84

`.Polecenia spowoduje przejście do ostatniej zmiany.

`Idzie do znaku, a .to „specjalne” znak, który jest automatycznie ustawiany na pozycji, w której ostatnia zmiana została dokonana. Zobacz :help `.więcej informacji.

Jest też ``coś, co spowoduje powrót do miejsca, w którym znajdował się kursor przed ostatnim skokiem. Zobacz : pomoc,`` aby uzyskać więcej informacji.

Kolejnym przydatnym znakiem jest `^; jest to pozycja, w której kursor był ostatnim razem, gdy tryb wstawiania został zatrzymany. Zobaczyć :help `^.

Zobacz :help mark-motionsbardziej ogólne informacje na temat używania znaków (w tym niektóre inne „specjalne” znaki, które są ustawiane automatycznie).

Howardh
źródło
7
Możesz także używać przycisków g;i, g,aby przechodzić między pozycjami na liście zmian. Patrz :h g;i:h g,
Peter Rincker,
3
Możesz także użyć '(apostrof) zamiast `(backtick).
Sparhawk
21

Oto inne podejście, które pasuje do danego scenariusza i przeskoczy do miejsca, w którym byłeś bezpośrednio przed gg(nie do ostatniej zmienionej linii).

Posługiwać się CtrlO

Po naciśnięciu ggstara pozycja kursora zostaje przesunięta na listę skoków . Od :help jumplist:

Skoki są zapamiętywane na liście skoków. Za pomocą polecenia CTRL-Oi CTRL-Imożesz przejść do pozycji kursora przed starszymi skokami i ponownie. W ten sposób możesz poruszać się w górę i w dół listy. Dla każdego okna istnieje osobna lista przeskoków. Maksymalna liczba wpisów jest ustalona na 100.

[…]

Jeśli użyjesz polecenia skoku, bieżący numer linii zostanie wstawiony na końcu listy skoku. Jeśli ten sam wiersz był już na liście przeskoków, jest on usuwany. Powoduje to, że po powtórzeniu powrócisz CTRL-Odo starych pozycji tylko raz.

Wymaga to używania Vima (nie vi) z tą +jumplistfunkcją. Jeśli :echo has('jumplist')drukuje 1, możesz tego użyć.

wchargin
źródło
19

Aby dodać do odpowiedzi dnetserra i komentarza Petera Rinckera, Vim utrzymuje listę zmian i ma z tym kilka poleceń.

:changes

wyświetli listę zmian, pokazując, gdzie były i jakie były. Na przykład:

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

Linia >pokazująca, gdzie jesteś na stosie zmian, przypomina coś w rodzaju listy skoków ( :jumps) lub stosu znaczników ( :tags). Podobnie jak lista przeskoków i stos znaczników, możesz przeglądać tę listę.

W trybie normalnym ruchy mają g;przejść do poprzedniej lokalizacji zmiany i g,przejść do następnej. Możesz także wpisać numer zmiany przed g;lub g,przejść do tej zmiany z listy. Powyżej 2g;zaprowadzi mnie do miejsca, w którym nastąpiła zmiana dotycząca stdio.h.

Gdy są na środku stosu, liczby z :changesaktualizacji pokazują względne odległości. Na przykład:

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

To pokazuje, że mogę cofnąć się o jeden ( 1g;lub tylko g;) lub o jeden do przodu ( 1g,lub tylko g,).

Jest to świetne, jeśli zmiana, którą chcesz wprowadzić, pojawiła się kilka modyfikacji temu

Wadą tego jest to, że nie wydaje się działać jak normalny ruch. Na przykład nie można zrobić, dg;aby usunąć z kursora do poprzedniej lokalizacji zmiany, d'.a jednocześnie d'^wykonać ruchy.

John O'M.
źródło
15

g; przejdzie do poprzednio edytowanej linii.

dnetserr
źródło
3
Możesz także użyć g, (przecinka), aby przejść do nowszej pozycji edycji.
James
5

Ponieważ polecenie cofnięcia w Vi będzie działać jako powtórzenie, gdy ostatnie polecenie zostało cofnięte, wykorzystałem uujako środek powrotu do miejsca, w którym ostatnio edytowałem.

Jeśli korzystasz z Vima z nocompatibleustawieniami (jak większość ludzi), chcesz użyć, ua następnie CTRL+Rcofania i ponawiania. W przeciwnym razie uubędzie działać jak w Vi.

hlovdal
źródło
Będzie, jeśli :set nocompatiblenie zostanie użyty.
muru
2
Moje vim(z nocompatible) wykonuje dwa cofnięcia z uu, ale używam ui CTRL+rdla tego samego efektu.
Shahbaz
Ta odpowiedź ma tę zaletę, że działa również z vi, w przypadku, gdy nie masz vima w Aix / HPUX / Solaris / innych wariantach Uniksa.
Guntram Blohm