Dia 22: Undo e Redo
Undo, como todos sabem, desfaz o que foi digitado ou a última alteração. Para
desfazer no VIM, pode ser usado [u]
ou :undo
.
A título de curiosidade, existe uma diferença entre o VI original e o VIM: No
VIM, para continuar desfazendo, basta continuar usando [u]
ou [.]
(lembrando que [.]
repete o último comando de alteração de texto e que
desfazer coisas realmente altera o texto). No VI original (ou se o VIM estiver
configurado para o modo de compatibilidade), o primeiro [u]
ira desfazer o
que foi feito; o próximo [u]
irá desfazer o primeiro undo, e retornar o que
foi feito; a única forma de fazer undo contínuo no VI é usar [u]
no começo e
continuar desfazendo com [.]
.
Para desfazer o undo no VIM (o que normalmente é chamado de "redo"), é
necessário usar [C-r]
.
O undo do VIM também permite retornar em pontos específicos do tempo na edição
do arquivo. :earlier 5m
irá retornar para o mesmo conteúdo de 5 minutos
atrás. :earlier 10d
retorna o conteúdo para o que havia a 10 dias atrás.
Também é possível avancar no tempo com :later 5m
ou :later 10d
, embora não
seja possível fazer com o que o VIM crie o conteúdo do arquivo puxando coisas
do futuro (se hoje você abrir um arquivo e tentar :later 1y
para verificar
como o arquivo irá ficar daqui a um ano, nada irá acontecer).
Com undos e redos, o VIM consegue manter "árvore de undo". O que acontece é basicamente o seguinte: Imagine que a edição de um arquivo é uma linha contínua. Ao fazer um undo e uma nova alteração, é criado uma nova linha do tempo para o arquivo (basicamente, o que os sistemas de controle de versão chamam de "branching").
Para ver a lista de alterações no tempo, existe o comando :undolist
. Ele irá
mostrar exatamente quantas alterações tiverem no espaço do tempo e quando foi a
última alteração. Entretanto, essa visualização não é visual, mostrando os
branches criados. Para isto, existe o plugin
GUndo, que utiliza essa informação
temporal para mostrar exatamente onde a árvore de undo se divide.
E, por último, o VIM, por padrão, não guarda informações fora da edição. Se
houverem alterações no arquivo e o VIM for encerrado, ao reabrir o arquivo,
todas as informações de undo serão perdidas. Para contornar esse problema, é
necessário usar a configuração de "undofile" com set undofile
no vimrc.