Como posso usar o undofile?


36

A última notícia no vim.org fala sobre o uso do 'undofile' para salvar seu histórico e desfazer alterações mesmo após uma reinicialização:

Um recurso que eu gosto de usar não é conhecido por muitos usuários, como descobri no fim de semana passado. Além de desfazer com quantos níveis você desejar, o Vim também oferece o armazenamento das informações de desfazer em um arquivo. Assim, você pode sair do Vim, reiniciar o computador e ainda desfazer as alterações feitas. Veja a ajuda de 'undofile'. (Bram Moolenaar)

Como posso ativar e usar esse recurso?


2
Bram provavelmente estava falando sobre este evento
Kurt Pfeifle

Respostas:


37

A versão mais simples é: crie um ~/.vim/undo-dir/diretório e adicione o seguinte ao .vimrc:

set undodir=~/.vim/undo-dir
set undofile

No entanto, não é perfeito, e é melhor ler. Do meu próprio .vimrc:

" Let's save undo info!
if !isdirectory($HOME."/.vim")
    call mkdir($HOME."/.vim", "", 0770)
endif
if !isdirectory($HOME."/.vim/undo-dir")
    call mkdir($HOME."/.vim/undo-dir", "", 0700)
endif
set undodir=~/.vim/undo-dir
set undofile

Prefiro não desordenar diretórios aleatórios com arquivos de desfazer. Então, defino a undodiropção, que coloca todos eles em um diretório de desfazer. Isso deixa um problema: sou preguiçoso e não sinto vontade de criar esse diretório em todas as minhas máquinas (eu uso um sistema de controle de versão para sincronizar minhas em .vimrcvárias máquinas). Felizmente, é fácil o Vim procurar e criar os diretórios, se eles não existirem.

Observe também o 0700modo no diretório desfazer (que é permissões totais para o proprietário, sem permissões para mais ninguém). Quais arquivos que eu editei, quando, etc. devem permanecer privados. E como este é apenas um diretório que eu posso acessar, não preciso me preocupar com alguém colocando um link simbólico lá, ou com seu próprio arquivo de desfazer, ou com o que precisar, pois você precisaria se preocupar em usar um diretório temporário do sistema.

Por fim, não sendo um diretório temporário do sistema, não está sujeito à política de limpeza do arquivo temporário do sistema. Muitas vezes, isso é bastante curto - uma semana ou mais. Mas para evitar que cresça para sempre, coloquei o seguinte no meu crontab:

# m h  dom mon dow   command
 43 00 *   *   3     find /home/anthony/.vim/undo-dir -type f -mtime +90 -delete

Então, depois de 90 dias sem serem modificados, eles são excluídos. (Honestamente, eles não são tão grandes assim, você pode facilmente deixá-los para sempre com o quão barato é o disco. Mas considere também sua própria privacidade se sua máquina estiver comprometida.)


Obrigado pela resposta detalhada @derobert! Sei que essa é uma pergunta antiga, mas estou tentando criar uma maneira vimscript de excluir arquivos antigos de desfazer do vim ( vi.stackexchange.com/questions/16053/… ). Eu acho que seria mais limpo fazê-lo dessa maneira, mas está provando não ser fácil. Você já pensou em usar um vimscript para excluir os arquivos antigos do vim? Caso contrário, você ainda usaria o crontab em vez de um vimscript?
Logan

11
@Logan Usar um script vim só funcionaria quando o vim estiver em execução, e também se houver vários vims em execução? Essa linha cron é simples, não sofre desses problemas, e claramente correta ...
derobert

Parece que a mkdir()função suporta a criação de várias estruturas de diretório com a "p"opção para {path}parâmetro Portanto, o script acima pode ser um pouco simplificado. Usando call mkdir($HOME."/.vim/undo-dir", "p", 0700)funciona para mim no Vim 7.4.160 pelo menos.
jdhao 26/10
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.