Comment contrôler la façon dont Emacs crée les fichiers de sauvegarde?

327

Emacs met des fichiers de sauvegarde nommés foo~partout et je n'aime pas avoir à me rappeler de les supprimer. De plus, si je modifie un fichier qui a un lien dur ailleurs dans le système de fichiers, le lien dur pointe vers la sauvegarde lorsque j'ai terminé la modification, et c'est déroutant et horrible. Comment puis-je éliminer ces fichiers de sauvegarde ou les faire aller ailleurs que dans le même répertoire?

jfm3
la source

Réponses:

519

Si vous avez déjà été enregistré par un fichier de sauvegarde Emacs, vous en voulez probablement plus, pas moins. Il est ennuyeux qu'ils se retrouvent dans le même répertoire que le fichier que vous modifiez, mais c'est facile à changer. Vous pouvez faire entrer tous les fichiers de sauvegarde dans un répertoire en mettant quelque chose comme ce qui suit dans votre .emacs.

(setq backup-directory-alist `(("." . "~/.saves")))

Il existe un certain nombre de détails obscurs associés à la façon dont Emacs peut créer vos fichiers de sauvegarde. Doit-il renommer l'original et écrire le tampon édité? Et si l'original est lié? En général, le pari le plus sûr mais le plus lent est de toujours faire des sauvegardes en copiant.

(setq backup-by-copying t)

Si c'est trop lent pour une raison quelconque, vous pouvez également y jeter un œil backup-by-copying-when-linked.

Étant donné que vos sauvegardes sont toutes à leur place maintenant, vous en voudrez peut-être plus, plutôt que moins. Jetez un œil à la documentation Emacs pour ces variables (avec C-h v).

(setq delete-old-versions t
  kept-new-versions 6
  kept-old-versions 2
  version-control t)

Enfin, si vous ne devez absolument pas avoir de fichiers de sauvegarde:

(setq make-backup-files nil)

Cela me rend malade d'y penser cependant.

jfm3
la source
6
hey mais il crée des sauvegardes avec un nom comme celui-ci! home! svradmin! foo ~ et je ne peux pas ouvrir le fichier
Jaime Hablutzel
33
pourquoi utiliser des sauvegardes? pourquoi ne pas utiliser git / mercurial? de bons systèmes de contrôle de version et des méthodologies de programmation devraient l'emporter sur la sauvegarde de fichiers individuels par l'éditeur
vol7ron
52
@ vol7ron: Les sauvegardes sont pour quand vous éditez quelque chose qui n'est pas sous contrôle de version - comme un fichier de configuration ou quelque chose de rapide et sale que vous n'avez pas encore réussi à mettre en contrôle de version. Ensuite, lorsque vous n'avez pas fait ce que vous devriez faire, l'éditeur vous sauve le cou.
Éponyme du
69
@ vol7ron - C'est juste faux. Vous ne devriez pas mettre de conneries dans le contrôle des révisions que vous ne voulez pas garder. Cela rend plus difficile de trouver les choses importantes. Utilisez plutôt les sauvegardes de votre éditeur pour leur utilité (sauvegarde des modifications en cas d'urgence) et le contrôle des révisions pour ce qui est bon (conservation des versions importantes de votre logiciel et facilitation du développement de l'équipe). Utilisez le bon outil pour le travail.
TED
26
"Les fichiers de sauvegarde ajoutent tellement de frais généraux et presque aucune valeur": n'est-ce pas du jugement?
Variable misérable
70

Les fichiers de sauvegarde / sauvegarde automatique d'Emacs peuvent être très utiles. Mais ces caractéristiques prêtent à confusion.

Fichiers de sauvegarde

Les fichiers de sauvegarde ont des tildes ( ~ou ~9~) à la fin et doivent être écrits dans le répertoire personnel de l'utilisateur. Quand make-backup-filesest non nul, Emacs crée automatiquement une sauvegarde du fichier d'origine la première fois que le fichier est enregistré à partir d'un tampon. Si vous modifiez un nouveau fichier, Emacs créera une sauvegarde la deuxième fois que vous enregistrerez le fichier.

Peu importe le nombre de fois que vous enregistrez le fichier, la sauvegarde reste inchangée. Si vous tuez le tampon puis visitez à nouveau le fichier, ou la prochaine fois que vous démarrez une nouvelle session Emacs, un nouveau fichier de sauvegarde sera créé. La nouvelle sauvegarde reflète le contenu du fichier après sa réouverture ou au début des sessions d'édition. Mais une sauvegarde existante n'est plus jamais touchée. Par conséquent, je trouve utile de créer des sauvegardes numérotées (voir la configuration ci-dessous).

Pour créer explicitement des sauvegardes, utilisez save-buffer( C-x C-s) avec des arguments de préfixe.

diff-backupet dired-diff-backupcompare un fichier avec sa sauvegarde ou vice versa. Mais il n'y a pas de fonction pour restaurer les fichiers de sauvegarde. Par exemple, sous Windows, pour restaurer un fichier de sauvegarde

C:\Users\USERNAME\.emacs.d\backups\!drive_c!Users!USERNAME!.emacs.el.~7~

il doit être copié manuellement

C:\Users\USERNAME\.emacs.el

Fichiers à sauvegarde automatique

Les fichiers à sauvegarde automatique utilisent des hachages ( #) et doivent être écrits localement dans le répertoire du projet (avec les fichiers réels). La raison en est que les fichiers à sauvegarde automatique ne sont que des fichiers temporaires qu'Emacs crée jusqu'à ce qu'un fichier soit à nouveau enregistré (comme avec une obéissance pressée).

  • Avant que l'utilisateur appuie sur C-x C-s( save-buffer) pour enregistrer un fichier, Emacs enregistre automatiquement les fichiers - en fonction du nombre de frappes ( auto-save-interval) ou lorsque vous arrêtez de taper ( auto-save-timeout).
  • Emacs enregistre également automatiquement chaque fois qu'il se bloque, y compris la suppression du travail Emacs avec une commande shell.

Lorsque l'utilisateur enregistre le fichier, la version enregistrée automatiquement est supprimée. Mais lorsque l'utilisateur quitte le fichier sans l'enregistrer, Emacs ou la session X se bloque, les fichiers enregistrés automatiquement existent toujours.

Utilisez revert-bufferou recover-filepour restaurer les fichiers à sauvegarde automatique. Notez qu'Emacs enregistre les sessions interrompues pour une récupération ultérieure dans des fichiers nommés ~ / .emacs.d / auto-save-list . La recover-sessionfonction utilisera ces informations.

La méthode préférée pour récupérer à partir d'un fichier enregistré automatiquement est M-x revert-buffer RET. Emacs demandera soit "Le tampon a été enregistré automatiquement récemment. Rétablir à partir du fichier d'enregistrement automatique?" ou "Restaurer le tampon du fichier FILENAME?". Dans ce dernier cas, il n'y a pas de fichier d'enregistrement automatique. Par exemple, parce que vous avez enregistré avant de taper une autre auto-save-intervallséquence de touches, auquel cas Emacs a supprimé le fichier d'enregistrement automatique.

L'enregistrement automatique est aujourd'hui désactivé par défaut car il peut ralentir l'édition lorsqu'il est connecté à une machine lente et parce que de nombreux fichiers contiennent des données sensibles.

Configuration

Voici une configuration qui IMHO fonctionne le mieux:

(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)
      )

Données sensibles

Un autre problème est que vous ne voulez pas que Emacs diffuse des copies de fichiers contenant des données sensibles. Utilisez ce mode fichier par fichier. Comme il s'agit d'un mode mineur, je l'ai renommé à mes fins sensitive-minor-mode.

Pour l'activer pour tous les fichiers .vcf et .gpg , dans vos .emacs, utilisez quelque chose comme:

(setq auto-mode-alist
      (append
       (list
        '("\\.\\(vcf\\|gpg\\)$" . sensitive-minor-mode)
        )
       auto-mode-alist))

Alternativement, pour protéger uniquement certains fichiers, comme certains fichiers .txt , utilisez une ligne comme

// -*-mode:asciidoc; mode:sensitive-minor; fill-column:132-*-

dans le fichier.

Andreas Spindler
la source
Vous n'utilisez donc pas la sauvegarde automatique? Ces paramètres vous permettent d'éviter d'avoir à voir ces mauvais fichiers # filename.tex # dans votre dossier?
PascalVKooten
3
J'utilise toujours la sauvegarde automatique et les fichiers de sauvegarde par défaut, à l'exception des fichiers contenant des données sensibles. Le mode sensible désactive l'enregistrement automatique et les sauvegardes. BTW, les fichiers # file.ext # ne sont pas vraiment désagréables, car Emacs les crée et les supprime selon les besoins. S'ils restent, soit Emacs est toujours en cours d'exécution, soit ils sont un artefact d'un Emacs en panne. Dans les deux cas, ils peuvent sauver la mise ;-)
Andreas Spindler
Ah, merci pour ces informations supplémentaires. J'ai en effet une expérience plutôt positive avec eux (ils m'ont sauvé la journée). Ce n'est que lorsque vous recherchez la laideur, que vous l'avez fait ici :)
PascalVKooten
BTW c'est une chose de faire des sauvegardes, et une autre chose pour restaurer les sauvegardes. Jouez donc avec la sauvegarde automatique. Tuez le travail Emacs ou la session ssh. S'il existe un fichier d'enregistrement automatique, diffil contient le fichier réel. Ensuite, lancez Emacs et découvrez par vous-même ce qui se revert-bufferpasse. Cela portera ses fruits rapidement en cas d'urgence.
Andreas Spindler
Le mode sensible fonctionne très bien. Merci. Veuillez noter que dans votre message, vous l'appelez mode sensible-mineur alors que dans la définition (lien), il est appelé mode sensible. Vous voulez peut-être aligner cela.
HeyMan
65

La réponse acceptée est bonne, mais elle peut être grandement améliorée en sauvegardant en outre chaque sauvegarde et en sauvegardant les fichiers versionnés .

Tout d'abord, les paramètres de base décrits dans la réponse acceptée :

(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.

Ensuite, sauvegardez également les fichiers versionnés, ce que Emacs ne fait pas par défaut (vous ne vous engagez pas à chaque sauvegarde, non?):

(setq vc-make-backup-files t)

Enfin, faites une sauvegarde sur chaque sauvegarde, pas seulement la première. Nous réalisons deux types de sauvegardes:

  1. sauvegardes par session: une fois lors de la première sauvegarde du tampon dans chaque session Emacs. Ceux-ci simulent le comportement de sauvegarde par défaut d'Emac.

  2. sauvegardes par sauvegarde: une fois à chaque sauvegarde. Emacs ne fait pas cela par défaut, mais c'est très utile si vous laissez Emacs fonctionner pendant longtemps.

Les sauvegardes vont à différents endroits et Emacs crée automatiquement les répertoires de sauvegarde s'ils n'existent pas:

;; 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)

Je suis devenu très intéressé par ce sujet après avoir écrit $<au lieu de $@dans mon Makefile, environ trois heures après mon précédent commit: P

Ce qui précède est basé sur une page Wiki Emacs que j'ai fortement éditée .

ntc2
la source
J'ai collé le code ci-dessus dans mon fichier init.el, mais je n'ai pas de répertoire de sauvegarde et emacs crée toujours les fichiers de sauvegarde partout. J'ai peut-être mal compris quelque chose, je suis nouveau sur emacs: P
Soeholm
@Soeholm: avez-vous collé tout le code dans ma réponse, y compris les setqs en haut de ma réponse? Ce qui précède fonctionne pour moi dans Emacs 24.5.1.
ntc2
Cela a commencé à fonctionner maintenant. J'avais tout le code collé, donc je ne sais pas pourquoi il a été lent à accepter ma nouvelle configuration. Mais merci beaucoup!
Soeholm
1
À titre de suivi, je sais pourquoi cela n'a pas fonctionné maintenant. Cela a fonctionné sur une machine, mais pas sur l'autre. C'est parce que j'avais un fichier .emacs vide dans mon répertoire personnel, qui avait la priorité sur mon répertoire .emacs.d. Erreur idiote ..
Soeholm
31

Une autre façon de configurer les options de sauvegarde est via l'interface de personnalisation. Entrer:

M-x customize-group

Et puis à l' Customize group:invite entrez backup.

Si vous faites défiler vers le bas du tampon, vous verrez la liste des répertoires de sauvegarde . Cliquez sur Afficher la valeur et définissez la première entrée de la liste comme suit:

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

Vous pouvez également désactiver les sauvegardes de mon paramètre Créer des fichiers de sauvegarde sur off.

Si vous ne voulez pas qu'Emacs édite automatiquement votre .emacsfichier, vous voudrez créer un fichier de personnalisation .

Dave Webb
la source
4
J'aurais aimé savoir il y a environ customize-group2 ans. Je vous remercie!
wprl
30

Vous pouvez les désactiver complètement en

(setq make-backup-files nil)
Paweł Hajdan
la source
J'aime le définir à partir de l'invite du shell, lorsque je passe d'hôte en hôte, je n'aime pas avoir les fichiers .emacs: emacs --eval "(setq make-backup-files nil)"
Dave Morse