¿Estás usando la función de deshacer persistente de Vim?

96

Una de las nuevas características de Vim 7.3 es 'deshacer persistente', que permite guardar el no libre en un archivo al salir de un búfer.

Desafortunadamente, no he podido habilitarlo correctamente o debo estar usándolo mal. Esto es lo que he probado hasta ahora:

Agregué lo siguiente 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

Después de esto, supuestamente debería poder abrir cualquier archivo, editarlo, luego guardarlo y cerrarlo, y cuando lo abra de nuevo debería poder deshacer / rehacer como si nunca me hubiera ido. Desafortunadamente, este no parece ser el caso, ya que nunca se escribe un archivo.

Notas:

  1. Estoy en Win 7 usando Vim 7.3 del proyecto Vim sin crema. La función de deshacer persistente está incorporada.

  2. $ HOME / .vim / undo existe en mi sistema de archivos

digno de pato
fuente
38
Solo para enfatizar, el punto 2) es muy importante. Vim no creará el directorio para usted y deshacer persistente no funcionará hasta quemkdir ~/.vim/undo
PUK
2
+1. Lo siento, en Linux funciona ... ¡gracias por contármelo!
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
Para cualquier visitante futuro a esta pregunta: ¡ NO ponga comillas alrededor del valor de undodir! Me quedé atascado en este problema por un tiempo: use una paht absoluta, sin comillas.
naiveai

Respuestas:

51

Pon esto en tu .vimrcpara crear un undodirsi no existe y habilita el deshacer persistente. Probado tanto en Windows como en 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
fuente
5
Esto puede ser preferible para crear el directorio::silent call system('mkdir -p ' . &undodir)
Kyle Strand
1
Utilizo &porque setel undodirlugar de letting ella. (En mi opinión, esta distinción entre lety setes una de las muchas, muchas, muchas "características" asombrosamente horribles de Vimscript, pero YMMV.)
Kyle Strand
1
Gracias Kyle, es una buena idea crear .vimsi no existe. Desafortunadamente, la -pbandera no existe en Windows, así que edité la respuesta para llamar mkdirdos veces para garantizar la compatibilidad con Windows.
Matthias Braun
2
¡Ah! Mi principal razón para usar la -pbandera es en realidad evitar un error cuando el directorio existe. Tengo mi comando dentro de un if has('win32')bloque, así que lo uso mkdirsin -pen Windows.
Kyle Strand
4
¿Por qué no usar mkdir()? Entonces esto puede convertirse en:, call mkdir(myUndoDir, 'p')que se comporta como mkdir -p.
nelstrom
8

Intenté esto en mi _gvimrc:

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

Comenzó a funcionar como se anunciaba cuando eliminé el corchete try-catch, así:

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

Tuve que crear el directorio.

Juan Lanús
fuente
if has('persistent_undo')
Arelav
silent !mkdir ~/.config/nvim/backups > /dev/null 2>&1
Arelav
set undodir=~/.config/nvim/backups
Arelav
1
endif"agregando un mensaje comentado para aumentar la longitud del mensaje
Arelav
3

Supongo que $ HOME no funciona como se anuncia.

En mi sistema, :echo $HOMEmuestra H: \, pero : e $HOME/dice: ~/nombre de archivo no válido.

Podrías probar con una ruta absoluta para ver si lo cura.

sehe
fuente
Podría |: echo $ HOME | y |: e $ HOME / | sin problemas, pero intenté cambiar las cosas de todos modos. Parecía funcionar a veces y no en otras. En particular, nunca guarda copias de seguridad cuando estoy editando mi archivo ~ / .vimrc.
Dudoso el
En Windows 7 estoy usando $TEMP. Cuando miro set undodir?se nota ~/AppData/Local/Temp. El archivo de deshacer se conserva y se carga correctamente. ¿Quizás $TEMPserá más confiable?
Slawek el
1

Esto ahora funciona como se esperaba: file.txtabra en un búfer de Vim 7.4 en Windows 7, :setlocal undofileluego guarde un cambio en el búfer, y el archivo anulado .file.txt.un~se crea junto porque :set undodir?informa que "undodir =". de forma predeterminada, es decir, no es necesario especificarlo manualmente. También puede :set undofilehacerlo en una línea de modelo.

JosephHarriott
fuente