Wie wird der Rückgängig-Baum von VIM verwendet?


132

Diese Antwort sagt:

Das Undo / Redo-System von Vim ist unschlagbar. Geben Sie etwas ein, machen Sie es rückgängig, geben Sie etwas anderes ein, und Sie können immer noch das erste zurückgeben, das Sie eingegeben haben, da Vim einen Rückgängig-Baum anstelle eines Stapels verwendet. In fast jedem anderen Programm geht unter diesen Umständen die Geschichte der ersten Eingabe verloren.

Dies ist das erste Mal, dass ich davon höre. Wie kann ich am Baum entlang zurückgehen?


1
Eifersüchtige Emacs-Benutzer möchten möglicherweise etwas über den Undo-Tree-Modus erfahren .
Aaron Miller

Antworten:


142

Siehe auch :h undo-redo, in dem alle Befehle und ihre Verwendung aufgelistet sind.

Es gibt zwei Möglichkeiten, den Rückgängig-Baum zu durchlaufen. Eine ist, "in der Zeit zurück zu gehen". g+und g-durchläuft alle Knoten im Baum in chronologischer oder umgekehrter chronologischer Reihenfolge (was etwas verwirrend sein kann, da es willkürlich zwischen rückgängig gemachten Zweigen springen kann, aber wenn Sie g-lange genug tun , werden Sie immer dahin gelangen, wo Sie hin müssen schließlich). :earlierund :laternimm einen Zeitdeskriptor wie 7moder 1h; Auch dies kann Sie willkürlich zwischen rückgängig gemachten Zweigen springen lassen.

Der andere Weg ist , um bestimmten Knoten im Baum zu springen mit :undo ndenen neine Reihe von einer Handlung ist. (Alle Aktionen, dh das Hinzufügen, Löschen und Ersetzen von Text, werden dabei fortlaufend nummeriert.) Sie können die Anzahl der Aktionen auf den Blättern des Rückgängig-Baums über nachschlagen :undolist. Auf diese Weise können Sie problemlos zwischen Zweigen springen. Sie können dann uund verwenden Ctrl-R, um diesen Zweig auf und ab zu bewegen.

In der Vim-Hilfe finden Sie einige gute Beispiele. Der beste Weg, um herauszufinden, wie das funktioniert, ist ein bisschen damit zu spielen.


43
Können Sie Zweige zusammenführen? (Ich mache Witze)
he_the_great

40
Ein bisschen von. Nachschlagen: h rückgängig machen
Pod

23
Vim ist so großartig, dass es sogar Möglichkeiten umsetzt, wie wir darüber scherzen, wie großartig es ist!
andyortlieb

4
Ich wusste nicht, wie ich diesen Rückgängig-Baum verwenden sollte, aber ich wusste, dass er eines Tages mein Leben retten würde. Nun, der Tag ist gekommen. Vielen Dank!!
Ndvo

1
@Pod Es sieht so aus, als hätte undojoindas nichts mit Zweigen zu tun. Tatsächlich beginnt der nächste Hilfeabschnitt mit den Worten: "Oben haben wir nur eine Zeile zum Rückgängigmachen / Wiederherstellen besprochen. Es ist aber auch möglich, abzweigen." Gibt es eine Möglichkeit, undojoinmit Zweigen zu arbeiten, die ich gerade nicht sehe?
Kyle Strand

70

Ich bin etwas spät zur Party, aber ich dachte, ich würde erwähnen, dass ich ein Plugin zum Rückgängigmachen der Baumvisualisierung für Vim geschrieben habe: http://bitbucket.org/sjl/gundo.vim/

Persönlich stellte ich fest, dass die grafische Darstellung des Baumes die einzige Möglichkeit war, einen Sinn daraus zu ziehen.


Ein aktuelleres Git-Repository finden Sie unter github.com/sjl/gundo.vim . Mit vim-plug kann das Plugin mit Plug 'sjl/gundo.vim'und dann installiert werden nnoremap <F5> :GundoToggle<CR>( <F5>durch eine beliebige Tastenfolge ersetzen , die Sie binden möchten)
ewen-lbh


16

Wenn Sie vim verwenden, können Sie durch den Rückgängig-Baum navigieren, indem Sie:

  • u: (Rückgängig) gehe zurück in den Rückgängig-Baum
  • Ctrl+R: (Wiederherstellen) Bewegen Sie sich im Rückgängig-Baum vorwärts

Andere Möglichkeiten, um Dokumente rechtzeitig vor- oder zurückzubringen:

  • :earlier 15m: 15 Minuten zurückversetzen
  • :later 15m: Bewegen Sie sich rechtzeitig 15 Minuten nach vorne

2
Diese Antwort erklärt nur, wie Sie sich auf einem Zweig vorwärts und rückwärts bewegen. Nicht, wie man sich zwischen Zweigen bewegt.
Jonathan Hartley

Dies bewegt sich über alle Zweige und sortiert alle Punkte nach Zeitreihenfolge. Siehe die Antwort von @BrianCarper.
Holloway

@ JonathanHartley, wenn Sie verwenden earlierund lateres nicht über Zweige bewegt. Ich würde erwarten, dass sich die meisten Menschen nicht wirklich um die verschiedenen Zweige kümmern oder sich daran erinnern, die sie geschaffen haben. Aber ich möchte einfach in die Vergangenheit reisen. Wenn Sie Zweige erstellen und benennen möchten, ist gitein Versionskontrollsystem die bessere Option.
Alpha_989

@ alpha_989 Ihre Kommentare zur Versionskontrolle sind nicht sinnvoll. Die Versionskontrolle bezieht sich auf den Status der benannten Dateien auf der Festplatte. Wir sprechen über Vims Rückgängig-Baum, bei dem es sich nur um Datenstrukturen im Speicher handelt. Beide verwenden das Wort "Zweig", aber es bedeutet nicht dasselbe.
Jonathan Hartley

Vielen Dank an alle, die früher / später darauf hingewiesen haben. Bewegen Sie sich über Zweige!
Jonathan Hartley

9

Ich bin mir bewusst, dass diese Frage beantwortet wurde, aber ich dachte, ich würde ein Beispiel hinzufügen.

Erstellen Sie eine neue Datei und geben Sie Folgendes ein:

this is a line

undolzeigt den Rückgängig-Baum an. Zu diesem Zeitpunkt haben Sie noch nichts rückgängig gemacht

:undol

number changes  when               saved
     1       1  14:50:36

Drücken Sie nun ESC und ändern Sie die Zeile in:

this is a old line

Wechseln Sie in den normalen Modus und drücken Sie u (Rückgängig). Dadurch sollte "alt" entfernt werden. Wenn Sie dies überprüfen undol, haben Sie zu diesem Zeitpunkt nur noch einen Zweig.

Ändern Sie nun die Zeile so, dass sie lautet:

this is a new line

Jetzt :undolzeigt:

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

Sie können durch Eingabe zum ersten Zweig wechseln

:u 2

Dadurch gelangen Sie zum Ende des mit Nummer 2 verknüpften Zweigs. Sie können sich mit g+und entlang dieses Zweigs bewegen g-. An diesem Punkt g+wird nichts tun (Sie sind am Blatt). Wenn Sie g-"alt" drücken, wird entfernt (Sie durchlaufen den ersten Rückgängig-Baum). Wenn Sie "alt" mit entfernen g-und g+erneut drücken , wird "alt" erneut erstellt.

Wenn Sie tippen

:u 3

Sie springen zum Blatt des zweiten Rückgängig-Zweigs und es lautet:

this is a new line


3

Neben der Verwendung von gundo.vim möchte ich erwähnen , g+undg-


3

Das Paket undotree ist in reinem Vimscript geschrieben, daher keine Anforderung.

Und füge dies deinem vimrc hinzu, bevor es zu spät ist:

  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 

Geben Sie hier die Bildbeschreibung ein

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.