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:

VariableDefaultBedeutung
auto-save-interval300Tastenanschläge zwischen zwei Auto-Saves
auto-save-timeout30Sekunden Idle-Zeit, nach denen zwischendurch gespeichert wird
auto-save-defaulttAuto-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:

  1. Beim ersten Auto-Save eines Buffers entsteht #name#.
  2. Jeder weitere Auto-Save überschreibt diese Datei.
  3. 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.
  4. 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:

VariableDefaultEffekt bei t
make-backup-filestBackups werden überhaupt erzeugt
backup-by-copyingnilQuelldatei wird kopiert statt umbenannt — schont Hardlinks und Symlinks
version-controlnilnumerierte Versionen name.~1~, name.~2~, … statt nur name~
kept-new-versions2wie viele der neuesten numerierten Versionen behalten werden
kept-old-versions2wie viele der ältesten numerierten Versionen behalten werden
delete-old-versionsnilbei t werden überzählige Versionen ohne Nachfrage gelöscht

Ein produktives Minimal-Setup, das versionierte Backups aktiviert und alte Versionen still aufräumt:

elisp init.el — Backups versioniert und aufgerä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 entsorgen

Wo 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 Backups
  • auto-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:

elisp init.el — Müll-Dateien aus dem Projekt verbannen
;; 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:

shell Verzeichnisse vorhalten
mkdir -p ~/.emacs.d/backups ~/.emacs.d/auto-saves

Wo 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".

elisp init.el — auto-save-visited-mode aktivieren
;; 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:

AspektKlassisch (#name#)auto-save-visited-mode
Parallel-Dateien im Projektja (#name#)nein
Vor-Speichern-Backupüber name~ (unabhängig)über name~ (unabhängig)
„Mal eben ausprobieren"unproblematisch — Quelldatei bleibt unverändertproblematisch — Änderung ist nach 30s persistent
Externe Watcher / Linterwerden nicht ausgelöstwerden alle 30s ausgelöst
Recovery nach Crashüber recover-filenicht 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:

elisp init.el — no-littering als Komplettlösung
(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 .gitignore jedes Projekts sollte mindestens *~ und \#*\# enthalten. Damit verschwinden auch versehentlich am Default-Ort entstandene Müll-Dateien aus git status. Wer den globalen Gitignore-Mechanismus nutzt, kann beide Muster in ~/.config/git/ignore legen — 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-transforms aus 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:

BefehlEffekt
M-x auto-save-modeAuto-Save für den aktuellen Buffer ein- oder ausschalten
M-x do-auto-saveJetzt sofort auto-saven — kein Warten auf Idle oder Anschläge
M-x recover-fileeine bestimmte Datei aus ihrer #name#-Auto-Save wiederherstellen
M-x recover-sessioneine ganze frühere Session über ~/.emacs.d/auto-save-list/ zurückholen
M-x auto-save-visited-modedie 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:

elisp init.el — Auto-Save aggressiver/ruhiger einstellen
;; 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:

elisp init.el — Komplett-Setup für Auto-Save und Backups
;; ---------- 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

Verwandte Artikel

/ Weiter

Zurück zu Dateien & Verzeichnisse

Zur Übersicht