Como é usada a árvore de desfazer do VIM?

132

Esta resposta diz:

O sistema de desfazer / refazer do Vim é imbatível. Digite algo, desfaça, digite outra coisa e você ainda poderá recuperar a primeira coisa que digitou, porque o Vim usa uma árvore de desfazer em vez de uma pilha. Em quase todos os outros programas, o histórico da primeira coisa que você digitou se perde nessa circunstância.

Esta é a primeira vez que ouço disso. Como posso voltar atrás na árvore?

Nathan Fellman
fonte
1
Usuários ciumentos do Emacs podem querer saber sobre o modo desfazer árvore .
Aaron Miller

Respostas:

142

Veja também :h undo-redo, que lista todos os comandos e seu uso.

Existem duas maneiras de atravessar a árvore de desfazer. Uma é voltar no tempo. g+e g-percorrerá todos os nós da árvore em ordem cronológica ou cronológica reversa (o que pode ser um pouco confuso, porque pode pular arbitrariamente entre desfazer ramificações, mas se você fizer g-o suficiente, sempre chegará aonde precisa ir eventualmente). :earliere :lateruse um descritor de tempo como 7mou 1h; mais uma vez, você pode fazer o salto arbitrariamente entre desfazer ramos.

A outra maneira é pular para nós específicos na árvore usando :undo nwhere né o número de ações. (Todas as ações, ou seja, adições, exclusões, substituições de texto, são numeradas seqüencialmente à medida que você as executa.) Você pode procurar o número de ações nas folhas da árvore de desfazer via :undolist. Isso permitirá que você salte entre os galhos facilmente. Você pode usar ue Ctrl-Rpara mover para cima e para baixo nesse ramo.

Existem alguns bons exemplos na ajuda do Vim. A melhor maneira de descobrir como isso funciona é brincar um pouco.

Brian Carper
fonte
43
Você pode mesclar ramificações? (Estou brincando)
he_the_great
40
Tipo. Olhe para cima: h undojoin
Pod
23
O Vim é tão incrível que até implementa maneiras pelas quais brincamos sobre o quão incrível é!
andyortlieb
4
Eu não sabia como usar essa árvore de desfazer, mas sabia que um dia salvaria minha vida. Bem, chegou o dia. Obrigado!!
Ndvo 29/01
1
@Pod Parece que undojoinnão tem nada a ver com galhos; de fato, a próxima seção de ajuda começa dizendo "Acima, discutimos apenas uma linha de desfazer / refazer. Mas também é possível ramificar". Existe alguma maneira de usar undojoincom galhos que simplesmente não estou vendo?
Kyle Strand
70

Estou um pouco atrasado para a festa, mas achei que mencionaria que escrevi um plug-in de visualização de árvore para desfazer para o Vim: http://bitbucket.org/sjl/gundo.vim/

Pessoalmente, descobri que representar graficamente a árvore dessa maneira era a única maneira de entendê-la.

Steve Losh
fonte
Existe um repositório git mais atualizado em github.com/sjl/gundo.vim . Com o vim-plug, o plug-in pode ser instalado Plug 'sjl/gundo.vim'e, em seguida, nnoremap <F5> :GundoToggle<CR>(substituindo <F5>por qualquer sequência de teclas que você deseja ligar)
ewen-lbh
16

Se você estiver usando o vim, poderá navegar pela árvore de desfazer usando:

  • u: (desfazer) voltar para a árvore de desfazer
  • Ctrl+R: (refazer) avançar na árvore de desfazer

Outras maneiras de trazer ou voltar o documento no tempo:

  • :earlier 15m: voltar no tempo 15 minutos
  • :later 15m: avançar na frente 15 minutos
Wadih M.
fonte
2
Esta resposta explica apenas como avançar e retroceder em um ramo. Não é como se mover entre os galhos.
Jonathan Hartley
Isso se moverá por todos os ramos, classificando todos os pontos por ordem do tempo. Veja a resposta de @BrianCarper.
Holloway
@ JonathanHartley, se você estiver usando earliere laterele não estiver se movendo através dos ramos. Eu esperaria que a maioria das pessoas realmente não se importasse ou se lembrasse dos vários ramos que eles criaram. Mas só quero voltar no tempo. Se você deseja criar ramificações e nomeá-las, talvez, gitou um sistema de controle de versão é uma opção melhor.
alpha_989 31/01
@ alpha_989 Seus comentários sobre o controle de versão não fazem sentido. O controle de versão é para o estado dos arquivos nomeados no disco. Estamos falando da árvore de desfazer do Vim, que são apenas estruturas de dados na memória. Ambos usam a palavra 'ramificação', mas isso não significa a mesma coisa.
Jonathan Hartley
Obrigado a todos que apontam mais cedo / mais tarde, passe pelas filiais!
Jonathan Hartley
9

Estou ciente de que esta pergunta foi respondida, mas pensei em adicionar um exemplo.

Crie um novo arquivo e digite:

this is a line

undolexibirá a árvore de desfazer. Neste ponto, você não desfez nada

:undol

number changes  when               saved
     1       1  14:50:36

Agora pressione ESC e modifique a linha para:

this is a old line

mude para o modo normal e pressione u (desfazer), isso deve remover "antigo". Se você verificar undol, neste momento você ainda possui apenas uma ramificação.

Agora modifique a linha para que ela diga:

this is a new line

Agora :undolmostra:

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

Você pode alternar para o primeiro ramo digitando

:u 2

isso o levará ao final do ramo associado ao número 2. Você pode avançar nesse ramo com g+e g-. Neste ponto g+, nada fará (você está na folha). Se você pressionar g-“antigo” será removido (você está atravessando a primeira árvore de desfazer), ou seja, se você remover “antigo” com g-e pressionar g+novamente, “antigo” será refeito.

Se você digitar

:u 3

Você pulará para a folha do segundo ramo de desfazer e ele lerá:

this is a new line
Alexander
fonte
3

Além de usar o gundo.vim, eu gosto de mencionar g+eg-

vbd
fonte
3

O pacote undotree é escrito em vimscript puro, portanto, não é necessário.

E adicione isso ao seu vimrc antes que seja tarde demais:

  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 

insira a descrição da imagem aqui

Tinmarino
fonte