¿Cómo se usa el árbol de deshacer de VIM?

132

Esta respuesta dice:

El sistema de deshacer / rehacer de Vim es inmejorable. Escriba algo, deshaga, escriba otra cosa, y aún puede recuperar lo primero que escribió porque Vim usa un árbol de deshacer en lugar de una pila. En casi todos los demás programas, el historial de lo primero que escribió se pierde en esta circunstancia.

Esta es la primera vez que escucho de esto. ¿Cómo puedo dar marcha atrás a lo largo del árbol?

Nathan Fellman
fuente
1
Los usuarios celosos de Emacs pueden desear saber sobre el modo de deshacer árbol .
Aaron Miller

Respuestas:

142

Vea también :h undo-redo, que enumera todos los comandos y su uso.

Hay dos formas de atravesar el árbol de deshacer. Una es ir "atrás en el tiempo". g+y g-atravesará todos los nodos en el árbol en orden cronológico o cronológico inverso (lo cual puede ser un poco confuso, ya que puede saltar arbitrariamente entre las ramas de deshacer, pero si lo hace g-lo suficiente, siempre llegará a donde necesita ir finalmente). :earliery :latertome un descriptor de tiempo como 7mo 1h; De nuevo, esto puede saltar arbitrariamente entre las ramas de deshacer.

La otra forma es saltar a nodos específicos en el árbol usando :undo nwhere nes un número de acción. (Todas las acciones, es decir, adiciones de texto, eliminaciones, reemplazos, se numeran secuencialmente a medida que las realiza). Puede buscar el número de acciones en las hojas del árbol de deshacer mediante :undolist. Esto te permitirá saltar fácilmente entre las ramas. Luego puede usar uy Ctrl-Rpara subir y bajar esa rama.

Hay algunos buenos ejemplos en la ayuda de Vim. La mejor manera de descubrir cómo funciona esto es jugar un poco con él.

Brian Carper
fuente
43
¿Puedes fusionar ramas? (Estoy bromeando)
he_the_great
40
Algo así como. Mira hacia arriba: h deshacer
Pod
23
¡Vim es tan increíble que incluso implementa formas en las que bromeamos sobre lo increíble que es!
andyortlieb
44
No sabía cómo usar este árbol de deshacer, pero sabía que algún día me salvaría la vida. Bueno, el día ha llegado. ¡¡Gracias!!
ndvo
1
@Pod Parece que undojoinno tiene nada que ver con las ramas; de hecho, la siguiente sección de ayuda comienza diciendo "Arriba solo discutimos una línea de deshacer / rehacer. Pero también es posible ramificar". ¿Hay alguna forma de usar undojoincon ramas que simplemente no estoy viendo?
Kyle Strand
70

Llego un poco tarde a la fiesta, pero pensé que mencionaría que escribí un complemento de visualización de árbol de deshacer para Vim: http://bitbucket.org/sjl/gundo.vim/

Personalmente, descubrí que graficar el árbol de esta manera era la única forma en que podía darle sentido.

Steve Losh
fuente
Existe un repositorio git más actualizado en github.com/sjl/gundo.vim . Con vim-plug, el complemento se puede instalar con Plug 'sjl/gundo.vim'y luego nnoremap <F5> :GundoToggle<CR>(reemplazando <F5>por cualquier secuencia de teclas que desee vincular)
ewen-lbh
16

Si está usando vim, puede navegar a través del árbol de deshacer usando:

  • u: (deshacer) retroceder en el árbol de deshacer
  • Ctrl+R: (rehacer) avanzar en el árbol de deshacer

Otras formas de llevar el documento hacia atrás o hacia adelante a tiempo:

  • :earlier 15m: retroceder en el tiempo 15 minutos
  • :later 15m: mueva el frente a tiempo 15 minutos
Wadih M.
fuente
2
Esta respuesta solo explica cómo avanzar y retroceder en una rama. No cómo moverse entre las ramas.
Jonathan Hartley
Esto se moverá a través de todas las ramas clasificando todos los puntos por orden de tiempo. Ver la respuesta de @BrianCarper.
Holloway
@ JonathanHartley, si está utilizando earliery laterno se mueve entre las ramas. Esperaría que a la mayoría de las personas no les importe o recuerden las diversas ramas que crearon. Pero solo quiero retroceder en el tiempo. Si desea crear ramas y nombrarlas quizás gito un sistema de control de versiones es una mejor opción.
alpha_989
@ alpha_989 Sus comentarios sobre el control de versiones no tienen sentido. El control de versiones es para el estado de los archivos con nombre en el disco. Estamos hablando del árbol de deshacer de Vim, que son solo estructuras de datos en la memoria. Ambos usan la palabra 'rama', pero no significa lo mismo.
Jonathan Hartley
¡Gracias a todos los que señalaron antes / después, muévase entre las ramas!
Jonathan Hartley
9

Sé que esta pregunta ha sido respondida, pero pensé en agregar un ejemplo.

Cree un nuevo archivo y escriba:

this is a line

undolmostrará el árbol de deshacer. En este punto no has deshecho nada

:undol

number changes  when               saved
     1       1  14:50:36

ahora presione ESC y modifique la línea para:

this is a old line

cambie al modo normal y presione u (deshacer), esto debería eliminar "viejo". Si marca undol, en este punto todavía tiene una sola rama.

ahora modifique la línea para que diga:

this is a new line

Ahora :undolmuestra:

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

Puede cambiar a la primera rama escribiendo

:u 2

esto lo moverá al final de la rama asociada con el número 2. Puede moverse a lo largo de esta rama con g+y g-. En este punto g+no hará nada (estás en la hoja). Si presiona g-"viejo" se eliminará (está atravesando el primer árbol de deshacer). Es decir, si quita "viejo" con g-y presiona g+nuevamente, se volverá a hacer "viejo".

Si escribes

:u 3

Saltará a la hoja de la segunda rama de deshacer y se leerá:

this is a new line
Alejandro
fuente
3

Además de usar gundo.vim, me gusta mencionar g+yg-

vbd
fuente
3

El paquete no escrito está escrito en vimscript puro, por lo que no es necesario.

Y agregue esto a su vimrc antes de que sea demasiado tarde:

  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 

ingrese la descripción de la imagen aquí

Tinmarino
fuente