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?


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ć.


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.


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

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


3

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


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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.