Wie steuere ich, wie Emacs Sicherungsdateien erstellt?

326

Emacs legt foo~überall benannte Sicherungsdateien ab und ich möchte nicht daran denken, sie zu löschen. Wenn ich eine Datei bearbeite, die irgendwo anders im Dateisystem einen festen Link hat, zeigt der feste Link auf das Backup, wenn ich mit dem Bearbeiten fertig bin, und das ist verwirrend und schrecklich. Wie kann ich diese Sicherungsdateien entweder entfernen oder an einem anderen Ort als im selben Verzeichnis ablegen?

jfm3
quelle

Antworten:

518

Wenn Sie jemals von einer Emacs-Sicherungsdatei gespeichert wurden, möchten Sie wahrscheinlich mehr davon, nicht weniger. Es ist ärgerlich, dass sie sich im selben Verzeichnis befinden wie die Datei, die Sie bearbeiten, aber das ist leicht zu ändern. Sie können alle Sicherungsdateien in ein Verzeichnis verschieben, indem Sie Folgendes in Ihr Verzeichnis einfügen .emacs.

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

Es gibt eine Reihe von geheimen Details darüber, wie Emacs Ihre Sicherungsdateien erstellen könnte. Sollte es das Original umbenennen und den bearbeiteten Puffer ausschreiben? Was ist, wenn das Original verlinkt ist? Im Allgemeinen ist es am sichersten, aber am langsamsten, immer Backups durch Kopieren zu erstellen.

(setq backup-by-copying t)

Wenn das aus irgendeinem Grund zu langsam ist, können Sie es sich auch ansehen backup-by-copying-when-linked.

Da sich Ihre Backups jetzt alle an ihrem eigenen Ort befinden, möchten Sie möglicherweise mehr davon als weniger. Schauen Sie sich die Emacs-Dokumentation für diese Variablen an (mit C-h v).

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

Wenn Sie unbedingt keine Sicherungsdateien haben müssen:

(setq make-backup-files nil)

Es macht mich krank, daran zu denken.

jfm3
quelle
6
Hey, aber es werden Backups mit einem Namen wie diesem erstellt! home! svradmin! foo ~ und ich kann die Datei nicht öffnen
Jaime Hablutzel
33
Warum Backups verwenden? warum nicht git / mercurial verwenden? Gute Versionskontrollsysteme und Programmiermethoden sollten die Sicherung einzelner Dateien durch den Editor
übertreffen
52
@ vol7ron: Die Backups sind für den Fall gedacht, dass Sie etwas bearbeiten, das nicht der Versionskontrolle unterliegt - wie eine Konfigurationsdatei oder etwas schnelles und schmutziges, das Sie noch nicht in die Versionskontrolle übernommen haben. Wenn Sie dann nicht das getan haben, was Sie sollten, spart der Editor Ihren Hals.
Gleichnamiger
69
@ vol7ron - Das ist einfach falsch. Sie sollten keinen Mist in die Revisionskontrolle stecken, den Sie nicht behalten möchten. Es macht es nur schwieriger, wichtige Dinge zu finden. Verwenden Sie stattdessen Ihre Editor-Backups für das, wofür sie gut sind (Sicherungsänderungen im Notfall sichern) und die Revisionskontrolle für das, wofür sie gut sind (wichtige Versionen Ihrer Software behalten und die Teamentwicklung erleichtern). Verwenden Sie das richtige Werkzeug für den Job.
TED
26
"Sicherungsdateien verursachen so viel Overhead und fast keinen Wert": Ist das nicht Urteilsvermögen?
Elende Variable
70

Emacs Backup / Auto-Save-Dateien können sehr hilfreich sein. Diese Funktionen sind jedoch verwirrend.

Sicherungs-Dateien

Sicherungsdateien haben am Ende Tildes ( ~oder ~9~) und werden in das Home-Verzeichnis des Benutzers geschrieben. Wenn dies make-backup-filesnicht Null ist, erstellt Emacs beim ersten Speichern der Datei aus einem Puffer automatisch eine Sicherungskopie der Originaldatei. Wenn Sie eine neue Datei bearbeiten, erstellt Emacs beim zweiten Speichern der Datei ein Backup.

Unabhängig davon, wie oft Sie die Datei speichern, bleibt die Sicherung unverändert. Wenn Sie den Puffer beenden und die Datei dann erneut aufrufen oder das nächste Mal eine neue Emacs-Sitzung starten, wird eine neue Sicherungsdatei erstellt. Die neue Sicherung spiegelt den Inhalt der Datei nach dem erneuten Öffnen oder zu Beginn der Bearbeitungssitzungen wider. Ein vorhandenes Backup wird jedoch nie wieder berührt. Daher finde ich es nützlich, nummerierte Backups zu erstellen (siehe Konfiguration unten).

Verwenden Sie zum expliziten Erstellen von Sicherungen save-buffer( C-x C-s) mit Präfixargumenten.

diff-backupund dired-diff-backupvergleicht eine Datei mit ihrer Sicherung oder umgekehrt. Es gibt jedoch keine Funktion zum Wiederherstellen von Sicherungsdateien. Zum Beispiel unter Windows, um eine Sicherungsdatei wiederherzustellen

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

es muss manuell kopiert werden als

C:\Users\USERNAME\.emacs.el

Dateien automatisch speichern

Beim automatischen Speichern von Dateien werden Hashmarks ( #) verwendet, die lokal im Projektverzeichnis (zusammen mit den tatsächlichen Dateien) geschrieben werden sollen. Der Grund dafür ist, dass automatisch gespeicherte Dateien nur temporäre Dateien sind, die Emacs erstellt, bis eine Datei erneut gespeichert wird (wie bei schnellem Gehorsam).

  • Bevor der Benutzer C-x C-s( save-buffer) drückt , um eine Datei zu speichern, speichert Emacs Dateien automatisch - basierend auf dem Zählen der Tastenanschläge ( auto-save-interval) oder wenn Sie aufhören zu tippen ( auto-save-timeout).
  • Emacs speichert auch automatisch, wenn es abstürzt, einschließlich des Beendens des Emacs-Jobs mit einem Shell-Befehl.

Wenn der Benutzer die Datei speichert, wird die automatisch gespeicherte Version gelöscht. Wenn der Benutzer die Datei jedoch beendet, ohne sie zu speichern, Emacs oder die X-Sitzung abstürzt, sind die automatisch gespeicherten Dateien weiterhin vorhanden.

Verwenden Sie revert-bufferoder recover-file, um automatisch gespeicherte Dateien wiederherzustellen. Beachten Sie, dass Emacs unterbrochene Sitzungen zur späteren Wiederherstellung in Dateien mit dem Namen ~ / .emacs.d / auto-save-list aufzeichnet . Die recover-sessionFunktion verwendet diese Informationen.

Die bevorzugte Methode zur Wiederherstellung aus einer automatisch gespeicherten Datei ist M-x revert-buffer RET. Emacs fragt entweder "Der Puffer wurde kürzlich automatisch gespeichert. Von der Datei zum automatischen Speichern zurücksetzen?" oder "Puffer aus Datei FILENAME zurücksetzen?". Im letzteren Fall gibt es keine automatisch gespeicherte Datei. Zum Beispiel, weil Sie vor dem Eingeben weiterer auto-save-intervallTastenanschläge gespeichert haben. In diesem Fall hat Emacs die Datei zum automatischen Speichern gelöscht.

Das automatische Speichern ist heutzutage standardmäßig deaktiviert, da es die Bearbeitung verlangsamen kann, wenn eine Verbindung zu einem langsamen Computer besteht, und weil viele Dateien vertrauliche Daten enthalten.

Aufbau

Hier ist eine Konfiguration, die meiner Meinung nach am besten funktioniert:

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

Sensible Daten

Ein weiteres Problem ist, dass Emacs keine Kopien von Dateien mit vertraulichen Daten verbreiten soll. Verwenden Sie diesen Modus für jede Datei. Da dies ein kleiner Modus ist, habe ich ihn für meine Zwecke umbenannt sensitive-minor-mode.

Um es für alle .vcf- und .gpg- Dateien zu aktivieren , verwenden Sie in Ihren .emacs Folgendes:

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

Verwenden Sie alternativ eine Zeile wie , um nur einige Dateien zu schützen, z. B. einige TXT- Dateien

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

in der Datei.

Andreas Spindler
quelle
Sie verwenden also keine automatische Speicherung? Mit diesen Einstellungen können Sie vermeiden, dass Sie diese fiesen # filename.tex # -Dateien in Ihrem Ordner sehen müssen.
PascalVKooten
3
Ich verwende standardmäßig immer Autosave- und Backup-Dateien, mit Ausnahme von Dateien mit vertraulichen Daten. Der sensible Modus deaktiviert die automatische Speicherung und Sicherung. Übrigens sind # file.ext # -Dateien nicht wirklich böse, da Emacs sie nach Bedarf erstellt und löscht. Wenn sie bleiben, läuft entweder Emacs noch oder sie sind ein Artefakt eines abgestürzten Emacs. In beiden Fällen können sie den Tag retten ;-)
Andreas Spindler
Ah, danke für diese zusätzlichen Informationen. Ich habe in der Tat überwiegend positive Erfahrungen mit ihnen gemacht (sie haben meinen Tag gerettet). Nur wenn Sie nach Hässlichkeit suchen, haben Sie es genau dort :)
PascalVKooten
Übrigens ist es eine Sache, Backups zu erstellen, und eine andere Sache, Backups wiederherzustellen. Spielen Sie daher mit Auto-Save. Beende den Emacs-Job oder die SSH-Sitzung. Wenn es eine automatisch gespeicherte Datei gibt, diffdiese mit der tatsächlichen Datei. Dann feuere Emacs ab und finde selbst heraus, was es revert-buffertut. Dies zahlt sich im Notfall schnell aus.
Andreas Spindler
Der Sensitive-Modus funktioniert hervorragend. Vielen Dank. Bitte beachten Sie, dass Sie in Ihrem Beitrag den sensitiven Moll-Modus nennen, während er in der Definition (Link) als sensitiver Modus bezeichnet wird. Vielleicht möchten Sie das ausrichten.
HeyMan
65

Die akzeptierte Antwort ist gut, kann jedoch durch zusätzliches Sichern bei jedem Speichern und Sichern versionierter Dateien erheblich verbessert werden .

Zunächst die Grundeinstellungen wie in der akzeptierten Antwort beschrieben :

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

Als nächstes sichern Sie auch versionierte Dateien, was Emacs nicht standardmäßig tut (Sie verpflichten sich nicht bei jedem Speichern, oder?):

(setq vc-make-backup-files t)

Erstellen Sie schließlich bei jedem Speichern ein Backup, nicht nur beim ersten. Wir machen zwei Arten von Backups:

  1. Sitzungssicherungen: Einmal beim ersten Speichern des Puffers in jeder Emacs-Sitzung. Diese simulieren das Standard-Backup-Verhalten von Emac.

  2. Backups pro Speicher: einmal bei jedem Speichern. Emacs macht dies nicht standardmäßig, aber es ist sehr nützlich, wenn Sie Emacs für längere Zeit laufen lassen.

Die Backups werden an verschiedenen Orten abgelegt und Emacs erstellt die Backup-Verzeichnisse automatisch, wenn sie nicht vorhanden sind:

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

Ich interessierte mich sehr für dieses Thema, nachdem ich etwa drei Stunden nach meinem vorherigen Commit $<anstelle von $@meinem geschrieben Makefilehatte: P.

Das Obige basiert auf einer Emacs-Wiki-Seite, die ich stark bearbeitet habe .

ntc2
quelle
Ich habe den obigen Code in meine init.el-Datei eingefügt, erhalte jedoch kein Sicherungsverzeichnis und emacs erstellt die Sicherungsdateien immer noch überall. Ich könnte etwas falsch verstanden haben, ich bin neu in Emacs: P
Soeholm
@Soeholm: Haben Sie den gesamten Code in meine Antwort eingefügt , einschließlich des setqs oben in meiner Antwort? Das obige funktioniert für mich in Emacs 24.5.1.
Ntc2
Es fing jetzt an zu arbeiten. Ich hatte den gesamten Code eingefügt, daher bin ich mir nicht sicher, warum es langsam war, meine neue Konfiguration zu akzeptieren. Aber vielen Dank!
Soeholm
1
Als Folge weiß ich, warum es jetzt nicht funktioniert hat. Es funktionierte auf einer Maschine, aber nicht auf der anderen. Das lag daran, dass ich eine leere .emacs-Datei in meinem Home-Verzeichnis hatte, die Vorrang vor meinem .emacs.d-Verzeichnis hatte.
Dummer
31

Eine andere Möglichkeit zum Konfigurieren von Sicherungsoptionen ist die Benutzeroberfläche zum Anpassen. Eingeben:

M-x customize-group

Und dann an der Customize group:Eingabeaufforderung eingeben backup.

Wenn Sie zum Ende des Puffers scrollen, wird Backup Directory Alist angezeigt . Klicken Sie auf Wert anzeigen und legen Sie den ersten Eintrag in der Liste wie folgt fest:

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

Alternativ können Sie schalten Sie Backups von meiner Einstellung Backup - Dateien Stellen zu off.

Wenn Emacs Ihre .emacsDatei nicht automatisch bearbeiten soll , müssen Sie eine Anpassungsdatei einrichten .

Dave Webb
quelle
4
Ich wünschte, ich hätte es vor ungefähr customize-group2 Jahren gewusst . Vielen Dank!
wprl
30

Sie können sie insgesamt deaktivieren, indem Sie

(setq make-backup-files nil)
Paweł Hajdan
quelle
Ich möchte dies über die Shell-Eingabeaufforderung festlegen. Wenn ich von Host zu Host hüpfe, möchte ich keine .emacs-Dateien haben: emacs --eval "(setq make-backup-files nil)"
Dave Morse