360 votes

Comment puis-je contrôler la façon dont Emacs crée des fichiers de sauvegarde ?

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

573voto

jfm3 Points 13666

Si vous avez déjà eu votre cul sauvé par un fichier de sauvegarde Emacs, vous voulez probablement en avoir plus, pas moins. Il est ennuyeux qu'ils se trouvent dans le même répertoire que le fichier que vous éditez, mais c'est facile à changer. Vous pouvez faire en sorte que tous les fichiers de sauvegarde aillent dans un répertoire en plaçant quelque chose comme ce qui suit dans le fichier .emacs .

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

Il y a 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 modifié ? Que faire si l'original est lié ? En général, la solution la plus sûre mais la plus lente est de toujours faire des sauvegardes. en les copiant.

(setq backup-by-copying t)

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

Puisque vos sauvegardes sont toutes dans leur propre endroit maintenant, vous pourriez vouloir plus d'entre elles, plutôt que moins d'entre elles. Jetez un coup d'œ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 devez absolument ne pas avoir de fichiers de sauvegarde :

(setq make-backup-files nil)

Mais ça me rend malade d'y penser.

84voto

Andreas Spindler Points 1612

Les fichiers de sauvegarde/auto-save d'Emacs peuvent être très utiles. Mais ces fonctionnalités sont confuses.

Fichiers de sauvegarde

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

Quel que soit le nombre de fois où vous enregistrez le fichier, la sauvegarde reste inchangée. Si vous tuez le tampon et 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. C'est pourquoi je trouve utile de créer des sauvegardes numérotées (voir la configuration ci-dessous).

Pour créer des sauvegardes de manière explicite, utilisez save-buffer ( C-x C-s ) avec des arguments préfixes.

diff-backup et dired-diff-backup compare un fichier avec sa sauvegarde ou vice-versa. Mais il n'existe pas de fonction permettant de 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 comme

C:\Users\USERNAME\.emacs.el

Sauvegarde automatique des fichiers

Les fichiers d'auto-enregistrement utilisent des hachures ( # ) et doivent être écrits localement dans le répertoire du projet (avec les fichiers réels). La raison en est que les fichiers d'enregistrement automatique sont juste des fichiers temporaires qu'Emacs crée jusqu'à ce qu'un fichier soit enregistré à nouveau (comme avec l'obéissance précipitée).

  • Avant que l'utilisateur n'appuie sur C-x C-s ( save-buffer ) pour sauvegarder un fichier Emacs sauvegarde automatiquement les fichiers - sur la base du comptage des frappes au clavier ( auto-save-interval ) ou lorsque vous arrêtez de taper ( auto-save-timeout ).
  • Emacs s'auto-sauve également à chaque fois qu'il se plante, y compris en tuant le job Emacs avec une commande shell.

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

Utilisez revert-buffer ou recover-file pour restaurer les fichiers d'auto-enregistrement. Notez qu'Emacs enregistre les sessions interrompues pour une récupération ultérieure dans des fichiers nommés ~/.emacs.d/auto-save-list . Le site recover-session utilisera ces informations.

La méthode préférée pour récupérer un fichier sauvegardé automatiquement est la suivante M-x revert-buffer RET . Emacs demandera soit "Le tampon a été sauvegardé automatiquement récemment. Revenir en arrière à partir du fichier auto-save ?" ou "Revenir en arrière à partir du fichier FILENAME ?". Dans le dernier cas, il n'y a pas de fichier auto-save. Par exemple, si vous avez sauvegardé avant de taper un autre fichier auto-save-intervall dans ce cas, Emacs avait 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, à mon avis, 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 qu'Emacs répande des copies de fichiers contenant des données sensibles. Utilisez ce mode sur une base par fichier. Comme il s'agit d'un mode mineur, pour mes besoins, je l'ai renommé sensitive-minor-mode .

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

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

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

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

dans le fichier.

73voto

ntc2 Points 1643

Le site réponse acceptée est est bonne, mais elle peut être grandement améliorée par l'ajout de sauvegarder sur chaque sauvegarde et back-up versioned fichiers .

Tout d'abord, les paramètres de base tels que décrits dans le accepté réponse :

(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, il faut également sauvegarder les fichiers versionnés, ce qu'Emacs ne fait pas par défaut (vous ne commettez pas à chaque sauvegarde, n'est-ce pas ?) :

(setq vc-make-backup-files t)

Enfin, faites une sauvegarde à chaque sauvegarde, et pas seulement à la première. Nous faisons deux types de sauvegardes :

  1. sauvegardes par session : une fois sur le premièrement 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 sur chaque sauver. Emacs ne fait pas cela par par défaut, mais c'est très utile si vous laissez Emacs fonctionner pendant une longue longtemps.

Le site les sauvegardes vont dans 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 me suis beaucoup intéressé à 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 La page du wiki Emacs que j'ai fortement édité .

32voto

Dave Webb Points 90034

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

M-x customize-group

Et puis au Customize group: invite entrer backup .

Si vous faites défiler jusqu'au bas du tampon, vous verrez Liste des répertoires de sauvegarde . Cliquez sur Montrer la valeur et définir la première entrée de la liste comme suit :

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

Alternativement, vous pouvez désactiver les sauvegardes en paramétrant Faire des fichiers de sauvegarde à off .

Si vous ne voulez pas qu'Emacs modifie automatiquement votre fichier .emacs vous voudrez mettre en place un fichier de personnalisation .

32voto

Paweł Hajdan Points 8004

Vous pouvez les désactiver complètement en

(setq make-backup-files nil)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X