¿Cómo controlo cómo Emacs crea archivos de respaldo?
Emacs coloca archivos de respaldo con nombres foo~
en todas partes y no me gusta tener que acordarme de eliminarlos. Además, si edito un archivo que tiene un vínculo físico en algún otro lugar del sistema de archivos, el vínculo físico apunta a la copia de seguridad cuando termino de editar, y eso es confuso y horrible. ¿Cómo puedo eliminar estos archivos de respaldo o hacer que vayan a otro lugar que no sea el mismo directorio?
Si alguna vez ha sido salvado por un archivo de copia de seguridad de Emacs, probablemente quiera más, no menos. Es molesto que vayan al mismo directorio que el archivo que estás editando, pero eso es fácil de cambiar. Puedes hacer que todos los archivos de respaldo vayan a un directorio colocando algo como lo siguiente en tu archivo
.emacs
.
(setq backup-directory-alist `(("." . "~/.saves")))
Hay una serie de detalles arcanos asociados con cómo Emacs podría crear sus archivos de respaldo. ¿Debería cambiar el nombre del original y escribir el búfer editado? ¿Qué pasa si el original está vinculado? Por lo general, la apuesta más segura pero más lenta es hacer siempre copias de seguridad mediante copia.
(setq backup-by-copying t)
Si por alguna razón es demasiado lento, también puedes echarle un vistazo a
backup-by-copying-when-linked
.
Dado que ahora todas sus copias de seguridad están en su propio lugar, es posible que desee más, en lugar de menos. Eche un vistazo a la documentación de Emacs para estas variables (con C-h v
).
(setq delete-old-versions t
kept-new-versions 6
kept-old-versions 2
version-control t)
Finalmente, si es absolutamente necesario que no tengas archivos de respaldo:
(setq make-backup-files nil)
Aunque me enferma pensar en ello.
Los archivos de copia de seguridad/guardado automático de Emacs pueden ser muy útiles. Pero estas características son confusas.
Archivos de respaldo
Los archivos de respaldo tienen tildes ( ~
o ~9~
) al final y se escribirán en el directorio de inicio del usuario. Cuando make-backup-files
no es nulo, Emacs crea automáticamente una copia de seguridad del archivo original la primera vez que se guarda el archivo desde un búfer. Si está editando un archivo nuevo, Emacs creará una copia de seguridad la segunda vez que guarde el archivo.
No importa cuántas veces guardes el archivo, la copia de seguridad permanece sin cambios. Si elimina el búfer y luego visita el archivo nuevamente, o la próxima vez que inicie una nueva sesión de Emacs, se creará un nuevo archivo de copia de seguridad. La nueva copia de seguridad refleja el contenido del archivo después de reabrirlo o al inicio de las sesiones de edición. Pero una copia de seguridad existente nunca más se vuelve a tocar. Por lo tanto, encuentro útil crear copias de seguridad numeradas (consulte la configuración a continuación).
Para crear copias de seguridad utilice explícitamente save-buffer
( C-x C-s
) con argumentos de prefijo.
diff-backup
y dired-diff-backup
compara un archivo con su copia de seguridad o viceversa. Pero no existe ninguna función para restaurar archivos de copia de seguridad. Por ejemplo, en Windows, para restaurar un archivo de copia de seguridad
C:\Users\USERNAME\.emacs.d\backups\!drive_c!Users!USERNAME!.emacs.el.~7~
tiene que ser copiado manualmente como
C:\Users\USERNAME\.emacs.el
Guardar archivos automáticamente
Los archivos de guardado automático utilizan marcas hash ( #
) y se escribirán localmente dentro del directorio del proyecto (junto con los archivos reales). La razón es que los archivos de guardado automático son sólo archivos temporales que Emacs crea hasta que se guarda un archivo nuevamente (como con obediencia apresurada).
- Antes de que el usuario presione
C-x C-s
(save-buffer
) para guardar un archivo, Emacs guarda automáticamente los archivos, basándose en el conteo de pulsaciones de teclas (auto-save-interval
) o cuando deja de escribir (auto-save-timeout
). - Emacs también guarda automáticamente cada vez que falla, incluida la eliminación del trabajo de Emacs con un comando de shell.
Cuando el usuario guarda el archivo, se elimina la versión guardada automáticamente. Pero cuando el usuario sale del archivo sin guardarlo, Emacs o la sesión X fallan, los archivos guardados automáticamente aún existen.
Utilice revert-buffer
o recover-file
para restaurar archivos de guardado automático. Tenga en cuenta que Emacs registra las sesiones interrumpidas para su posterior recuperación en archivos llamados ~/.emacs.d/auto-save-list . La recover-session
función utilizará esta información.
El método preferido para recuperar un archivo guardado automáticamente es M-x revert-buffer RET
. Emacs preguntará "El búfer se ha guardado automáticamente recientemente. ¿Volver desde el archivo de guardado automático?" o "¿Revertir el búfer del archivo NOMBRE DE ARCHIVO?". En el caso de este último, no hay ningún archivo de guardado automático. Por ejemplo, porque guardó antes de escribir otra auto-save-intervall
pulsación de tecla, en cuyo caso Emacs eliminó el archivo de guardado automático.
Hoy en día, el guardado automático está desactivado de forma predeterminada porque puede ralentizar la edición cuando se conecta a una máquina lenta y porque muchos archivos contienen datos confidenciales.
Configuración
Aquí hay una configuración que en mi humilde opinión funciona mejor:
(defvar --backup-directory (concat user-emacs-directory "backups"))
(if (not (file-exists-p --backup-directory))
(make-directory --backup-directory t))
(setq backup-directory-alist `(("." . ,--backup-directory)))
(setq make-backup-files t ; backup of a file the first time it is saved.
backup-by-copying t ; don't clobber symlinks
version-control t ; version numbers for backup files
delete-old-versions t ; delete excess backup files silently
delete-by-moving-to-trash t
kept-old-versions 6 ; oldest versions to keep when a new numbered backup is made (default: 2)
kept-new-versions 9 ; newest versions to keep when a new numbered backup is made (default: 2)
auto-save-default t ; auto-save every buffer that visits a file
auto-save-timeout 20 ; number of seconds idle time before auto-save (default: 30)
auto-save-interval 200 ; number of keystrokes between auto-saves (default: 300)
)
Informacion delicada
Otro problema es que no desea que Emacs difunda copias de archivos con datos confidenciales. Utilice este modo por archivo. Como se trata de un modo menor, para mis propósitos le cambié el nombre sensitive-minor-mode
.
Para habilitarlo para todos los archivos .vcf y .gpg , en su .emacs use algo como:
(setq auto-mode-alist
(append
(list
'("\\.\\(vcf\\|gpg\\)$" . sensitive-minor-mode)
)
auto-mode-alist))
Alternativamente, para proteger solo algunos archivos, como algunos archivos .txt , use una línea como
// -*-mode:asciidoc; mode:sensitive-minor; fill-column:132-*-
en el archivo.
La respuesta aceptada es buena, pero se puede mejorar enormemente haciendo una copia de seguridad adicional de cada guardado y una copia de seguridad de los archivos versionados .
Primero, configuraciones básicas como se describe en la respuesta aceptada :
(setq version-control t ;; Use version numbers for backups.
kept-new-versions 10 ;; Number of newest versions to keep.
kept-old-versions 0 ;; Number of oldest versions to keep.
delete-old-versions t ;; Don't ask to delete excess backup versions.
backup-by-copying t) ;; Copy all files, don't rename them.
A continuación, también haga una copia de seguridad de los archivos versionados, lo que Emacs no hace de forma predeterminada (no se compromete en cada guardado, ¿verdad?):
(setq vc-make-backup-files t)
Finalmente, haga una copia de seguridad de cada guardado, no solo del primero. Realizamos dos tipos de copias de seguridad:
Copias de seguridad por sesión: una vez en el primer guardado del búfer en cada sesión de Emacs. Estos simulan el comportamiento de copia de seguridad predeterminado de Emac.
Copias de seguridad por guardado: una vez en cada guardado. Emacs no hace esto de forma predeterminada, pero es muy útil si deja Emacs ejecutándose durante mucho tiempo.
Las copias de seguridad van en diferentes lugares y Emacs crea los directorios de copia de seguridad automáticamente si no existen:
;; Default and per-save backups go here:
(setq backup-directory-alist '(("" . "~/.emacs.d/backup/per-save")))
(defun force-backup-of-buffer ()
;; Make a special "per session" backup at the first save of each
;; emacs session.
(when (not buffer-backed-up)
;; Override the default parameters for per-session backups.
(let ((backup-directory-alist '(("" . "~/.emacs.d/backup/per-session")))
(kept-new-versions 3))
(backup-buffer)))
;; Make a "per save" backup on each save. The first save results in
;; both a per-session and a per-save backup, to keep the numbering
;; of per-save backups consistent.
(let ((buffer-backed-up nil))
(backup-buffer)))
(add-hook 'before-save-hook 'force-backup-of-buffer)
Me interesé mucho en este tema después de que escribí $<
en lugar de
$@
en mi Makefile
, aproximadamente tres horas después de mi confirmación anterior: P
Lo anterior se basa en una página Wiki de Emacs que edité en gran medida .