Buffer wechseln ist die häufigste Navigations-Aktion in Emacs — wer eine längere Session beobachtet, sieht den Cursor öfter zwischen Buffern springen als zwischen Dateien. Vanilla-Emacs liefert dafür zwei Tasten und eine Liste, mehr nicht. Das reicht erstaunlich weit. Wer aber täglich mit zwanzig offenen Buffern arbeitet, gewinnt mit modernen Frameworks wie consult einen Komfort, den man nach wenigen Tagen nicht mehr missen möchte. Dieser Artikel zeigt beide Welten — Vanilla zuerst, weil ohne ihr Verständnis kein Customizing Sinn ergibt, und Consult danach, weil es heute der De-facto-Standard im modernen Emacs-Stack ist.
C-x b — der Standard-Wechsel mit switch-to-buffer
Der Brot-und-Butter-Befehl heißt switch-to-buffer und liegt auf C-x b. Beim Drücken öffnet sich der Minibuffer mit dem Prompt „Switch to buffer (default …):" — und genau dort steckt schon der erste wichtige Mechanismus.
Drei mögliche Eingaben, drei verschiedene Verhalten:
| Eingabe | Verhalten |
|---|---|
| RET (leer) | wechselt zum Default — dem zuletzt besuchten Buffer, der gerade nirgendwo sichtbar ist |
| Buffer-Name + TAB + RET | Completion über alle Buffer; TAB vervollständigt, RET bestätigt |
| Name, der noch nicht existiert | Emacs fragt zur Bestätigung, dann wird ein neuer, leerer Buffer im Fundamental-Mode erzeugt |
Der letzte Punkt überrascht Umsteiger oft: Vertippt man sich, kann es passieren, dass plötzlich ein leerer Buffer namens foob aufmacht, der nichts mit dem gesuchten foo.bar zu tun hat. Vanilla schützt mit einer Rückfrage davor („Buffer foob does not exist; create? "), aber wer reflexhaft mit RET bestätigt, hat den Buffer in der Liste. Schaden richtet das keinen an — C-x k RET macht den neuen Buffer wieder weg. Wer das Verhalten ganz vermeiden möchte, nutzt später consult-buffer (Sektion 07).
Workflow-Trick — der schnelle Toggle zwischen zwei Buffern
Aus dem Default-Verhalten ergibt sich der vielleicht meistgenutzte Emacs-Mini-Trick überhaupt:
C-x b RETDiese drei Tasten springen sofort zum vorigen Buffer. Erneut gedrückt, geht es zurück. Das Verhalten entspricht exakt dem Alt+Tab in einem Window-Manager — nur eben für Emacs-Buffer. Wer Source-Code in einem Buffer hat und den passenden Test im anderen, pendelt damit ohne jede Liste oder Completion zwischen beiden Welten.
Will man den Ziel-Buffer stattdessen in einem anderen Window öffnen (also den aktuellen Buffer sichtbar lassen und den neuen daneben), gibt es die Variante:
C-x 4 bDas ist switch-to-buffer-other-window. Der Prefix C-x 4 ist generell das „in anderem Window"-Präfix — analog gibt es C-x 5 b für „in anderem Frame". Die Window-Mechanik selbst (wie splittet man? wie schließt man? wie verschiebt man Fokus?) ist Thema des Folgeartikels zu Fenster-Splits — für den Buffer-Wechsel reicht: C-x b ersetzt im aktuellen Window, C-x 4 b öffnet daneben.
C-x C-b — die klassische Buffer-Liste
Statt blind eines Namens kann man sich alle Buffer auflisten lassen. Der Vanilla-Weg dorthin ist list-buffers:
Es öffnet sich der Buffer *Buffer List* mit einer Tabelle: Status-Marker, Name, Größe, Major-Mode und Datei-Pfad. Die erste Spalte zeigt drei Marker, die man kennen sollte:
| Marker | Bedeutung |
|---|---|
. | aktueller Buffer |
% | read-only |
* | modifiziert (ungespeicherte Änderungen) |
Im Buffer-Menü gelten eigene Tasten — eine Auswahl der wichtigsten:
| Taste | Aktion |
|---|---|
| RET | öffnet den Buffer unter dem Cursor im aktuellen Window |
| o | öffnet in einem anderen Window (selektiert es) |
| d | markiert die Zeile zum Löschen |
| s | markiert die Zeile zum Speichern |
| u | entfernt alle Markierungen aus der Zeile |
| x | führt alle gesetzten Markierungen aus |
| g | aktualisiert die Liste |
| q | schließt das Buffer-Menü |
Mit C-u C-x C-b filtert die Liste auf Buffer, die tatsächlich Dateien besuchen — interne Buffer wie *Messages* oder *scratch* fallen dann weg. Wer sich an diese Liste gewöhnt, kommt mit Vanilla weit. Für tägliches Arbeiten mit dutzenden Buffern ist sie aber zu spartanisch — dafür gibt es ibuffer.
M-x ibuffer — das mächtigere Buffer-Menü
ibuffer ist seit Jahrzehnten Teil von Emacs und wirkt wie die Profi-Variante des Buffer-Menüs: dieselbe tabellarische Optik, aber mit Sortierung, Filtern, Gruppierung und Mass-Operations. Aufruf per M-x ibuffer — oder dauerhaft auf C-x C-b gelegt, was die meisten Anwender tun.
Die Bedien-Highlights:
| Taste | Aktion |
|---|---|
| s | Sortier-Präfix — danach z. B. m (Mode), v (Visit-Order), s (Size), f (Filename) |
| / | Filter-Präfix — z. B. m nach Mode, n nach Name (Regex), f nach Dateiname |
| / / | entfernt alle Filter |
| * * | Mark-Präfix — * m markiert nach Mode, * M nach Modified |
| D | killt alle markierten Buffer |
| S | speichert alle markierten Buffer |
Besonders praktisch: per Filter lässt sich die Liste auf „alle Python-Buffer", „alle modifizierten Dateien" oder „alle Buffer eines Projektpfads" reduzieren, dann mit Mass-Operations bearbeiten. Wer einmal hundert Org-Buffer mit drei Tasten speichert, weiß, was Vanilla nicht bietet.
Das Permanent-Mapping auf C-x C-b:
;; ibuffer ersetzt die klassische Buffer-Liste
(keymap-global-set "C-x C-b" #'ibuffer)Wo dieser Code hingehört: in ~/.emacs.d/init.el (bzw. ~/.config/emacs/init.el seit Emacs 27). Die ausführliche Erklärung zu Init-Dateien und ihrer Ladereihenfolge steht im Artikel zu init.el und early-init.el.
Buffer schließen — C-x k und seine Varianten
Wechseln ist eine Seite, Aufräumen die andere. Der zentrale Befehl ist kill-buffer:
Wie bei C-x b bietet der Minibuffer den Default an — und der ist hier der aktuelle Buffer. Wer also einfach C-x k RET drückt, schließt den Buffer, in dem er gerade arbeitet. Ein anderer Name im Prompt schließt den entsprechenden Buffer.
Bei einer modifizierten Datei-Buffer fragt Emacs immer zur Sicherheit nach: „Buffer foo.txt modified; kill anyway? (yes or no)". Hier reicht kein y — Emacs verlangt explizit das ausgeschriebene yes, damit man nicht aus Reflex etwas verliert.
Drei verwandte Befehle für andere Situationen:
| Befehl | Wirkung |
|---|---|
| C-x 4 0 | kill-buffer-and-window — schließt Buffer und das anzeigende Window in einem Schritt |
| M-x kill-some-buffers | geht alle Buffer durch und fragt einzeln (y/n/!/q) |
| M-x kill-matching-buffers | killt alle Buffer, deren Name auf ein Regex passt (mit Rückfrage je Treffer) |
kill-buffer-and-window ist im Alltag der unterschätzte Held: gerade wenn man Hilfe-Buffer, Compile-Output oder temporäre Splits angesehen hat, schließt diese eine Tastenkombi den Buffer und macht das Window wieder zu — kein nachträgliches C-x 0 nötig.
C-x → und C-x ← — Cycling ohne Prompt
Manchmal will man gar nicht zielgerichtet wechseln, sondern nur „eben mal in den nächsten Buffer rüber". Dafür gibt es next-buffer und previous-buffer:
Beide cyclen durch die Buffer in der Reihenfolge ihrer letzten Auswahl im aktuellen Frame — kein Minibuffer-Prompt, kein TAB, einfach nur weiter und zurück. Mit numerischem Prefix-Argument (C-u 3 C-x <right>) springt es um drei Positionen.
Eine Stolperfalle: die Default-Implementierung cyclet auch durch System-Buffer wie *Messages*, *Help* oder *Completions*. Wer nur durch „echte" Buffer wandern will, schreibt sich entweder einen kleinen Wrapper (zeigt das Customization-Kapitel ausführlich) oder nutzt direkt consult-buffer, das das Filtern von Haus aus mitbringt.
Modern — consult-buffer und der Vertico-Stack
Wer den modernen Completion-Stack rund um Vertico, Marginalia, Orderless und Consult kennt, ersetzt switch-to-buffer in der Regel komplett durch consult-buffer. Drei Gründe machen den Unterschied:
- Live-Vorschau: bewegt man den Cursor durch die Kandidaten-Liste, zeigt Emacs den jeweiligen Buffer sofort im sichtbaren Window. Kein Bestätigen, kein Hin-und-Her — einfach Cursor runter, schauen, bei Bedarf bleiben.
- Multi-Source: in derselben Liste erscheinen offene Buffer, kürzlich besuchte Dateien (über
recentf), Lesezeichen, Projekt-Buffer und (mit Erweiterungen) sogar Org-Headlines oder Eshell-Sessions. Mit einem Präfix-Buchstaben (b,f,m,p…) filtert man die Quelle. - Marginalia-Annotations: rechts neben jedem Eintrag stehen Modeline-Infos, Datei-Pfad und Größe — man wählt nicht mehr „blind" nach Namen, sondern sieht im selben Moment den Kontext.
Ein Minimal-Setup als Vorgeschmack — vollständige Erklärung im Artikel zu consult:
(use-package consult
:ensure t
:bind (("C-x b" . consult-buffer)
("C-x 4 b" . consult-buffer-other-window)
("C-x 5 b" . consult-buffer-other-frame)
("C-x p b" . consult-project-buffer)))Diese vier Bindings ersetzen die Vanilla-Varianten 1:1 und erweitern sie um die Projekt-Buffer-Variante. Voraussetzung sind ein laufender Completion-Stack (z. B. Vertico) und das consult-Paket aus MELPA — beides Inhalt eigener Artikel im Completion-Kapitel.
Eine ehrliche Empfehlung zum Schluss: wer einmal eine Woche mit consult-buffer und Live-Vorschau gearbeitet hat, kehrt selten zu Vanilla zurück. Vanilla bleibt aber wichtig, um zu verstehen, was unter der Haube passiert — und für Notfälle in einer fremden Emacs-Installation, in der nur die Defaults verfügbar sind.
FAQ
Warum erzeugt C-x b einen leeren Buffer, wenn ich mich vertippe?
Das ist Standardverhalten von switch-to-buffer: ein nicht existierender Name gilt als Wunsch nach einem neuen, leeren Buffer im Fundamental-Mode. Vanilla fragt zwar mit „Buffer xyz does not exist; create?" zur Sicherheit nach, aber wer reflexhaft bestätigt, hat den Buffer in der Liste. Wegmachen mit C-x k RET. Wer es ganz vermeiden möchte, nutzt consult-buffer — dort gibt es nur reale Kandidaten.
Wie wechsle ich nur durch reale Datei-Buffer, nicht durch *Messages* und Co.?
Mit ibuffer per Filter / f (nach Dateiname) oder / E (Negation eines Regex auf ^\*). Eleganter: consult-buffer zeigt System-Buffer in einer eigenen Source-Gruppe an, die per Konfiguration aus der Hauptliste entfernt werden kann. Für Vanilla-Cycling (C-x <right>) hilft nur ein eigener Wrapper, der *…*-Buffer überspringt.
Was ist der Unterschied zwischen C-x b und C-x 4 b?
C-x b (switch-to-buffer) ersetzt den Buffer im aktuellen Window. C-x 4 b (switch-to-buffer-other-window) öffnet den Ziel-Buffer in einem anderen Window — splittet bei Bedarf einen neuen — und macht ihn dort sichtbar. Der Prefix C-x 4 … ist generell das „in anderem Window"-Präfix, analog C-x 5 … für „in anderem Frame".
Kann ich Buffer in der Liste sortieren?
In ibuffer ja: s ist der Sortier-Präfix, danach m (nach Major-Mode), v (Visit-Reihenfolge), s (Größe) oder f (Dateiname). Im klassischen Buffer-Menü ist die Reihenfolge fix (Recency). Auch deshalb ist ibuffer für ernsthaftes Arbeiten der bessere Default.
Wie bekomme ich nur die Buffer eines bestimmten Projekts?
Built-in seit Emacs 28: M-x project-switch-to-buffer (standardmäßig auf C-x p b) listet nur Buffer des aktuellen Projekts. Mit Consult heißt das Pendant consult-project-buffer. Beide setzen voraus, dass project.el das aktuelle Projekt erkannt hat — typischerweise über die .git-Wurzel.
Warum verlangt C-x k bei modifizierten Buffern ein ausgeschriebenes 'yes'?
Das ist eine bewusste Schutzschicht: bei einem File-visiting Buffer mit ungespeicherten Änderungen ruft Emacs yes-or-no-p statt y-or-n-p auf, damit man nicht aus Reflex (y Daumendrücken) Datenverlust riskiert. Wer das stört, kann global (defalias 'yes-or-no-p 'y-or-n-p) setzen — empfohlen ist es nicht, weil dieselbe Logik auch in anderen kritischen Pfaden greift.
Gibt es ein Pendant zu Alt+Tab für Buffer?
Ja — C-x b RET ist genau das. Da der Default-Buffer immer der zuletzt besuchte ist, springt diese Sequenz mit drei Tasten zum vorigen Buffer; erneut gedrückt geht es zurück. In Kombination mit C-x <right> / C-x <left> für mehr-als-zwei-Buffer-Wechsel reicht das im Alltag oft schon aus.
Weiterführende Ressourcen
Externe Quellen
- GNU Emacs Manual — Select Buffer — offizielle Referenz zu
switch-to-buffer,C-x 4 b,C-x 5 b,next-buffer/previous-buffer. - GNU Emacs Manual — List Buffers — Details zum klassischen Buffer-Menü und den Status-Markern.
- GNU Emacs Manual — Kill Buffer —
kill-buffer,kill-some-buffers,kill-matching-buffersund Bestätigungs-Logik. - consult auf GitHub — Quelle und Dokumentation des modernen Completion-Werkzeugs rund um
consult-buffer.