¿Cómo puedo usar el unofile?

36

La última noticia en vim.org habla sobre el uso de 'unofile' para guardar su historial y deshacer los cambios incluso después de un reinicio:

Una característica que disfruto usando yo mismo no es conocida por muchos usuarios, como descubrí el fin de semana pasado. Además de deshacer con tantos niveles como desee, Vim también ofrece almacenar la información de deshacer en un archivo. Para que pueda salir de Vim, reiniciar su computadora y aún deshacer los cambios realizados. Vea la ayuda para 'unofile'. (Bram Moolenaar)

¿Cómo puedo habilitar y usar esta función?

Deshacer
fuente
2
Bram probablemente estaba hablando de este evento
Kurt Pfeifle

Respuestas:

37

La versión más simple es: crear ~/.vim/undo-dir/directorio y agregar lo siguiente a .vimrc:

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

Sin embargo, no es perfecto y es mejor seguir leyendo. De la mía .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

Prefiero no saturar directorios aleatorios con archivos de deshacer. Entonces configuré la undodiropción, que los pone a todos en un directorio de deshacer. Eso deja un problema: soy vago y no tengo ganas de crear ese directorio en todas mis máquinas (uso un sistema de control de versiones para sincronizar mi .vimrcen un montón de máquinas). Afortunadamente, es bastante fácil hacer que Vim verifique y cree los directorios si no existen.

Tenga en cuenta también el 0700modo en el directorio de deshacer (eso es permisos completos para el propietario, sin permisos para nadie más). Qué archivos he editado, cuándo, etc. deben permanecer privados. Y como este es un directorio al que solo puedo acceder, no tengo que preocuparme de que alguien más ponga un enlace simbólico allí, o su propio archivo para deshacer, o lo que sea, ya que tendría que preocuparse por usar un directorio temporal del sistema.

Finalmente, al no ser un directorio temporal del sistema, no está sujeto a la política de limpieza de archivos temporales del sistema. A menudo, eso es bastante corto, una semana más o menos. Pero para evitar que crezca para siempre, pongo lo siguiente en mi crontab:

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

Entonces, después de 90 días de no ser modificado, se eliminan. (Honestamente, no son realmente tan grandes, podría dejarlos para siempre con lo barato que es el disco. Pero considere también su propia privacidad si su máquina se ve comprometida alguna vez).

derobert
fuente
Gracias por la respuesta detallada @derobert! Sé que esta es una vieja pregunta, pero he estado tratando de encontrar una forma vimscript de eliminar viejos archivos vim undo ( vi.stackexchange.com/questions/16053/… ). Creo que sería más limpio hacerlo de esa manera, pero está demostrando que no es fácil. ¿Alguna vez pensó en usar un vimscript para eliminar los viejos archivos vim? Si no, ¿seguirías usando crontab sobre un vimscript?
Logan
1
@Logan Usar un script vim solo funcionaría cuando vim se está ejecutando, y también ¿qué pasa si hay varios vims en ejecución? Esa línea cron es simple, no sufre de esos problemas y es claramente correcta ...
derobert
Parece que la mkdir()función admite la creación de múltiples estructuras de directorios con la "p"opción de {path}parámetro. Entonces, el script anterior se puede simplificar un poco. Usar call mkdir($HOME."/.vim/undo-dir", "p", 0700)trabajos para mí en Vim 7.4.160 al menos.
jdhao