Jak jest używane drzewo cofania w Vimie?

135

Ta odpowiedź brzmi:

System cofania / ponawiania Vima jest nie do pobicia. Wpisz coś, cofnij, wpisz coś innego i nadal możesz odzyskać pierwszą rzecz, którą wpisałeś, ponieważ Vim używa drzewa cofania zamiast stosu. W prawie każdym innym programie historia pierwszego wpisanego tekstu przepada w takiej sytuacji.

To jest pierwsza taka wiadomość. Jak mogę cofnąć się wzdłuż drzewa?

Nathan Fellman
źródło
2
Zazdrosni użytkownicy Emacsa mogą chcieć wiedzieć o trybie cofania drzewa .
Aaron Miller,

Odpowiedzi:

144

Zobacz także :h undo-redo, który zawiera listę wszystkich poleceń i ich zastosowania.

Istnieją dwa sposoby przechodzenia przez drzewo cofania. Jednym z nich jest cofnięcie się w czasie. g+i g-przejdzie przez wszystkie węzły w drzewie w porządku chronologicznym lub odwrotno-chronologicznym (co może być nieco zagmatwane, ponieważ może dowolnie przeskakiwać między cofanymi gałęziami, ale jeśli zrobisz g-wystarczająco długo, zawsze dotrzesz tam, gdzie trzeba ostatecznie). :earlieri :laterweź deskryptor czasu, taki jak 7mlub 1h; znowu może to przeskakiwać dowolnie między cofnięciami gałęzi.

Innym sposobem jest przeskakiwanie do określonych węzłów w drzewie przy użyciu :undo ngdzie njest liczbą akcji. (Wszystkie akcje, tj. Dodawanie tekstu, usuwanie, zamiana, są numerowane sekwencyjnie w miarę ich wykonywania.) Możesz sprawdzić liczbę działań na liściach drzewa cofania za pomocą :undolist. Pozwoli ci to łatwo przeskakiwać między gałęziami. Następnie możesz używać ui, Ctrl-Raby poruszać się w górę iw dół tej gałęzi.

W pomocy Vima jest kilka dobrych przykładów. Najlepszym sposobem, aby dowiedzieć się, jak to działa, jest trochę się tym pobawić.

Brian Carper
źródło
43
Czy możesz łączyć gałęzie? (
Żartuję
40
Coś w rodzaju. Wyszukaj: h undojoin
Pod
23
Vim jest tak niesamowity, że implementuje nawet sposoby, w jakie żartujemy z tego, jakie jest niesamowite!
andyortlieb
4
Nie wiedziałem, jak użyć tego drzewa cofania, ale wiedziałem, że pewnego dnia uratuje mi życie. Cóż, nadszedł ten dzień. Dzięki!!
ndvo
1
@Pod Wygląda na to, undojoinże nie ma to nic wspólnego z gałęziami; w rzeczywistości kolejna sekcja pomocy zaczyna się od stwierdzenia „Powyżej omówiliśmy tylko jedną linię cofania / ponawiania. Ale możliwe jest również rozgałęzienie”. Czy jest jakiś sposób na użycie undojoinz gałęziami, których po prostu nie widzę?
Kyle Strand
70

Trochę spóźniłem się na imprezę, ale pomyślałem, że wspomnę, że napisałem wtyczkę do wizualizacji drzewa cofania dla Vima: http://bitbucket.org/sjl/gundo.vim/

Osobiście stwierdziłem, że jedynym sposobem na nadanie mu sensu było narysowanie tego drzewa na wykresie.

Steve Losh
źródło
Bardziej aktualne repozytorium git istnieje pod adresem github.com/sjl/gundo.vim . Dzięki vim-plugin można zainstalować wtyczkę, Plug 'sjl/gundo.vim'a następnie nnoremap <F5> :GundoToggle<CR>(zastępując <F5>dowolną sekwencją klawiszy, którą chcesz powiązać)
ewen-lbh
16

Jeśli używasz Vima, możesz poruszać się po drzewie cofania za pomocą:

  • u: (cofnij) cofnij się w drzewie cofania
  • Ctrl+R: (ponów) przejdź do przodu w drzewie cofania

Inne sposoby cofnięcia lub przyspieszenia dokumentu w czasie:

  • :earlier 15m: cofnij się w czasie o 15 minut
  • :later 15m: ruch do przodu w czasie 15 minut
Wadih M.
źródło
2
Ta odpowiedź wyjaśnia tylko, jak poruszać się do przodu i do tyłu na jednej gałęzi. Nie jak poruszać się między gałęziami.
Jonathan Hartley,
Spowoduje to przejście przez wszystkie gałęzie, sortując wszystkie punkty według porządku czasowego. Zobacz odpowiedź @BrianCarper.
Holloway
@JonathanHartley, jeśli używasz earlieri laternie porusza się po gałęziach. Spodziewałbym się, że większość ludzi tak naprawdę nie obchodzi lub nie pamięta różnych gałęzi, które stworzyli. Ale chcę tylko cofnąć się w czasie. Jeśli chcesz tworzyć gałęzie i nazywać je być może, gitlepszym rozwiązaniem jest system kontroli wersji.
alpha_989
@ alpha_989 Twoje komentarze na temat kontroli wersji nie mają sensu. Kontrola wersji dotyczy stanu nazwanych plików na dysku. Mówimy o drzewie cofania Vima, które jest po prostu strukturami danych w pamięci. Obaj używają słowa „gałąź”, ale nie oznacza to tego samego.
Jonathan Hartley
Dziękujemy wszystkim wskazującym wcześniej / później.
Jonathan Hartley
9

Wiem, że odpowiedź na to pytanie została udzielona, ​​ale pomyślałem, że dodam przykład.

Utwórz nowy plik i wpisz:

this is a line

undolwyświetli drzewo cofania. W tym momencie nic nie cofnąłeś

:undol

number changes  when               saved
     1       1  14:50:36

teraz wciśnij ESC i zmień linię na:

this is a old line

przełącz na tryb normalny i naciśnij przycisk u (cofnij), powinno to usunąć „stare”. Jeśli undolzaznaczysz, w tym momencie nadal masz tylko jedną gałąź.

teraz zmodyfikuj linię, tak aby brzmiała:

this is a new line

Teraz :undolpokazuje:

number changes  when               saved
     2       2  87 seconds ago
     3       2  3 seconds ago

Możesz przejść do pierwszej gałęzi, wpisując

:u 2

przeniesie Cię to na koniec gałęzi przypisanej do numeru 2. Możesz poruszać się wzdłuż tej gałęzi za pomocą g+i g-. W tym momencie g+nic nie zrobisz (jesteś przy liściu). Jeśli naciśniesz g-„stare” zostanie usunięte (przechodzisz przez pierwsze drzewo cofania). Oznacza to, że jeśli usuniesz „stare” za pomocą g-i g+ponownie naciśniesz , „stare” zostanie przywrócone.

Jeśli wpiszesz

:u 3

Przeskoczysz do liścia drugiej gałęzi cofania i przeczyta:

this is a new line
Aleksandra
źródło
3

Oprócz korzystania z gundo.vim chciałbym wspomnieć o g+ig-

vbd
źródło
3

Pakiet undotree jest napisany w czystym języku vimscript, więc nie ma wymagań.

I dodaj to do swojego vimrc, zanim będzie za późno:

  set nobackup
  set noswapfile
  set nowritebackup
  set undolevels=10000         " use many levels of undo
  set history=10000    " After nocompatible

  if has('persistent_undo')
    set undodir=$HOME/.vim/undo
    set undofile 
  endif 

wprowadź opis obrazu tutaj

Tinmarino
źródło