Comment l'arbre d'annulation de VIM est-il utilisé?


132

Cette réponse dit:

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

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


1
Les utilisateurs jaloux d'Emacs peuvent souhaiter en savoir plus sur le mode d' annulation de l'arborescence .
Aaron Miller

Réponses:


142

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. La première consiste à «remonter 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 déroutant, car il peut sauter arbitrairement entre les branches d'annulation, mais si vous faites g-assez longtemps, vous arriverez toujours là où vous devez aller finalement). :earlieret :laterprenez un descripteur de temps comme 7mou 1h; encore une fois, cela peut vous sauter arbitrairement entre les branches d'annulation.

L'autre méthode consiste à accéder à des nœuds spécifiques dans l'arborescence en utilisant :undo nnest un numéro d'action. (Toutes les actions, c'est-à-dire les ajouts de texte, les suppressions, les remplacements, sont numérotées de manière séquentielle au fur et à mesure que vous les faites.) Vous pouvez rechercher le nombre d'actions sur les feuilles de l'arborescence d'annulation via :undolist. Cela vous permettra de passer facilement d'une branche à l'autre. Vous pouvez ensuite utiliser uet Ctrl-Rpour 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 un peu avec.


43
Pouvez-vous fusionner des succursales? (Je plaisante)
he_the_great

40
Un peu de. Rechercher: h undojoin
Pod

23
Vim est tellement génial qu'il met même en œuvre des façons dont nous plaisantons sur son incroyable!
andyortlieb

4
Je ne savais pas comment utiliser cet arbre d'annulation, mais je savais que cela me sauverait la vie un jour. Eh bien, le jour est venu. Merci!!
ndvo le

1
@Pod On dirait qu'il undojoinn'a rien à voir avec les branches; en fait, la toute prochaine section d'aide commence par dire "ci-dessus, nous n'avons discuté que d'une ligne d'annulation / rétablissement. Mais il est également possible de bifurquer." Existe-t-il un moyen d'utiliser undojoindes branches que je ne vois tout simplement pas?
Kyle Strand

70

Je suis un peu en retard à la fête, mais j'ai pensé mentionner que j'avais écrit un plugin de visualisation d'arbre d'annulation pour Vim: http://bitbucket.org/sjl/gundo.vim/

Personnellement, j'ai trouvé que tracer un graphique de l'arbre comme celui-ci était le seul moyen de comprendre.


Un référentiel git plus à jour existe sur github.com/sjl/gundo.vim . Avec vim-plug, le plugin peut être installé avec Plug 'sjl/gundo.vim'puis nnoremap <F5> :GundoToggle<CR>(en remplaçant <F5>par la séquence de touches que vous souhaitez lier)
ewen-lbh


16

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

  • u: (annuler) revenir en arrière dans l'arborescence d'annulation
  • Ctrl+R: (refaire) avancer dans l'arborescence d'annulation

Autres moyens de ramener ou d'avancer un document dans le temps:

  • :earlier 15m: remonter le temps de 15 minutes
  • :later 15m: avancez dans le temps 15 minutes

2
Cette réponse explique uniquement comment avancer et reculer sur une branche. Pas comment se déplacer entre les branches.
Jonathan Hartley

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

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

@ alpha_989 Vos commentaires sur le contrôle de version n'ont aucun sens. Le contrôle de version concerne l'état des fichiers nommés sur le disque. Nous parlons de l'arbre d'annulation de Vim, qui n'est que des structures de données en mémoire. Ils utilisent tous les deux le mot «branche», mais cela ne veut pas dire la même chose.
Jonathan Hartley le

Merci à tous ceux qui vous ont signalé plus tôt / plus tard.
Jonathan Hartley

9

Je sais que cette question a reçu une réponse, mais j'ai pensé ajouter un exemple.

Créez un nouveau fichier et tapez:

this is a line

undolaffichera l'arborescence d'annulation. À ce stade, vous n'avez rien défait

:undol

number changes  when               saved
     1       1  14:50:36

maintenant appuyez sur ESC et modifiez la ligne en:

this is a old line

passez en mode normal et appuyez sur u (annuler), cela devrait supprimer «ancien». Si vous cochez undol, à ce stade, vous n'avez encore qu'une seule succursale.

modifiez maintenant la ligne pour qu'elle dise:

this is a new line

:undolMontre maintenant :

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

Vous pouvez basculer vers la première branche en tapant

:u 2

cela vous amènera à 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 parcourez le premier arbre d'annulation). C'est-à-dire que si vous supprimez "ancien" avec g-et appuyez à g+nouveau, "ancien" sera refait.

Si vous tapez

:u 3

Vous allez sauter à la feuille de la deuxième branche d'annulation et elle lira:

this is a new line


3

En plus d'utiliser gundo.vim, j'aime mentionner g+etg-


3

Le paquet undotree est écrit en pur vimscript donc aucune exigence.

Et ajoutez ceci à votre vimrc avant qu'il ne soit trop tard:

  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 

entrez la description de l'image ici

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.