¿Cómo controlo cómo Emacs crea archivos de respaldo?

327

Emacs coloca archivos de respaldo con nombre en foo~todas partes y no me gusta tener que recordar eliminarlos. Además, si edito un archivo que tiene un enlace duro en otro lugar del sistema de archivos, el enlace duro apunta a la copia de seguridad cuando termine 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?

jfm3
fuente

Respuestas:

519

Si alguna vez ha sido guardado por un archivo de copia de seguridad de Emacs, probablemente desee más de ellos, no menos de ellos. Es molesto que vayan en el mismo directorio que el archivo que está editando, pero eso es fácil de cambiar. Puede hacer que todos los archivos de respaldo vayan a un directorio poniendo algo como lo siguiente en su .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? En general, la apuesta más segura pero lenta es hacer siempre copias de seguridad copiando.

(setq backup-by-copying t)

Si eso es demasiado lento por alguna razón, también podrías echarle un vistazo backup-by-copying-when-linked.

Dado que sus copias de seguridad están en su lugar ahora, 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 absolutamente no debe tener archivos de respaldo:

(setq make-backup-files nil)

Sin embargo, me enferma pensar en ello.

jfm3
fuente
66
oye, pero está creando copias de seguridad con un nombre como este! home! svradmin! foo ~ y no puedo abrir el archivo
Jaime Hablutzel
33
¿Por qué usar copias de seguridad? ¿Por qué no usar git / mercurial? los buenos sistemas de control de versiones y las metodologías de programación deberían superar el respaldo de archivos individuales por parte del editor
vol7ron
52
@ vol7ron: las copias de seguridad son para cuando está editando algo que no está bajo control de versiones, como un archivo de configuración o algo rápido y sucio que aún no ha podido poner en control de versión. Luego, cuando no ha estado haciendo lo que debería, el editor le salva el cuello.
Epónimo
69
@ vol7ron - Eso está mal. No deberías poner basura en el control de revisión que no quieres mantener. Simplemente hace que encontrar las cosas importantes sea mucho más difícil. En cambio, use las copias de seguridad de su editor para lo que son buenas (copia de seguridad de los cambios en caso de emergencia) y el control de revisión para lo que es bueno (mantener versiones importantes de su software y facilitar el desarrollo del equipo). Use la herramienta adecuada para el trabajo.
TED
26
"Los archivos de respaldo agregan tanta sobrecarga y casi ningún valor": ¿no es eso un juicio crítico?
Variable miserable
70

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-filesno es nulo, Emacs crea automáticamente una copia de seguridad del archivo original la primera vez que el archivo se guarda desde un búfer. Si está editando un nuevo archivo, Emacs creará una copia de seguridad la segunda vez que guarde el archivo.

No importa cuántas veces guarde el archivo, la copia de seguridad permanece sin cambios. Si cierra el búfer y luego vuelve a visitar el archivo, o la próxima vez que inicie una nueva sesión de Emacs, se creará un nuevo archivo de respaldo. La nueva copia de seguridad refleja el contenido del archivo después de volver a abrir, o al comienzo de las sesiones de edición. Pero una copia de seguridad existente nunca se vuelve a tocar. Por lo tanto, me resulta útil crear copias de seguridad numeradas (consulte la configuración a continuación).

Para crear copias de seguridad explícitamente use save-buffer( C-x C-s) con argumentos de prefijo.

diff-backupy dired-diff-backupcompara un archivo con su copia de seguridad o viceversa. Pero no hay 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 automáticamente archivos

Los archivos de guardado automático usan hashmarks ( #) 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 solo archivos temporales que Emacs crea hasta que un archivo se guarda nuevamente (como con la obediencia apresurada).

  • Antes de que el usuario presione C-x C-s( save-buffer) para guardar un archivo, Emacs guarda automáticamente los archivos, según el recuento de las pulsaciones de teclas ( auto-save-interval) o cuando deja de escribir ( auto-save-timeout).
  • Emacs también se guarda automáticamente cada vez que se bloquea, 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 se bloquea, los archivos guardados automáticamente todavía existen.

Use revert-buffero recover-filepara restaurar archivos de guardado automático. Tenga en cuenta que Emacs registra sesiones interrumpidas para su recuperación posterior en archivos llamados ~ / .emacs.d / auto-save-list . La recover-sessionfunción usará esta información.

El método preferido para recuperarse de un archivo guardado automáticamente es M-x revert-buffer RET. Emacs preguntará "Buffer ha sido guardado automáticamente recientemente. ¿Revertir desde el archivo de guardado automático?" o "¿Revertir el búfer del archivo FILENAME?". En el caso de este último, no hay archivo de guardado automático. Por ejemplo, porque ha guardado antes de escribir otras auto-save-intervallpulsaciones de teclas, en cuyo caso Emacs había eliminado el archivo de guardado automático.

El guardado automático está deshabilitado actualmente de forma predeterminada porque puede ralentizar la edición cuando está conectado 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 distribuya copias de archivos con datos confidenciales. Use este modo por archivo. Como este es un modo menor, para mis propósitos lo renombré sensitive-minor-mode.

Para habilitarlo para todos los archivos .vcf y .gpg , en sus .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.

Andreas Spindler
fuente
¿Entonces no usas autoguardado? ¿Estas configuraciones le permiten evitar tener que ver esos desagradables archivos # filename.tex # en su carpeta?
PascalVKooten
3
Siempre uso el guardado automático y los archivos de respaldo de manera predeterminada, excepto los archivos con datos confidenciales. El modo sensible deshabilita el autoguardado y las copias de seguridad. Por cierto, los archivos # file.ext # no son realmente desagradables, porque Emacs los crea y los elimina según sea necesario. Si permanecen, Emacs todavía se está ejecutando, o son un artefacto de un Emacs estrellado. En ambos casos pueden salvar el día ;-)
Andreas Spindler
Ah, gracias por esa información extra. De hecho, tengo una experiencia principalmente positiva con ellos (me salvaron el día). Solo cuando buscas fealdad, bueno, lo tienes justo ahí :)
PascalVKooten
Por cierto, una cosa es hacer copias de seguridad, y una cosa diferente es restaurar las copias de seguridad. Por lo tanto, juega con el guardado automático. Elimine el trabajo de Emacs o la sesión ssh. Si hay un archivo de guardado automático diff, con el archivo real. Luego dispara Emacs y descubre por ti mismo lo que revert-bufferhace. Esto dará sus frutos rápidamente en casos de emergencia.
Andreas Spindler
El modo sensible funciona muy bien. Gracias. Tenga en cuenta que en su publicación lo llama modo sensible-menor, mientras que en la definición (enlace) se llama modo sensible. Tal vez quieras alinear eso.
HeyMan 01 de
65

La respuesta aceptada es buena, pero se puede mejorar enormemente haciendo una copia de seguridad adicional en cada guardado y copia de seguridad de archivos versionados .

Primero, la configuración básica 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, que Emacs no hace de manera predeterminada (no se compromete en cada guardado, ¿verdad?):

(setq vc-make-backup-files t)

Finalmente, haga una copia de seguridad en cada guardado, no solo en el primero. Hacemos dos tipos de copias de seguridad:

  1. 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 respaldo predeterminado de Emac.

  2. copias de seguridad por guardado: una vez en cada guardado. Emacs no hace esto de manera predeterminada, pero es muy útil si deja Emacs funcionando 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 escribir en $<lugar de $@en mi Makefile, aproximadamente tres horas después de mi compromiso anterior: P

Lo anterior se basa en una página Wiki de Emacs que edité en gran medida .

ntc2
fuente
Pegué el código anterior dentro de mi archivo init.el, sin embargo, no obtengo ningún directorio de respaldo y emacs todavía crea los archivos de respaldo por todas partes. Podría haber entendido mal algo, soy nuevo en emacs: P
Soeholm
@Soeholm: ¿pegó todo el código en mi respuesta, incluidos los setqs en la parte superior de mi respuesta? Lo anterior funciona para mí en Emacs 24.5.1.
ntc2
Comenzó a funcionar ahora. Tenía todo el código pegado, así que no estoy seguro de por qué tardó en aceptar mi nueva configuración. Pero muchas gracias!
Soeholm
1
Como seguimiento, sé por qué no funcionó ahora. Funcionó en una máquina, pero no en la otra. Fue porque tenía un archivo .emacs vacío en mi directorio de inicio, que tenía prioridad sobre mi directorio .emacs.d. Error tonto ..
Soeholm
31

Otra forma de configurar las opciones de respaldo es a través de la interfaz Personalizar. Entrar:

M-x customize-group

Y luego en el Customize group:indicador ingrese backup.

Si se desplaza hasta la parte inferior del búfer, verá Copia de seguridad de la lista de directorios . Haga clic en Mostrar valor y configure la primera entrada de la lista de la siguiente manera:

Regexp matching filename: .*
Backup directory name: /path/to/your/backup/dir

Alternativamente, puede desactivar las copias de seguridad de mi configuración Hacer archivos de copia de seguridad en off.

Si no desea que Emacs edite automáticamente su .emacsarchivo, querrá configurar un archivo de personalización .

Dave Webb
fuente
44
Desearía haberlo sabido hace customize-group2 años. ¡Gracias!
wprl
30

Puede deshabilitarlos por completo

(setq make-backup-files nil)
Paweł Hajdan
fuente
Me gusta configurar esto desde el indicador de comandos de shell, cuando salto de host a host no me gusta tener archivos .emacs: emacs --eval "(setq make-backup-files nil)"
Dave Morse