Datei öffnen, speichern, schließen — die Befehle, die du in den ersten Stunden mit Emacs tausendfach brauchst. Anders als in grafischen Editoren steckt hinter jedem dieser Vorgänge eine benannte Funktion, die du auch direkt aufrufen kannst, falls die Standard-Tasten bei dir nicht wirken. Dieser Artikel zeigt die Befehle in der Tiefe, in der man sie wirklich verinnerlichen sollte — und erklärt nebenbei, warum „Datei öffnen“ in Emacs eigentlich „Buffer aus Datei erzeugen“ heißt.

find-file: Dateien öffnen

C-x C-f

Der zentrale Befehl zum Öffnen heißt in Emacs find-file. Zwei Wege führen dorthin — und beide sollte man kennen, weil Distributionen wie Doom, Spacemacs oder Vanilla-Configs mit evil-mode die Default-Binding gerne überschreiben:

  • Tastenkombi: C-x C-f
  • Funktion direkt: M-x find-file RET

Wenn die Binding bei dir nichts tut, ist der M-x-Weg die sichere Bank — er ruft die Funktion unabhängig von jeder Tastatur-Belegung auf. Wie du herausfindest, was bei dir an C-x C-f hängt, beschreibt der Artikel zu Cancel und Undo im Kontext von C-h k (describe-key).

Was beim Aufruf passiert

Nach dem Drücken erscheint unten im Minibuffer der Prompt Find file: — gefolgt vom Pfad des Verzeichnisses, in dem die Datei des aktuellen Buffers liegt. Das ist wichtig: der Default-Pfad ist nicht das Verzeichnis, in dem du Emacs gestartet hast, sondern das aktuelle Buffer-Verzeichnis. Wer in ~/projekte/web/index.html editiert und C-x C-f drückt, bekommt ~/projekte/web/ als Ausgangspunkt.

Im Prompt arbeitest du wie in einer Shell:

  • Tippen, ergänzen, mit TAB vervollständigen
  • Mit RET öffnen
  • Mit C-g abbrechen — der Buffer bleibt unverändert, kein Schaden entsteht

Existiert die Datei nicht, legt Emacs keinen neuen Datei-Eintrag auf der Festplatte an, sondern öffnet einen leeren Buffer mit dem von dir eingegebenen Namen. Der Hinweis dazu erscheint kurz in der Echo-Area: (New file). Erst beim ersten Speichern wird die Datei tatsächlich erzeugt. Diese Trennung zwischen „Buffer existiert“ und „Datei existiert“ ist kein Detail, sondern das zentrale Buffer-Konzept — Hintergrund im Artikel zum Buffer-Konzept.

Varianten: anderes Window, anderer Frame, Ersatz

find-file hat mehrere Geschwister, die dieselbe Logik nutzen, aber das Ergebnis an anderer Stelle anzeigen. Alle lassen sich auch direkt über M-x aufrufen — die Funktionsnamen stehen in Klammern.

BindingFunktionWirkung
C-x C-ffind-fileöffnet die Datei im aktuellen Window
C-x 4 ffind-file-other-windowteilt den Frame und zeigt die Datei im anderen Window
C-x 5 ffind-file-other-frameöffnet die Datei in einem neuen Frame (OS-Fenster)
C-x t ffind-file-other-taböffnet die Datei in einem neuen Tab (benötigt tab-bar-mode)
C-x C-vfind-alternate-fileersetzt den aktuellen Buffer durch eine andere Datei

Die C-x 4- und C-x 5-Prefixe sind systematisch: 4 steht in Vanilla-Emacs immer für „anderes Window“, 5 für „anderer Frame“, t für „Tab“. Wer das einmal gesehen hat, ahnt bei jedem Window-Befehl die passende Variante.

find-alternate-file — der unterschätzte Helfer

C-x C-v öffnet die Datei nicht zusätzlich, sondern anstelle des aktuellen Buffers. Praktisch wirkt das wie eine URL-Korrektur im Browser: der Pfad ist bereits eingetragen, du kannst tippen, korrigieren, ergänzen — und landest mit RET in der angepassten Datei, während der falsche Buffer verschwindet. Wer versehentlich src/components/Header.tsx öffnet, obwohl Footer.tsx gemeint war, kommt mit C-x C-v in zwei Tasten zum richtigen Ergebnis statt erst zu schließen, neu zu öffnen, alte Buffer aufzuräumen.

save-buffer: den Buffer in seine Datei zurückschreiben

C-x C-s

Der Gegenpart zum Öffnen ist save-buffer. Auch hier zwei Wege:

  • Tastenkombi: C-x C-s
  • Funktion direkt: M-x save-buffer RET

Die Funktion schreibt den Buffer-Inhalt in die zugehörige Datei zurück — vorausgesetzt, der Buffer hat überhaupt eine. Bei einem scratch-Buffer oder einem frisch mit C-x C-f erzeugten neuen Buffer fragt Emacs erst nach dem Pfad und schwenkt intern auf write-file (siehe nächste Sektion).

Wenn der Buffer nicht verändert wurde, passiert beim Speichern nichts — Emacs meldet (No changes need to be saved). Das ist kein Fehler, sondern eine bewusste Optimierung: keine unnötigen Festplatten-Schreibvorgänge, keine geänderten Modification-Zeitstempel, keine triggernden Datei-Watcher.

Backup-Mechanik in Kürze

Vor dem Schreiben legt Emacs (in den Default-Einstellungen) eine Sicherungskopie der bisherigen Datei an: ein Suffix-Tilde ~ wird angehängt, aus notes.md wird notes.md~. Das Backup landet entweder neben der Originaldatei oder zentral in einem Backup-Verzeichnis, je nach Konfiguration. Details, Strategien (backup-by-copying, versionierte Backups, zentrales Verzeichnis) und das Zusammenspiel mit Auto-Save behandelt der eigene Artikel Auto-Save und Backups.

Modeline-Indikator

Ob ein Buffer ungespeicherte Änderungen hat, siehst du an den beiden Sternchen ** links in der Modeline. Nach erfolgreichem Speichern wechselt die Anzeige auf --. Wer mit mehreren Buffern arbeitet, gewöhnt sich schnell daran, vor einem Kontext-Wechsel kurz auf diese zwei Zeichen zu schauen.

save-some-buffers: mehrere Buffer auf einmal sichern

C-x s

save-some-buffers geht alle modifizierten Datei-Buffer durch und fragt für jeden einzeln, was zu tun ist. Auch hier wieder beide Wege:

  • Tastenkombi: C-x s
  • Funktion direkt: M-x save-some-buffers RET

Pro Buffer öffnet sich der Prompt Save file <pfad>? (y, n, !, ., q, C-r, C-f, d or C-h). Die wichtigsten Antworten:

TasteBedeutung
ydiesen Buffer speichern
nüberspringen
!diesen und alle weiteren ohne Nachfrage speichern
qabbrechen, restliche Buffer ignorieren
.nur diesen einen speichern und dann beenden
dDiff gegen die Datei auf Disk anzeigen, dann erneut fragen
C-rden Buffer in einem Recursive Edit ansehen, mit C-M-c zurück

Praktisch ist save-some-buffers vor allem indirekt — Emacs ruft es selbst auf, wenn du mit C-x C-c beendest. Allerdings fragt der Beenden-Workflow nur per y/n, ohne die volle Optionsleiste. Wer regelmäßig vorher selbst C-x s drückt, hat mehr Kontrolle — inklusive Diff vor dem Schreiben.

Mit Prefix-Argument: alle ohne Rückfrage

Mit Prefix-Argument C-u C-x s verzichtet save-some-buffers auf die Einzelfragen und speichert sofort alle modifizierten Datei-Buffer. Das ist das Pendant zu „Alle speichern“ aus grafischen Editoren — und beim Pair-Programming oder vor einem git commit deutlich schneller als die Y/N-Schleife.

write-file und rename-visited-file: Kopie speichern, Datei umbenennen

C-x C-w

write-file ist Emacs' Äquivalent zu „Speichern unter“:

  • Tastenkombi: C-x C-w
  • Funktion direkt: M-x write-file RET

Der Befehl fragt nach einem neuen Pfad, schreibt den Buffer-Inhalt dorthin und wechselt anschließend die Datei-Bindung des Buffers: ab jetzt zeigt der Buffer auf die neue Datei, weitere C-x C-s landen dort. Die Originaldatei bleibt unverändert auf der Festplatte zurück. Das ist die typische „Kopie ziehen und an der Kopie weiterarbeiten“-Operation.

rename-visited-file — die saubere Umbenennung

Wer eine Datei wirklich umbenennen und nicht kopieren will, braucht eine andere Funktion: rename-visited-file. Sie benennt die Datei auf der Festplatte um und zieht den Buffer-Namen mit — der alte Pfad existiert nicht mehr.

  • Funktion direkt: M-x rename-visited-file RET

Vorsicht beim Vergleich mit rename-buffer: das ändert ausschließlich den Buffer-Namen im Emacs-Sitzung, lässt die Datei auf Disk unangetastet und entkoppelt Buffer und Datei sogar. Wer im Dired-Modus arbeitet (siehe Dired-Artikel), hat dort mit R eine integrierte Umbenenn-Operation, die zusätzlich offene Buffer aktualisiert — für tägliche Datei-Verwaltung oft die ergonomischste Variante.

recentf: zuletzt geöffnete Dateien

Eine Liste der zuletzt geöffneten Dateien ist in Emacs built-in, aber per Default nicht aktiv. Das Paket heißt recentf und wird mit einer einzigen Zeile eingeschaltet:

elisp init.el — recentf aktivieren
;; Liste der zuletzt geöffneten Dateien aktivieren
(recentf-mode 1)

;; Großzügiges Limit — Default sind nur 20 Eintraege
(setq recentf-max-saved-items 200)

;; Wieviele Eintraege im Menue „File > Open Recent" stehen
(setq recentf-max-menu-items 25)

Wo dieser Code hingehört

Die Zeilen kommen in deine init.el (üblicher Pfad: ~/.emacs.d/init.el oder seit Emacs 27 ~/.config/emacs/init.el). Nach dem nächsten Emacs-Start ist recentf aktiv, die Liste wird in ~/.emacs.d/recentf persistiert und beim nächsten Start wieder geladen. Ausführlich zu Konfigurations-Dateien, Lade-Reihenfolge und use-package-Struktur: Konfiguration mit init.el und early-init.el.

Aufruf

Mit aktivem recentf-mode stehen zwei Befehle bereit:

  • M-x recentf-open-files RET öffnet einen Buffer mit anklickbarer, nummerierter Liste
  • M-x recentf-open RET nutzt den Minibuffer mit normaler Completion — praktisch, wenn du eine moderne Completion wie Vertico oder Ivy nutzt

Im Vertico-/Consult-Stack ist der schnellste Workflow M-x consult-recent-file — ein Fuzzy-Picker über die Recentf-Liste, der sich tippt wie eine normale Datei-Eingabe und beim ersten Treffer mit RET öffnet. Das macht recentf in der Praxis zum schnellsten Wiedereinstieg in eine Datei, an der man kürzlich gearbeitet hat.

Pfad-Eingabe-Tricks im Minibuffer

Der Minibuffer-Prompt von find-file (und allen verwandten Befehlen) versteht eine Reihe von Konventionen, die viel Zeit sparen, sobald man sie kennt. Sie funktionieren überall, wo Emacs nach einem Datei-Pfad fragt — auch in write-file, dired, load-file und Drittpaketen.

EingabeWirkung
~/Home-Verzeichnis des aktuellen Benutzers
~user/Home-Verzeichnis eines anderen Benutzers
//Reset auf Root — alles links vom doppelten Slash wird verworfen
/etc/...absolute Pfade beginnen mit Slash
$HOME/...Umgebungsvariablen werden expandiert
..übergeordnetes Verzeichnis

Die //-Konvention ist der praktische Liebling: tippst du im Prompt ~/projekte/web//etc/hosts, dann verwirft Emacs alles vor dem doppelten Slash und öffnet schlicht /etc/hosts. Praktisch, wenn der Default-Pfad in eine ganz andere Richtung zeigt und du nicht erst löschen willst. Analog springt ~/ mitten im Pfad zurück ins Home-Verzeichnis.

Tastatur-Navigation im Prompt

Innerhalb des Find-File-Prompts gibt es eigene Komfort-Bindings:

TasteWirkung
TABCompletion: vervollständigt den nächsten Pfad-Teil
SPCWort-Completion innerhalb eines Pfad-Segments (in manchen Setups)
M-pvorheriger Eintrag aus der History dieses Prompt-Typs
M-nnächster History-Eintrag
DELlöscht das letzte Pfad-Segment (nicht nur das letzte Zeichen!)
C-gbricht ab, ohne etwas zu öffnen

M-p ist der schnellste Weg zurück zu einer Datei, die du vor zwei Befehlen geöffnet hattest — die History pro Prompt-Typ ist sitzungsweit und überlebt jedes Buffer-Wechseln.

„File has changed since visited or saved“ — was tun?

Eine Stolperfalle, die früher oder später jeden trifft: die Datei wurde außerhalb von Emacs verändert (Git-Checkout, ein anderer Editor, ein automatischer Linter, ein Build-Tool, das die Datei formatiert hat). Beim nächsten C-x C-s fragt Emacs:

text Minibuffer-Prompt bei externer Aenderung
foo.go has changed since visited or saved.  Save anyway? (yes or no)

Die richtige Antwort hängt davon ab, was passiert ist — und vor allem, ob du deine Änderungen oder die externen Änderungen behalten willst.

AntwortWirkung
yesdein Buffer überschreibt die externe Änderung — diese ist verloren
no + M-x revert-bufferexterne Änderung übernehmen, dein Buffer-Inhalt geht verloren
no + M-x diff-buffer-with-fileerst Diff anzeigen, dann entscheiden
no + M-x ediff-current-fileinteraktiv mergen (Ediff-3-Wege)

diff-buffer-with-file öffnet einen Diff-Buffer zwischen deinem (modifizierten) Buffer und der Datei auf Disk — die zuverlässigste Methode, um zu sehen, was extern passiert ist, bevor du irgendwas überschreibst.

Auto-Sync mit global-auto-revert-mode

Wenn du häufig Dateien hast, die extern aktualisiert werden (Log-Dateien, Build-Output, formatierte Quellen), bietet sich der globale Auto-Revert-Modus an:

elisp init.el — globales Auto-Revert
;; Buffer automatisch neu laden, wenn die Datei auf Disk sich aendert
;; und der Buffer selbst keine ungespeicherten Aenderungen hat.
(global-auto-revert-mode 1)

;; Auch nicht-Datei-Buffer mit revert (z. B. Dired, Magit) automatisch aktualisieren
(setq global-auto-revert-non-file-buffers t)

;; Stille Aktualisierung — keine Meldung pro Buffer
(setq auto-revert-verbose nil)

Auch dieses Snippet gehört in deine init.el (Details: init.el und early-init.el). Die Sicherheits-Garantie ist wichtig: modifizierte Buffer werden nicht automatisch überschrieben. Auto-Revert wirkt nur, wenn dein Buffer und die Datei beide synchron waren — sobald du tippst, ist der Mechanismus für diesen Buffer suspendiert, bis du selbst speicherst oder revertest.

Interessantes

`find-file` öffnet keine Datei, sondern erzeugt einen Buffer

Was du auf dem Bildschirm siehst, ist nicht „die Datei“ — es ist ein Buffer mit dem Inhalt der Datei. Änderungen passieren ausschließlich im Buffer, bis du speicherst. Wer das Buffer-Konzept verinnerlicht hat, versteht alles Weitere besser — siehe Buffer-Konzept.

Default-Pfad ist das Verzeichnis des aktuellen Buffers

Der Find-File-Prompt startet nicht im Verzeichnis, aus dem du Emacs gestartet hast, sondern dort, wo der gerade aktive Buffer „wohnt“. Wer in ~/projekte/a/foo.go editiert und C-x C-f drückt, bekommt ~/projekte/a/ vorgegeben.

`C-x C-v` ist eines der unterschätztesten Helferlein

find-alternate-file korrigiert eine falsch geöffnete Datei im selben Buffer, statt erst zu schließen und neu zu öffnen. Wie eine URL-Korrektur — minimaler Aufwand, kein Buffer-Müll.

`save-some-buffers` mit Prefix wird zu „Alle speichern“

C-u C-x s überspringt die Einzelfragen und speichert sofort alle modifizierten Datei-Buffer. Das vertraute „Save All“ aus GUI-Editoren in zwei Tastenfolgen.

`recentf-mode` ist Built-in — kein externes Paket nötig

Ein Aufruf von (recentf-mode 1) reicht. In Kombination mit Vertico/Consult wird consult-recent-file zum schnellsten „Letzte Datei“-Picker, den Emacs zu bieten hat.

Die `//`-Pfad-Reset-Konvention ist Vanilla-Verhalten

Sie funktioniert in jedem Minibuffer-Prompt, der nach einem Datei-Pfad fragt — nicht nur in find-file. Auch write-file, dired, load-file und Dritt-Pakete verstehen sie.

`rename-visited-file` zieht den Buffer mit, `rename-buffer` nicht

rename-visited-file benennt Datei UND Buffer um — Buffer und Datei bleiben gekoppelt. rename-buffer ändert nur den Buffer-Namen und entkoppelt ihn von der Datei auf Disk. Für tägliche Umbenennungen ist Dired's R oft die ergonomischste Variante.

Wenn `C-x C-s` nichts tut, ist die Binding verbogen

Funktion testen mit M-x save-buffer RET, Binding inspizieren mit C-h k C-x C-s. Fallback ist immer der direkte Funktions-Aufruf — siehe Hintergrund im Artikel zu Cancel und Undo.

„No changes need to be saved“ ist kein Fehler

Wenn der Buffer unverändert ist, schreibt Emacs bewusst nichts — kein neuer Modification-Zeitstempel, keine triggernden Datei-Watcher. Das ist eine Feature, kein Bug.

Weiterführende Ressourcen

Externe Quellen

Verwandte Artikel

/ Weiter

Zurück zu Dateien & Verzeichnisse

Zur Übersicht