Emacs hat zwei voneinander unabhängige Sicherheits-Mechanismen, die ständig verwechselt werden: Auto-Save schützt dich gegen einen Crash zwischen zwei manuellen Speicher-Vorgängen und legt dafür parallele #name#-Dateien an. Backups schützen dich gegen versehentliches Überschreiben und legen vor jedem Speichern eine name~-Kopie der alten Version an. Wer beides ungekümmert laufen lässt, hat nach wenigen Tagen #hello.txt# und hello.txt~ neben hello.txt im Projekt liegen — und einen Git-Status, der vor lauter Müll-Dateien unbenutzbar wird. Dieser Artikel sortiert die beiden Mechanismen sauber, zeigt die Standard-Konfiguration und die moderne auto-save-visited-mode-Variante, und räumt die Müll-Dateien einmalig aus deinen Projekt-Ordnern.
Auto-Save (#name#) — der Crash-Schutz
Auto-Save ist die Antwort auf die Frage „Was passiert, wenn Emacs (oder das ganze System) zwischen zwei C-x C-s abstürzt?". Emacs schreibt deinen Buffer-Inhalt in regelmäßigen Abständen in eine parallele Datei mit demselben Namen, eingerahmt von zwei Hash-Zeichen: aus hello.txt wird #hello.txt# im selben Verzeichnis.
Die Defaults dazu:
| Variable | Default | Bedeutung |
|---|---|---|
auto-save-interval | 300 | Tastenanschläge zwischen zwei Auto-Saves |
auto-save-timeout | 30 | Sekunden Idle-Zeit, nach denen zwischendurch gespeichert wird |
auto-save-default | t | Auto-Save für neue Buffer global ein- oder ausschalten |
Wichtig zum Verständnis: die #name#-Datei ist keine reguläre Datei, die du selbst anfassen sollst. Sie ist ein internes Recovery-Artefakt. Lebenszyklus:
- Beim ersten Auto-Save eines Buffers entsteht
#name#. - Jeder weitere Auto-Save überschreibt diese Datei.
- Sobald du den Buffer manuell mit C-x C-s speicherst, löscht Emacs
#name#automatisch — der Schutz wird nicht mehr gebraucht, die Quelldatei ist auf Stand. - Beim normalen Buffer-Kill (ohne vorher zu speichern) bleibt
#name#liegen, damit sie nach einem erneuten Öffnen noch verfügbar ist.
Nach einem Crash öffnest du die betroffene Datei wie gewohnt und rufst dann M-x recover-file RET auf. Emacs zeigt dir einen Diff zwischen Quell-Datei und Auto-Save-Datei und fragt, ob du die Auto-Save-Version übernehmen willst. Wenn ja, ersetzt sie den Buffer-Inhalt — gespeichert wird erst, wenn du selbst C-x C-s drückst.
Backups (name~) — die Vor-Speichern-Sicherheit
Backups beantworten eine andere Frage: „Was, wenn ich gleich C-x C-s drücke und mein letzter Edit war Mist?". Vor jedem Speichern kopiert Emacs die alte Datei nach name~ — dieselbe Datei, mit einer Tilde am Ende. Damit hast du immer eine Vor-Version, falls dein aktueller Buffer-Stand schlimmer ist als der auf der Platte.
Die wichtigsten Variablen:
| Variable | Default | Effekt bei t |
|---|---|---|
make-backup-files | t | Backups werden überhaupt erzeugt |
backup-by-copying | nil | Quelldatei wird kopiert statt umbenannt — schont Hardlinks und Symlinks |
version-control | nil | numerierte Versionen name.~1~, name.~2~, … statt nur name~ |
kept-new-versions | 2 | wie viele der neuesten numerierten Versionen behalten werden |
kept-old-versions | 2 | wie viele der ältesten numerierten Versionen behalten werden |
delete-old-versions | nil | bei t werden überzählige Versionen ohne Nachfrage gelöscht |
Ein produktives Minimal-Setup, das versionierte Backups aktiviert und alte Versionen still aufräumt:
;; Backups behalten — aber strukturiert und nicht ewig
(setq make-backup-files t ; Default ist t, hier zur Doku
backup-by-copying t ; Symlinks/Hardlinks nicht brechen
version-control t ; numerierte Backups: foo.~1~, foo.~2~
kept-new-versions 5 ; die 5 neuesten behalten
kept-old-versions 2 ; die 2 ältesten behalten
delete-old-versions t) ; Rest still entsorgenWo dieser Code hingehört
Das Snippet gehört in deine init.el (üblich: ~/.emacs.d/init.el oder ~/.config/emacs/init.el). Wenn dir Aufbau und Reihenfolge der Konfigurations-Dateien noch nicht vertraut sind, lohnt vorher ein Blick in den Artikel Konfiguration mit init.el und early-init.el — dort steht, wie die Datei gefunden wird, was early-init.el zusätzlich kann und wie sich Snippets mit use-package sauber strukturieren lassen.
Beide Dateien aus dem Projekt-Ordner verbannen
Das ist die Pflicht-Sektion für jeden, der Emacs neben Git nutzt. Mit den Defaults landen sowohl #name#- als auch name~-Dateien direkt neben der Quelldatei. In einem Repo bedeutet das: git status zeigt sie als untracked, find stolpert über sie, Build-Tools nehmen sie versehentlich mit, und früher oder später committet jemand eine Backup-Datei.
Die saubere Lösung sind zwei Variablen, die alle Auto-Save- und Backup-Pfade zentral umlenken:
backup-directory-alist— Liste aus(Regex . Zielordner)für Backupsauto-save-file-name-transforms— Liste aus(Regex Zielordner t)für Auto-Saves
Der empfohlene Default leitet beide auf zentrale Ordner unter user-emacs-directory um:
;; Alle Backups nach ~/.emacs.d/backups/
(setq backup-directory-alist
`((".*" . ,(concat user-emacs-directory "backups/"))))
;; Alle Auto-Save-Dateien nach ~/.emacs.d/auto-saves/
;; Das abschließende t bedeutet: Pfad als Verzeichnis behandeln
(setq auto-save-file-name-transforms
`((".*" ,(concat user-emacs-directory "auto-saves/") t)))Effekt: dein Projekt-Ordner bleibt komplett sauber, alle #- und ~-Dateien landen zentral an einem Ort, der nicht im Repo liegt. Vor dem ersten Speichern sollten die Verzeichnisse existieren — Emacs legt sie meist selbst an, manche Builds (besonders im Container) aber nicht. Im Zweifel einmalig:
mkdir -p ~/.emacs.d/backups ~/.emacs.d/auto-savesWo dieser Code hingehört
Wieder init.el. Reihenfolge ist egal, weil beide Variablen erst beim nächsten Save-Vorgang ausgewertet werden — du musst Emacs aber neu starten oder mit M-x eval-buffer die Änderung übernehmen, damit sie greift.
auto-save-visited-mode — die moderne Alternative
Wer mit dem klassischen #name#-Mechanismus nichts anfangen kann, findet seit Emacs 26 eine konzeptionell andere Variante: auto-save-visited-mode speichert nicht in eine Parallel-Datei, sondern direkt in die echte Datei, in regelmäßigen Abständen. Das Verhalten kennt man aus Google Docs oder Notion: kein „Speichern" mehr, sondern „Live-Save".
;; Buffer alle 30 Sekunden direkt in die echte Datei schreiben
(setq auto-save-visited-interval 30)
(auto-save-visited-mode 1)Wo das Snippet hingehört, ist wie immer init.el — Details im Konfigurations-Kapitel.
Vor- und Nachteile gegeneinander abwägen:
| Aspekt | Klassisch (#name#) | auto-save-visited-mode |
|---|---|---|
| Parallel-Dateien im Projekt | ja (#name#) | nein |
| Vor-Speichern-Backup | über name~ (unabhängig) | über name~ (unabhängig) |
| „Mal eben ausprobieren" | unproblematisch — Quelldatei bleibt unverändert | problematisch — Änderung ist nach 30s persistent |
| Externe Watcher / Linter | werden nicht ausgelöst | werden alle 30s ausgelöst |
| Recovery nach Crash | über recover-file | nicht nötig — die Datei IST der aktuelle Stand |
Viele moderne Setups (Doom Emacs, Spacemacs) aktivieren auto-save-visited-mode per Default. Für eigene Konfigurationen ist die Entscheidung Geschmacks- und Workflow-Sache: wer im Editor regelmäßig „Stand A merken, Stand B ausprobieren, ggf. zurück"-Schleifen fährt, bleibt besser beim klassischen Mechanismus. Wer Emacs als „Tipp-Werkzeug ohne Speichern-Reflex" nutzen will, ist mit auto-save-visited-mode glücklicher.
no-littering — eine Zeile gegen den ganzen Müll
Backup- und Auto-Save-Pfade sind nur zwei von vielen Stellen, an denen Emacs Daten neben deinen Quelldateien ablegt: recentf, savehist, bookmarks, eshell-History, lsp-Server-Logs, Paket-Locks und Verzeichnis-Caches kommen alle mit eigenen Default-Pfaden — oft direkt in ~/.emacs.d/ oder im Projekt selbst. Das Paket no-littering definiert für all diese Pfade saubere Defaults unter ~/.emacs.d/var/ und ~/.emacs.d/etc/.
Ein typisches Setup mit use-package, das Backup- und Auto-Save-Pfade gleich mit umzieht:
(use-package no-littering
:ensure t
:config
;; Backups in den von no-littering verwalteten var-Ordner
(setq backup-directory-alist
`(("." . ,(no-littering-expand-var-file-name "backup/"))))
;; Auto-Save-Dateien dito
(setq auto-save-file-name-transforms
`((".*" ,(no-littering-expand-var-file-name "auto-save/") t))))Auch dieses Snippet gehört in die init.el, idealerweise früh — viele andere Pakete (Backups, recentf, savehist) lesen ihre Pfade direkt beim Laden ein. Mehr zum Paket und zum Pfad-Layout steht im Artikel no-littering und Pfade. Für jedes neue Setup ist no-littering praktisch das erste Paket nach use-package selbst.
Konflikte mit Git, Linter und Cloud-Sync
Selbst mit umgeleiteten Pfaden gibt es noch einige Praxis-Stolperfallen:
- Git — die
.gitignorejedes Projekts sollte mindestens*~und\#*\#enthalten. Damit verschwinden auch versehentlich am Default-Ort entstandene Müll-Dateien ausgit status. Wer den globalen Gitignore-Mechanismus nutzt, kann beide Muster in~/.config/git/ignorelegen — gilt dann projekt-übergreifend. - Pre-Commit-Hooks und Linter — manche Hooks laufen über alle Dateien im Verzeichnis, nicht nur über die gestaged-ten. Liegt ein
#README.md#daneben, läuft die Markdown-Prüfung darüber und meldet kryptische Fehler. Konsequente Umleitung der Auto-Saves löst das einmalig. - Cloud-Sync (Dropbox, iCloud, OneDrive) — Emacs-Auto-Save-Dateien werden vom Sync-Dienst mitgenommen, was bei parallel geöffneten Editoren zu Konflikt-Dateien führt. Die
auto-save-file-name-transformsaus Sektion 03 lösen das, weil~/.emacs.d/typischerweise nicht im Sync-Ordner liegt. Für Lock-Files (.#name) gibt es einen verwandten Mechanismus — Details im Folge-Artikel Lock-Files und Multi-Edit. - Container-Builds — wer Emacs in einem Container nutzt und einen Projekt-Mount editiert, schreibt Auto-Saves sonst direkt in den Host-Ordner. Auch hier hilft die globale Umleitung — der Zielordner sollte im Container existieren und beschreibbar sein.
Auto-Save manuell kontrollieren
Auch wenn Auto-Save den Großteil seiner Arbeit unsichtbar erledigt, gibt es ein paar Befehle, mit denen du gezielt eingreifen kannst:
| Befehl | Effekt |
|---|---|
M-x auto-save-mode | Auto-Save für den aktuellen Buffer ein- oder ausschalten |
M-x do-auto-save | Jetzt sofort auto-saven — kein Warten auf Idle oder Anschläge |
M-x recover-file | eine bestimmte Datei aus ihrer #name#-Auto-Save wiederherstellen |
M-x recover-session | eine ganze frühere Session über ~/.emacs.d/auto-save-list/ zurückholen |
M-x auto-save-visited-mode | die moderne Live-Save-Variante toggeln |
Besonders unterschätzt ist M-x recover-session: Emacs schreibt beim Start eine Session-Liste, die alle Buffer mit Auto-Save-Datei enthält. Nach einem Komplett-Absturz reicht ein Aufruf, um alle ungespeicherten Buffer einer Sitzung in einem Rutsch zurückzuholen — manuelles recover-file pro Datei entfällt.
Beide Intervall-Variablen lassen sich für besonders intensive oder besonders ruhige Workflows anpassen:
;; Häufiger zwischenspeichern (kürzere Idle-Zeit)
(setq auto-save-timeout 10)
;; Auch nach weniger Tastenanschlägen speichern
(setq auto-save-interval 100)Empfehlung für den ersten Setup
Wenn du noch keinen Plan hast und einfach einen sauberen Start willst, kopiere den folgenden Block 1:1 in deine init.el. Er aktiviert beide Mechanismen, leitet beide aus dem Projekt-Ordner um und schaltet versionierte Backups mit automatischem Aufräumen ein:
;; ---------- Backups ----------
;; Versioniert, kopierend, alte Versionen still entsorgen,
;; alles zentral nach ~/.emacs.d/backups/
(setq backup-directory-alist
`((".*" . ,(concat user-emacs-directory "backups/")))
backup-by-copying t
version-control t
kept-new-versions 5
kept-old-versions 2
delete-old-versions t)
;; ---------- Auto-Save ----------
;; Klassischer Mechanismus, Dateien aber zentral nach
;; ~/.emacs.d/auto-saves/ statt neben die Quelldatei
(setq auto-save-file-name-transforms
`((".*" ,(concat user-emacs-directory "auto-saves/") t))
auto-save-default t
auto-save-timeout 20
auto-save-interval 200)Wo dieser Code hingehört
init.el. Beim nächsten Start ist alles aktiv. Wer das Snippet ohne Neustart testen will, markiert den Block und ruft M-x eval-region auf. Die Detail-Erklärung, in welche Datei welcher Teil deiner Konfiguration gehört und wie sie sich mit use-package strukturieren lässt, steht im Artikel Konfiguration mit init.el und early-init.el.
Häufige Stolperfallen
Auto-Save und Backup sind zwei verschiedene Mechanismen
Auto-Save (#name#) ist der Crash-Schutz — Emacs schreibt parallel mit, damit nach einem Absturz nichts verloren ist. Backup (name~) ist der Vor-Speichern-Schutz — Emacs sichert die alte Datei, bevor du sie überschreibst. Sie konfigurieren sich getrennt, räumen sich getrennt auf und werden ständig miteinander verwechselt.
Ohne Umleitung verschmutzen beide deinen Git-Status
Defaults legen #name# und name~ direkt neben die Quelldatei. In einem Repo bedeutet das untracked Files in jedem git status. backup-directory-alist und auto-save-file-name-transforms lösen das einmalig — siehe Sektion 03.
.gitignore muss `*~` und `\#*\#` enthalten
Selbst mit Umleitung in Emacs landen Backup-Dateien aus anderen Editoren (vim schreibt auch name~) im Repo. Beide Muster gehören in jede .gitignore oder ins globale ~/.config/git/ignore — als Sicherheits-Netz.
`backup-by-copying nil` bricht Symlinks
Default ist nil — Emacs benennt dann die Original-Datei in name~ um und schreibt eine neue Datei mit dem alten Namen. Bei Symlinks zeigt der Link danach auf name~, nicht mehr auf den aktuellen Stand. Bei Dotfile-Setups mit stow oder chezmoi und bei Container-Mounts garantiert ein Bug. Setze backup-by-copying auf t.
`auto-save-visited-mode` macht „mal eben probieren“ kaputt
Wer die moderne Variante aktiviert, kann sich nicht mehr darauf verlassen, dass eine Änderung erst beim manuellen Speichern persistent ist — nach 30 Sekunden ist sie es. Der klassische „mache Quatsch, beobachte Effekt, lade Datei neu"-Workflow geht damit nur noch über explizites Undo oder Git.
`no-littering` löst nicht nur Backups, sondern alles
Backup- und Auto-Save-Pfade sind nur zwei von vielen Müll-Quellen. recentf, savehist, bookmarks, lsp-Logs und Dutzende Paket-Caches haben eigene Defaults. no-littering ordnet sie alle in ein konsistentes var//etc/-Layout — ein einziges use-package-Statement statt zwanzig Einzelvariablen.
Cloud-Sync und Auto-Save vertragen sich nicht
Dropbox, iCloud und OneDrive synchronisieren jede #name#-Datei mit, sobald sie auftaucht. Bei mehreren parallel geöffneten Geräten entstehen daraus Konflikt-Dateien. Die Umleitung nach ~/.emacs.d/ aus Sektion 03 ist auch hier die Lösung, weil dieses Verzeichnis meist außerhalb der Sync-Ordner liegt.
`M-x recover-session` — der Lebensretter, den keiner kennt
Nach einem Absturz lädt recover-session alle Buffer der vorherigen Sitzung in einem Schritt zurück — ohne pro Datei einzeln recover-file aufzurufen. Die Session-Liste liegt unter ~/.emacs.d/auto-save-list/. Diese Funktion wird in Tutorials selten erwähnt und ist nach dem ersten Crash ein „warum wusste ich das nicht früher"-Moment.
Weiterführende Ressourcen
Externe Quellen
- GNU Emacs Manual — Auto-Save — offizielle Beschreibung von
#name#-Dateien, Intervallen und Recovery. - GNU Emacs Manual — Backup — Backup-Mechanismus,
make-backup-files,backup-by-copying. - GNU Emacs Manual — Backup Names —
name~vs.name.~N~, Versions-Strategien. - GNU Emacs Manual — Backup Deletion —
kept-old-versions,kept-new-versions,delete-old-versions. - emacscollective/no-littering — Paket-Repo mit vollständiger Liste der umgeleiteten Pfade.