vim: como rastrear todas as alterações feitas no arquivo durante o dia

5

Alguém sabe como configurar o vim (o editor de texto) de forma a tornar possível rastrear todas as alterações feitas em um arquivo em um dia? Eu preciso disso para os casos em que modifiquei acidentalmente uma sub-rotina e gostaria de retornar ao seu estado inicial, como era no início do dia.

Eu costumo usar o svn para manter a versão mais recente do meu código-fonte em um repositório global. Mas às vezes eu preciso retornar ao estado em que o código estava entre dois svn commits.

Atualização:

Para ativar persistente, desfaça crie o diretório de desfazer, por exemplo ~/.vim/undodir e insira as configurações a seguir no arquivo .vimrc :

set undodir=~/.vim/undodir
set undofile
set undolevels=1000
set undoreload=10000
    
por mabalenk 24.03.2015 / 15:32

2 respostas

11

Com um valor grande o suficiente de 'undolevel' , o Vim poderá desfazer as alterações do dia inteiro. Se você encerrar o Vim no meio, você também precisa habilitar o undo persistente definindo a opção 'undofile' .

O Vim captura não apenas uma lista sequencial de comandos para desfazer, mas, na verdade, uma árvore de todas as alterações. Também possui vários comandos ao redor de undo (cp. :help undo-branches ); para voltar ao estado no começo do dia,

:earlier 12h

é um bom candidato.

Existem também plugins como Gundo e undotree.vim , que visualiza a árvore de desfazer e permite navegá-la.

Se navegar na árvore de desfazer parecer um pouco incômodo (por exemplo, porque você faz muitas alterações ao longo do dia), você também pode adicionar um sistema de controle de versão leve (além do Subversion), como meu writebackup plugin , e crie explicitamente um backup em determinados momentos.

    
por 24.03.2015 / 19:44
1

Há vários anos venho usando um wrapper de script em torno de vi que salva os arquivos que estou editando. Ele faz isso no máximo uma vez por dia, para que eu não tenha muitos arquivos de backup.

Esta é uma versão mais simples do script que eu uso; talvez seja útil para você também. Em vez de executar vi , você executaria vib (vi com backup):

vib() {
    local DATE=$(date +'%Y-%m-%d') FILE BACK
    for FILE in "$@"
    do
        BACK="$FILE.$DATE"
        test ! -f "$BACK" && cp -p "$FILE" "$BACK"
    done
    vi "$@"
    for FILE in "$@"
    do
        BACK="$FILE.$DATE"
        cmp -s "$FILE" "$BACK" && rm -f "$BACK"
    done
}

Isso pode ser colocado no .bash_profile ou, com a declaração de função removida, colocado em um arquivo executável, como /usr/local/bin/vib

    
por 24.03.2015 / 21:46