2009-07-06 4 views
122

This answer dit:Comment l'arbre d'annulation de VIM est-il utilisé?

système de undo/redo est imbattable Vim. Tapez quelque chose, annulez, tapez quelque chose d'autre, et vous pouvez toujours récupérer la première chose que vous avez tapé, car Vim utilise un arbre d'annulation plutôt qu'une pile. Dans presque tous les autres programmes, l'histoire de la première chose que vous avez saisie est perdue dans cette circonstance.

C'est la première fois que j'entends parler de ça. Comment puis-je faire marche arrière le long de l'arbre?

+1

utilisateurs Jaloux Emacs peuvent souhaiter savoir sur [undo-tree mode ] (http://www.dr-qubit.org/undo-tree/undo-tree-0.6.3.el). –

Répondre

131

Voir aussi :h undo-redo, qui répertorie toutes les commandes et leur utilisation.

Il existe deux façons de parcourir l'arborescence d'annulation. L'un est d'aller "dans le temps". g+ et g- traversera tous les nœuds de l'arbre dans l'ordre chronologique ou chronologique inverse (ce qui peut être un peu confus, car il peut sauter arbitrairement entre les branches d'annulation, mais si vous faites g- assez longtemps, vous arriverez toujours où vous besoin d'aller finalement). :earlier et :later prendre un descripteur de temps comme 7m ou 1h; encore une fois cela peut vous sauter arbitrairement entre les branches d'annulation.

L'autre façon est de sauter à des nœuds spécifiques dans l'arborescence en utilisant :undo nn est le numéro d'une action. (Toutes les actions, c'est-à-dire les ajouts de texte, les suppressions, les remplacements, sont numérotées séquentiellement comme vous les faites.) Vous pouvez rechercher le nombre d'actions sur les feuilles de l'arborescence d'annulation via :undolist. Cela vous permettra de sauter facilement entre les branches. Vous pouvez ensuite utiliser u et Ctrl-R pour monter et descendre cette branche.

Il existe de bons exemples dans l'aide de Vim. La meilleure façon de comprendre comment cela fonctionne est de jouer avec un peu.

+34

Pouvez-vous fusionner des branches? (Je plaisante) –

+31

Un peu de. Look up: h undojoin – Pod

+15

Vim est tellement génial qu'il implémente même des façons dont nous plaisantons à quel point c'est génial! – andyortlieb

14

Si vous utilisez vim, vous pouvez naviguer dans l'arborescence undo en utilisant:

  • u: (retour) retourner dans l'arbre undo
  • Ctrl+R: (redo) aller de l'avant dans le undo arbre

d'autres moyens d'apporter le document précédent ou suivant dans le temps:

  • :earlier 15m: déplacer dans le temps de 15 minutes
  • :later 15m: avant de se déplacer dans le temps de 15 minutes
+1

Cette réponse explique seulement comment se déplacer vers l'avant et vers l'arrière sur une branche. Pas comment se déplacer entre les branches. –

+0

Ceci se déplacera dans toutes les branches en triant tous les points par ordre chronologique. Voir la réponse de @BrianCarper. – Holloway

+0

@JonathanHartley, si vous utilisez 'early' et' later', il ne se déplace pas entre les branches. Je m'attendrais à ce que la plupart des gens ne se soucient pas vraiment ou se souviennent des différentes branches qu'ils ont créées. Mais je veux juste revenir dans le temps. Si vous voulez créer des branches et les nommer peut-être 'git' ou un système de contrôle de version est une meilleure option. –

66

Je suis un peu en retard à la fête, mais je pensais que je vous signale que j'ai écrit une visualisation de l'arbre undo plugin pour Vim: http://bitbucket.org/sjl/gundo.vim/

Personnellement, j'ai trouvé que la représentation graphique de l'arbre était la seule façon de comprendre le problème.

+5

Je suis un peu plus tard à la fête, mais j'ai pensé que je mentionnerais que votre plugin vient de me sauver le cul! – Dean

3

En plus d'utiliser gundo.vim Je voudrais mentionner g+ et g-

5

Je suis au courant de cette question a été répondu, mais je Je pensais ajouter un exemple.

Créer un nouveau fichier et tapez:

this is a line 

undol affichera l'arbre undo. À ce stade, vous ne l'avez pas défait quoi que ce soit

:undol 

number changes when    saved 
    1  1 14:50:36 

pressez maintenant ESC et modifier la ligne:

this is a old line 

passer en mode normal et appuyez sur u (undo), cela devrait enlever "vieux". Si vous cochez undol, vous n'avez toujours qu'une seule branche à ce stade.

maintenant modifier la ligne il dit:

this is a new line 

Maintenant :undol montre:

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

Vous pouvez passer à la première branche en tapant

:u 2 

cela vous déplacer à la fin de la branche associée au numéro 2. Vous pouvez vous déplacer le long de cette branche avec g+ et g-. À ce stade g+ ne fera rien (vous êtes à la feuille). Si vous appuyez sur g- "ancien" sera supprimé (vous traversez le premier arbre d'annulation) .Si vous supprimez "ancien" avec g- et appuyez à nouveau sur g+, "ancien" sera refait.

Si vous tapez

:u 3 

Vous passez à la feuille de la deuxième branche undo et il lire:

this is a new line