web-dev-qa-db-fra.com

Comment puis-je contrôler la manière dont Emacs crée les fichiers de sauvegarde?

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

312
jfm3

Si vous avez déjà été enregistré par un fichier de sauvegarde Emacs, vous en voudrez probablement plus, pas moins. Il est agaçant qu’ils se trouvent dans le même répertoire que le fichier que vous modifiez, mais il est facile de le modifier. Vous pouvez faire en sorte que tous les fichiers de sauvegarde entrent dans un répertoire en mettant quelque chose comme ceci dans votre .emacs.

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

Un certain nombre de détails obscurs sont associés à la manière dont Emacs peut créer vos fichiers de sauvegarde. Devrait-il renommer l'original et écrire le tampon modifié? Et si l'original est lié? En général, le pari le plus sûr mais le plus lent est de toujours effectuer des sauvegardes en les copiant.

(setq backup-by-copying t)

Si cela est trop lent pour une raison quelconque, vous pouvez également consulter backup-by-copying-when-linked.

Étant donné que vos sauvegardes se trouvent toutes à leur place, vous voudrez peut-être en avoir davantage, plutôt que moins. Consultez 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.

494
jfm3

Les fichiers de sauvegarde/sauvegarde automatique d'Emacs peuvent être très utiles. Mais ces caractéristiques sont déroutantes.

Fichiers de sauvegarde

Les fichiers de sauvegarde ont des tildes (~ ou ~9~) à la fin et doivent être écrits dans le répertoire de base de l'utilisateur. Lorsque make-backup-files est différent de zéro, Emacs crée automatiquement une sauvegarde du fichier d'origine lors de la première sauvegarde du fichier à partir d'un tampon. Si vous éditez un nouveau fichier, Emacs créera une sauvegarde la deuxième fois que vous sauvegarderez le fichier.

Peu importe le nombre de fois que vous enregistrez le fichier, la sauvegarde reste inchangée. Si vous supprimez le tampon et que vous visitez à nouveau le fichier, ou lors du prochain démarrage d'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 de modification. 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-backup et dired-diff-backup comparent un fichier avec sa sauvegarde ou inversement. 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 comme

C:\Users\USERNAME\.emacs.el

Sauvegarde automatique des fichiers

Les fichiers de sauvegarde automatique utilisent des marques de hachage (#) 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 ne sont que des fichiers temporaires créés par Emacs jusqu’à ce qu’un fichier soit à nouveau sauvegardé (comme avec l’obéissance pressante).

  • Avant que l'utilisateur n'appuie sur C-x C-s (save-buffer) pour enregistrer un fichier, Emacs enregistre automatiquement les fichiers - en fonction du nombre de frappes au clavier (auto-save-interval) ou lorsque vous arrêtez de taper (auto-save-timeout).
  • Emacs enregistre également automatiquement chaque fois qu'il se bloque, notamment en supprimant le travail Emacs à l'aide d'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-buffer ou recover-file pour restaurer les fichiers à enregistrement automatique. Notez que Emacs enregistre les sessions interrompues pour une récupération ultérieure dans des fichiers nommés ~/.emacs.d/auto-save-list . La fonction recover-session utilisera ces informations.

La méthode préférée pour récupérer un fichier sauvegardé automatiquement est M-x revert-buffer RET. Emacs demandera soit "La mémoire tampon a été enregistrée automatiquement récemment. Revenir en arrière du fichier de sauvegarde automatique?" ou "Rétablir le tampon du fichier FILENAME?". Dans ce dernier cas, il n'y a pas de fichier de sauvegarde automatique. Par exemple, parce que vous avez enregistré avant de saisir une autre touche auto-save-intervall, auquel cas Emacs a supprimé le fichier de sauvegarde automatique.

La sauvegarde automatique est de nos jours désactivée par défaut, car elle peut ralentir l'édition lorsque vous êtes connecté à un ordinateur lent et parce que de nombreux fichiers contiennent des données sensibles.

Configuration

Voici une configuration que 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 qu'Emacs distribue 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é sensitive-minor-mode.

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

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

Sinon, pour ne protéger que certains fichiers, comme certains fichiers . Txt , utilisez une ligne comme

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

dans le fichier.

65
Andreas Spindler

Le réponse acceptée est bon, mais il peut être grandement amélioré par une sauvegarde supplémentaire de à chaque sauvegarde et sauvegarde fichiers versionnés .

Premièrement, les paramètres de base décrits dans le 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 commettez pas à chaque enregistrement, non?):

(setq vc-make-backup-files t)

Enfin, effectuez une sauvegarde sur chaque sauvegarde, pas seulement la première. Nous faisons deux types de sauvegardes:

  1. sauvegardes par session: une fois sur la sauvegarde du tampon dans chaque session Emacs. Celles-ci simulent le comportement de sauvegarde par défaut d'Emac.

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

Les les sauvegardes vont dans des endroits différents 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 = La page du wiki Emacs que j’ai lourdement modifiée .

58
ntc2

Une autre façon de configurer les options de sauvegarde consiste à utiliser l'interface Personnaliser. Entrer:

M-x customize-group

Et ensuite, à l'invite Customize group:, entrez backup.

Si vous faites défiler l'écran jusqu'au bas de la mémoire tampon, vous verrez la liste des répertoires de sauvegarde . Cliquez sur Afficher 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 paramètres de sauvegarde . Créer des fichiers de sauvegarde en off.

Si vous ne voulez pas qu'Emacs modifie automatiquement votre fichier .emacs, vous voudrez configurer un fichier de personnalisations .

31
Dave Webb

Vous pouvez les désactiver complètement en

(setq make-backup-files nil)
29
Paweł Hajdan