Come controllo il modo in cui Emacs crea i file di backup?


327

Emacs mette i file di backup chiamati foo~ovunque e non mi piace ricordare di eliminarli. Inoltre, se modifico un file che ha un hard link da qualche altra parte nel file system, il hard link punta al backup quando ho terminato la modifica, e questo è confuso e terribile. Come posso eliminare questi file di backup o farli andare altrove rispetto alla stessa directory?

Risposte:


519

Se sei mai stato salvato da un file di backup di Emacs, probabilmente ne vorresti di più, non di meno. È fastidioso che vadano nella stessa directory del file che stai modificando, ma è facile da cambiare. Puoi fare in modo che tutti i file di backup vadano in una directory inserendo qualcosa come il seguente nel tuo .emacs.

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

Esistono numerosi dettagli arcani associati a come Emacs potrebbe creare i tuoi file di backup. Dovrebbe rinominare l'originale e scrivere il buffer modificato? Cosa succede se l'originale è collegato? In generale, la scommessa più sicura ma più lenta è fare sempre i backup copiando.

(setq backup-by-copying t)

Se questo è troppo lento per qualche motivo, potresti anche dare un'occhiata backup-by-copying-when-linked.

Poiché i backup sono tutti al loro posto ora, potresti volerne di più, anziché di meno. Dai un'occhiata alla documentazione di Emacs per queste variabili (con C-h v).

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

Infine, se non devi assolutamente avere file di backup:

(setq make-backup-files nil)

Mi fa male pensarci.


6
ehi ma sta creando dei backup con un nome come questo! home! svradmin! foo ~ e non riesco ad aprire il file
Jaime Hablutzel,

33
perché usare i backup? perché non usare git / mercurial? i buoni sistemi di controllo delle versioni e le metodologie di programmazione dovrebbero
superare

52
@ vol7ron: i backup sono per quando stai modificando qualcosa che non è sotto il controllo della versione - come un file di configurazione o qualcosa di veloce e sporco che non sei ancora riuscito a mettere in controllo della versione. Quindi, quando non hai fatto ciò che dovevi, l'editor ti salva il collo.
Eponimo

69
@ vol7ron - È solo sbagliato. Non dovresti mettere la merda nel controllo di revisione che non vuoi mantenere. Rende solo più difficile trovare le cose importanti. Invece, usa i tuoi backup di editor per ciò che sono utili (backup delle modifiche in caso di emergenza) e controllo di revisione per ciò che è utile (mantenere versioni importanti del tuo software e facilitare lo sviluppo del team). Usa lo strumento giusto per il lavoro.
TED,

26
"I file di backup aggiungono così tanto sovraccarico e quasi nessun valore": non è quel giudizio?
Miserabile variabile,

70

I file di backup / salvataggio automatico di Emacs possono essere molto utili. Ma queste funzionalità sono confuse.

File di backup

I file di backup hanno tilde ( ~o ~9~) alla fine e devono essere scritti nella home directory dell'utente. Quando make-backup-filesnon è zero, Emacs crea automaticamente un backup del file originale la prima volta che il file viene salvato da un buffer. Se stai modificando un nuovo file, Emacs creerà un backup la seconda volta che salvi il file.

Indipendentemente da quante volte si salva il file, il backup rimane invariato. Se si annulla il buffer e si visita nuovamente il file o al successivo avvio di una nuova sessione di Emacs, verrà creato un nuovo file di backup. Il nuovo backup riflette il contenuto del file dopo la riapertura o all'inizio delle sessioni di modifica. Ma un backup esistente non viene mai più toccato. Pertanto trovo utile creare backup numerati (vedere la configurazione seguente).

Per creare backup utilizzare esplicitamente save-buffer( C-x C-s) con argomenti prefisso.

diff-backupe dired-diff-backupconfronta un file con il suo backup o viceversa. Ma non esiste alcuna funzione per ripristinare i file di backup. Ad esempio, in Windows, per ripristinare un file di backup

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

deve essere copiato manualmente come

C:\Users\USERNAME\.emacs.el

Salva automaticamente i file

I file di salvataggio automatico utilizzano hashmarks ( #) e devono essere scritti localmente nella directory del progetto (insieme ai file effettivi). Il motivo è che i file di salvataggio automatico sono solo file temporanei creati da Emacs fino a quando un file non viene nuovamente salvato (come con l'obbedienza affrettata).

  • Prima che l'utente prema C-x C-s( save-buffer) per salvare un file, Emacs salva automaticamente i file, basandosi sul conteggio dei tasti ( auto-save-interval) o quando si interrompe la digitazione ( auto-save-timeout).
  • Emacs inoltre salva automaticamente ogni volta che si arresta in modo anomalo, incluso l'uccisione del lavoro Emacs con un comando shell.

Quando l'utente salva il file, la versione salvata automaticamente viene eliminata. Ma quando l'utente esce dal file senza salvarlo, Emacs o la sessione X si arresta in modo anomalo, i file salvati automaticamente continuano a esistere.

Utilizzare revert-buffero recover-fileper ripristinare i file di salvataggio automatico. Si noti che Emacs registra sessioni interrotte per un successivo recupero nei file denominati ~ / .emacs.d / auto-save-list . La recover-sessionfunzione utilizzerà queste informazioni.

Il metodo preferito per il recupero da un file salvato automaticamente è M-x revert-buffer RET. Emacs chiederà "Il buffer è stato salvato automaticamente di recente. Ripristinare dal file di salvataggio automatico?" o "Ripristina buffer dal file FILENAME?". In quest'ultimo caso non esiste un file di salvataggio automatico. Ad esempio, poiché hai salvato prima di digitare un'altra auto-save-intervallsequenza di tasti, nel qual caso Emacs aveva eliminato il file di salvataggio automatico.

Il salvataggio automatico è oggi disabilitato per impostazione predefinita perché può rallentare la modifica quando è collegato a una macchina lenta e perché molti file contengono dati riservati.

Configurazione

Ecco una configurazione che IMHO funziona meglio:

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

Dati sensibili

Un altro problema è che non si desidera che Emacs diffonda copie di file con dati sensibili. Utilizzare questa modalità in base al file. Trattandosi di una modalità minore, per i miei scopi l'ho rinominata sensitive-minor-mode.

Per abilitarlo per tutti i file .vcf e .gpg , nei tuoi .emacs usa qualcosa come:

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

In alternativa, per proteggere solo alcuni file, come alcuni file .txt , utilizzare una riga come

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

nel file.


Quindi non usi il salvataggio automatico? Queste impostazioni ti consentono di evitare di dover vedere quei file cattivi # nomefile.tex # nella tua cartella?
PascalVKooten,

3
Uso sempre il salvataggio automatico e i file di backup per impostazione predefinita, ad eccezione dei file con dati sensibili. La modalità sensibile disabilita il salvataggio automatico e i backup. A proposito, i file # file.ext # non sono davvero cattivi, perché Emacs li crea e li elimina quando necessario. Se rimangono o Emacs è ancora in esecuzione, o sono un artefatto di un Emacs andato in crash. In entrambi i casi possono salvare la giornata ;-)
Andreas Spindler,

Ah, grazie per quelle informazioni extra. Ho davvero un'esperienza per lo più positiva con loro (mi hanno salvato la giornata). Solo quando stai cercando bruttezza, beh, ce l'hai proprio lì :)
PascalVKooten

A proposito, una cosa è fare i backup e un'altra cosa ripristinare i backup. Quindi gioca con il salvataggio automatico. Uccidi il lavoro Emacs o la sessione ssh. Se è presente un file di salvataggio automatico, diffesso viene salvato con il file effettivo. Quindi licenzia Emacs e scopri da solo cosa revert-bufferfa. Ciò pagherà rapidamente in caso di emergenza.
Andreas Spindler,

La modalità sensibile funziona alla grande. Grazie. Tieni presente che nel tuo post lo chiami modalità sensibile-minore mentre nella definizione (link) è chiamato modalità sensibile. Forse vuoi allinearlo.
HeyMan,

65

La risposta accettata è buona, ma può essere notevolmente migliorata eseguendo il backup aggiuntivo su ogni salvataggio e backup dei file con versione .

Innanzitutto, le impostazioni di base come descritto nella risposta accettata :

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

Successivamente, esegui anche il backup dei file con versione, che Emacs non esegue per impostazione predefinita (non esegui il commit su ogni salvataggio, giusto?):

(setq vc-make-backup-files t)

Infine, esegui un backup su ogni salvataggio, non solo sul primo. Eseguiamo due tipi di backup:

  1. backup per sessione: una volta al primo salvataggio del buffer in ogni sessione di Emacs. Simulano il comportamento di backup predefinito di Emac.

  2. backup per salvataggio: una volta per ogni salvataggio. Emacs non lo fa per impostazione predefinita, ma è molto utile se lasci Emacs in esecuzione per molto tempo.

I backup vanno in posti diversi ed Emacs crea automaticamente le directory di backup se non esistono:

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

Mi sono interessato molto a questo argomento dopo aver scritto $<invece che $@nel mio Makefile, circa tre ore dopo il mio precedente impegno: P

Quanto sopra si basa su una pagina Wiki di Emacs che ho modificato pesantemente .


Ho incollato il codice sopra nel mio file init.el, ma non ottengo alcuna directory di backup ed emacs crea ancora i file di backup dappertutto. Potrei aver frainteso qualcosa, sono nuovo di
Emacs

@Soeholm: hai incollato tutto il codice nella mia risposta, comprese le setqs in cima alla mia risposta? Quanto sopra funziona per me in Emacs 24.5.1.
ntc2,

Ha iniziato a funzionare ora. Avevo incollato tutto il codice, quindi non sono sicuro del motivo per cui è stato lento accettare la mia nuova configurazione. Ma grazie mille!
Soeholm,

1
Come follow-up, so perché non ha funzionato ora. Funzionava su una macchina, ma non sull'altra. Era perché avevo un file .emacs vuoto nella mia directory home, che aveva la priorità sulla mia directory .emacs.d. Errore sciocco ..
Soeholm,

31

Un altro modo di configurare le opzioni di backup è tramite l'interfaccia Personalizza. Accedere:

M-x customize-group

E poi al Customize group:prompt inserire backup.

Se scorri fino alla fine del buffer, vedrai Elenco directory di backup . Fare clic su Mostra valore e impostare la prima voce dell'elenco come segue:

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

In alternativa, è possibile attivare i backup dalla mia impostazione rendere i file di backup a off.

Se non vuoi che Emacs modifichi automaticamente il tuo .emacsfile, dovrai impostare un file di personalizzazioni .


4
Vorrei averlo conosciuto circa customize-group2 anni fa. Grazie!
wprl

30

Puoi disabilitarli del tutto entro

(setq make-backup-files nil)

Mi piace impostarlo dal prompt della shell, quando sto passando da un host all'altro non mi piace avere file .emacs: emacs --eval "(setq make-backup-files nil)"
Dave Morse
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.