Usando o desfazer persistente do Vim?

96

Um dos novos recursos do Vim 7.3 é o 'desfazer persistente', que permite que o undotree seja salvo em um arquivo ao sair de um buffer.

Infelizmente, não consegui ativá-lo corretamente ou devo estar usando-o incorretamente. Aqui está o que tentei até agora:

Eu adicionei o seguinte a ~ / .vimrc

set undofile                " Save undos after file closes
set undodir=$HOME/.vim/undo " where to save undo histories
set undolevels=1000         " How many undos
set undoreload=10000        " number of lines to save for undo

Depois disso, supostamente devo ser capaz de abrir qualquer arquivo, editá-lo, salvá-lo e fechá-lo e, quando abri-lo novamente, devo ser capaz de desfazer / refazer como se nunca tivesse saído. Infelizmente, esse não parece ser o caso, já que nenhum undofile é escrito.

Notas:

  1. Estou no Win 7 usando o Vim 7.3 do projeto Vim sem creme. O desfazer persistente está embutido.

  2. $ HOME / .vim / undo existe no meu sistema de arquivos

Duckworthd
fonte
38
Só para enfatizar, o ponto 2) é muito importante. O Vim não criará o diretório para você e o desfazer persistente não funcionará até vocêmkdir ~/.vim/undo
puk
2
+1. Desculpe, no Linux funciona ... obrigado por me contar sobre isso!
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
Para quaisquer futuros visitantes desta questão: NÃO coloque aspas em torno do valor de undodir! Fiquei preso neste problema por um tempo - use uma pausa absoluta, sem aspas.
naiveai

Respostas:

51

Coloque isso em seu .vimrcpara criar um undodirse ele não existir e habilite o desfazer persistente. Testado em Windows e Linux.

" Put plugins and dictionaries in this dir (also on Windows)
let vimDir = '$HOME/.vim'
let &runtimepath.=','.vimDir

" Keep undo history across sessions by storing it in a file
if has('persistent_undo')
    let myUndoDir = expand(vimDir . '/undodir')
    " Create dirs
    call system('mkdir ' . vimDir)
    call system('mkdir ' . myUndoDir)
    let &undodir = myUndoDir
    set undofile
endif
Matthias Braun
fonte
5
Isso pode ser preferível para criar o diretório::silent call system('mkdir -p ' . &undodir)
Kyle Strand
1
Eu uso &porque eu seta undodirvez de letting-lo. (Na minha opinião, esta distinção entre lete seté uma das muitas, muitas, muitas "características" assustadoramente terríveis do Vimscript, mas YMMV.)
Kyle Strand
1
Obrigado Kyle, é uma boa ideia criar .vimse ele não existir. Infelizmente, a -psinalização não existe no Windows, então editei a resposta para ligar mkdirduas vezes para garantir a compatibilidade do Windows.
Matthias Braun
2
Ah. Meu principal motivo para usar o -psinalizador é, na verdade, evitar um erro quando o diretório existe. Tenho meu comando dentro de um if has('win32')bloco, então uso apenas mkdirsem -pno Windows.
Kyle Strand
4
Por que não usar mkdir()? Então isso pode se tornar call mkdir(myUndoDir, 'p'):, que se comporta como mkdir -p.
nelstrom
8

Eu tentei isso no meu _gvimrc:

" Persistent undo
try 
    set undodir=C:\vim\undodir
    set undofile
catch
endtry

Ele começou a funcionar conforme anunciado quando excluí o colchete try-catch, assim:

" Persistent undo
set undodir=C:\vim\undodir
set undofile

Tive que criar o diretório.

Juan Lanus
fonte
if has('persistent_undo')
Arelav
silent !mkdir ~/.config/nvim/backups > /dev/null 2>&1
Arelav
set undodir=~/.config/nvim/backups
Arelav
1
endif"adicionando mensagem comentada para aumentar o comprimento da mensagem
Arelav
3

Suponho que $ HOME não funcione conforme anunciado.

No meu sistema, :echo $HOMEmostra H: \, mas : e $HOME/diz: ~/nome de arquivo inválido.

Você pode tentar um caminho absoluto para ver se ele o cura

ver
fonte
Eu poderia |: echo $ HOME | e |: e $ HOME / | sem problemas, mas tentei mudar as coisas mesmo assim. Pareceu funcionar às vezes, e não em outras. Particularmente, ele nunca salva backups quando estou editando meu arquivo ~ / .vimrc.
duckworthd de
No windows 7 estou usando $TEMP. Quando eu olho, set undodir?isso mostra ~/AppData/Local/Temp. O arquivo de desfazer é persistido e se carrega corretamente. Talvez $TEMPseja mais confiável?
Slawek
1

Isso agora funciona conforme o esperado: file.txtabra em um buffer do Vim 7.4 no Windows 7, :setlocal undofilesalve uma alteração no buffer e o undofile .file.txt.un~é criado ao lado porque :set undodir?informa que "undodir =." por padrão - ou seja, não há necessidade de especificar isso manualmente. Você também pode :set undofileem um modeline.

JosephHarriott
fonte