Come viene utilizzato l'albero di annullamento di VIM?


132

Questa risposta dice:

Il sistema di annullamento / ripetizione di Vim è imbattibile. Digita qualcosa, annulla, digita qualcos'altro e puoi ancora recuperare la prima cosa che hai digitato perché Vim usa un albero di annullamento anziché uno stack. In quasi tutti gli altri programmi, la storia della prima cosa che hai digitato è persa in questa circostanza.

Questa è la prima volta che ne sento parlare. Come posso tornare indietro lungo l'albero?


1
Gli utenti di Emacs gelosi potrebbero voler conoscere la modalità di annullamento dell'albero .
Aaron Miller,

Risposte:


142

Vedi anche :h undo-redo, che elenca tutti i comandi e il loro utilizzo.

Esistono due modi per attraversare l'albero di annullamento. Uno è di "tornare indietro nel tempo". g+e g-attraverserà tutti i nodi dell'albero in ordine cronologico o inverso-cronologico (che può essere un po 'confuso, perché può saltare arbitrariamente tra i rami di annullamento, ma se fai g-abbastanza a lungo arriverai sempre dove devi andare infine). :earliere :laterprendere un descrittore temporale come 7mo 1h; di nuovo questo può saltare arbitrariamente tra i rami di annullamento.

L'altro modo è saltare a nodi specifici nella struttura usando :undo ndove nè un numero di un'azione. (Tutte le azioni, ad esempio aggiunte di testo, eliminazioni, sostituzioni, sono numerate in sequenza mentre le fai.) Puoi cercare il numero delle azioni sulle foglie dell'albero di annullamento tramite :undolist. Questo ti permetterà di saltare facilmente tra i rami. È quindi possibile utilizzare ue Ctrl-Rper spostarsi su e giù per quel ramo.

Ci sono alcuni buoni esempi nella guida di Vim. Il modo migliore per capire come funziona è giocarci un po '.


43
Puoi unire i rami? (Sto scherzando)
he_the_great

40
Tipo di. Cerca: h undojoin
Pod

23
Vim è così fantastico che implementa persino i modi in cui scherziamo su quanto sia fantastico!
Andyortlieb,

4
Non sapevo come usare questo undo-albero, ma sapevo che un giorno mi avrebbe salvato la vita. Bene, è arrivato il giorno. Grazie!!
ndvo,

1
@Pod Sembra che undojoinnon abbia nulla a che fare con i rami; in effetti, la prossima sezione di aiuto inizia dicendo "Sopra abbiamo discusso solo una riga di annulla / ripristina. Ma è anche possibile diramare". C'è un modo di usare undojoincon i rami che non vedo?
Kyle Strand,

70

Sono un po 'in ritardo alla festa, ma ho pensato di menzionare che ho scritto un plugin di visualizzazione dell'albero di annullamento per Vim: http://bitbucket.org/sjl/gundo.vim/

Personalmente ho scoperto che rappresentare graficamente l'albero in questo modo era l'unico modo per capirlo.


Un repository git più aggiornato esiste su github.com/sjl/gundo.vim . Con vim-plug, il plug-in può essere installato con Plug 'sjl/gundo.vim'e quindi nnoremap <F5> :GundoToggle<CR>(sostituendo <F5>con qualsiasi sequenza di tasti che si desidera associare)
ewen-lbh


16

Se stai usando vim, puoi navigare attraverso la struttura degli annullamenti usando:

  • u: (annulla) torna indietro nella struttura di annullamento
  • Ctrl+R: (ripristina) si sposta in avanti nella struttura di annullamento

Altri modi per riportare indietro o in avanti il ​​documento nel tempo:

  • :earlier 15m: tornare indietro nel tempo di 15 minuti
  • :later 15m: sposta avanti in tempo 15 minuti

2
Questa risposta spiega solo come spostarsi avanti e indietro su un ramo. Non come spostarsi tra i rami.
Jonathan Hartley,

Questo si sposterà su tutti i rami ordinando tutti i punti per ordine temporale. Vedi la risposta di @BrianCarper.
Holloway,

@JonathanHartley, se stai usando earliere laternon si sta muovendo attraverso i rami. Mi aspetto che la maggior parte delle persone non si preoccupi davvero o ricordi i vari rami che hanno creato. Ma voglio solo tornare indietro nel tempo. Se vuoi creare rami e nominarli forse gito un sistema di controllo versione è un'opzione migliore.
alpha_989

@ alpha_989 I tuoi commenti sul controllo della versione non hanno senso. Il controllo della versione è per lo stato dei file con nome sul disco. Stiamo parlando dell'albero di annullamento di Vim, che è solo strutture di dati in memoria. Entrambi usano la parola "ramo", ma non significa la stessa cosa.
Jonathan Hartley,

Grazie a tutti che hanno sottolineato prima / poi di spostarsi tra i rami!
Jonathan Hartley,

9

Sono consapevole che a questa domanda è stata data una risposta, ma ho pensato di aggiungere un esempio.

Crea un nuovo file e digita:

this is a line

undolvisualizzerà l'albero di annullamento. A questo punto non hai annullato nulla

:undol

number changes  when               saved
     1       1  14:50:36

ora premi ESC e modifica la riga in:

this is a old line

passare alla modalità normale e premere u (annulla), questo dovrebbe rimuovere "vecchio". Se controlli undol, a questo punto hai ancora un solo ramo.

ora modifica la riga così dice:

this is a new line

Ora :undolmostra:

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

È possibile passare al primo ramo digitando

:u 2

questo ti sposterà alla fine del ramo associato al numero 2. Puoi muoverti lungo questo ramo con g+e g-. A questo punto g+non farà nulla (sei alla foglia). Se si preme g-"vecchio" verrà rimosso (si sta attraversando il primo albero di annullamento). Cioè se si rimuove "vecchio" con g-e si preme di g+nuovo, "vecchio" verrà rifatto.

Se digiti

:u 3

Passerai alla foglia del secondo ramo di annullamento e leggerai:

this is a new line


3

Oltre ad usare gundo.vim mi piace menzionare g+eg-


3

Il pacchetto undotree è scritto in puro vimscript, quindi non è necessario.

E aggiungi questo al tuo vimrc prima che sia troppo tardi:

  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 

inserisci qui la descrizione dell'immagine

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.