Die Modeline ist die schmale Statuszeile am unteren Rand jedes Buffers — und sie ist eines der mächtigsten Anzeige-Werkzeuge, die ein Editor überhaupt mitbringen kann. Wer sie lesen kann, hat die wichtigsten Buffer-Eigenschaften ständig im Blick: Encoding, Zeilenende-Konvention, ungesicherte Änderungen, Read-Only-Status, Position, aktiven Major-Mode und jede einzelne aktive Minor-Mode. Andere Editoren verstecken diese Information in Menüs oder Statuspanels — Emacs schreibt sie kompakt in eine einzige Zeile, direkt dort, wo der Cursor blinkt. Dieser Artikel zerlegt die Default-Modeline Zeichen für Zeichen, zeigt, wie sie sich an Modus, Encoding und Status anpasst, und stellt am Ende die drei populärsten Drop-In-Alternativen vor.
Anatomie der Default-Modeline
Eine typische Emacs-Modeline für eine Elisp-Datei sieht so aus:
-UUU:----F1 hello.el All L42 (Emacs-Lisp Eldoc Flymake) ----
│ │ │ │ │ │ │
│ │ │ │ │ │ └─ 6 — Major-Mode + Minor-Modes in Klammern
│ │ │ │ │ └─────── 5 — Position im Buffer (Zeile, optional Spalte)
│ │ │ │ └─────────── 4 — Sichtbarer Anteil (All / Top / Bot / 42%)
│ │ │ └─────────────────────── 3 — Buffer-Name (oft, aber nicht zwingend Dateiname)
│ │ └─────────────────────────────── 2b — Frame-Indikator (nur Terminal)
│ └─────────────────────────────────── 2a — Modified-Indikator (---- / **** / %%%% / %*%*)
└───────────────────────────────────────── 1 — Read-Only + Encoding + EOL (das "-UUU:"-Rätsel)Diese sechs Felder sind die Grundpfeiler. Sie erscheinen in dieser Reihenfolge in jeder Vanilla-Modeline, egal welcher Modus aktiv ist und welche Datei du gerade öffnest. Was sich ändert, ist der konkrete Inhalt pro Feld: das Encoding-Kürzel wechselt mit dem Dateiformat, der Modified-Indikator springt zwischen „unverändert" und „geändert", der Buffer-Name folgt der Datei, die Position wandert mit dem Cursor, und die Klammern füllen sich je nach Modus mit anderen Einträgen.
Die folgenden Sektionen gehen jedes Feld einzeln durch — von links nach rechts, mit allen Werten, die du in der Praxis sehen kannst.
Encoding und EOL: das -UUU:----F1-Rätsel
Der linke Block der Modeline sieht auf den ersten Blick wie zufälliges Geklacker aus, ist aber streng schematisch aufgebaut. Jedes Zeichen hat eine feste Position und eine feste Bedeutung. Die typische Form ist:
- U U U : - - - - F1
│ │ │ │ │ │ │ │ │ │
│ │ │ │ │ └─┴─┴─┴── Modified-Block (4 Zeichen, hier "----" = unverändert)
│ │ │ │ └────────── EOL-Konvention (: = unix, \ = dos, / = mac)
│ │ │ └──────────── Datei-Encoding (U = UTF-8)
│ │ └────────────── Ausgabe-Encoding (Terminal-Output)
│ └──────────────── Eingabe-Encoding (Tastatur-Eingabe)
└────────────────── Read-Only-Status (- = beschreibbar, % = read-only, @ = remote)
Rechts: F1 = Frame-IndikatorPosition 1 — Read-Only und Remote
Das allererste Zeichen sagt dir, ob der Buffer überhaupt beschreibbar ist und ob er auf einer entfernten Maschine liegt:
| Zeichen | Bedeutung |
|---|---|
- | normaler, beschreibbarer lokaler Buffer |
% | Buffer ist read-only (Toggle mit C-x C-q) |
@ | Buffer hängt an einer entfernten Datei (TRAMP, SSH, Docker, …) |
Positionen 2–4 — Drei Encoding-Felder
Die nächsten drei Zeichen kodieren das Encoding für drei verschiedene Kanäle des Buffers: Tastatur-Eingabe, Terminal-Ausgabe und Datei-Encoding. In der Praxis stimmen alle drei meist überein — daher die häufige Schreibweise UUU für „überall UTF-8". Die wichtigsten Buchstaben:
| Zeichen | Bedeutung |
|---|---|
U | UTF-8 |
1 | ISO-Latin-1 (ISO-8859-1) |
= | keine Konvertierung — bytegenau |
- | Standard (undecided / kein spezielles Encoding bestimmt) |
J | Japanisch (ISO-2022-JP) |
S | Shift-JIS |
C | Chinesisch (Big5) |
Die Reihenfolge dieser drei Zeichen ist immer dieselbe: Eingabe — Ausgabe — Datei. Eine Modeline mit U1U würde z. B. heißen: Tastatur liefert UTF-8, Terminal stellt in Latin-1 dar, die Datei wird als UTF-8 geschrieben — ein seltener, aber legitimer Mischfall.
Position 5 — EOL-Konvention
Das Zeichen direkt nach dem Encoding-Block ist der Trenner und gleichzeitig der Indikator für die Zeilenende-Konvention der Datei. Hier verstecken sich die berüchtigten CRLF-vs-LF-Probleme:
| Zeichen | EOL-Konvention | Bytes | Typisches System |
|---|---|---|---|
: | Unix | LF | macOS, Linux, BSD |
\ | DOS | CRLF | Windows-Editoren |
/ | Mac (classic) | CR | Mac OS 9 und älter |
Eine Modeline mit -UUU\---- zeigt also eine UTF-8-Datei mit Windows-Zeilenenden — das passiert oft, wenn jemand eine Datei in Notepad bearbeitet und an dich weitergibt. Mit M-x set-buffer-file-coding-system <code>RET utf-8-unix RET</code> lässt sich die Konvention konvertieren.
Positionen 6–9 — Modified-Block
Die vier Bindestriche (oder Sternchen, oder Prozentzeichen) direkt danach sind der Modified-Indikator. Er signalisiert, ob der Buffer seit dem letzten Speichern verändert wurde:
| Block | Bedeutung |
|---|---|
---- | Buffer ist unverändert — Inhalt entspricht der Datei am Datenträger |
**** | Buffer enthält ungesicherte Änderungen |
%%%% | Buffer ist read-only und unverändert |
%*%* | Buffer ist read-only und trotzdem verändert (z. B. nach C-x C-q) |
Faustregel: Sternchen heißt „ungespeichert", Prozentzeichen heißt „read-only". Die Mischform %*%* entsteht, wenn du einen schreibbaren Buffer veränderst und anschließend per C-x C-q auf read-only umstellst.
Position 10 — Frame-Indikator (selten relevant)
Das F1 am Ende des linken Blocks erscheint nur in Terminal-Frames und nummeriert das gerade sichtbare Frame durch (F1, F2, …). In GUI-Emacs fehlt dieser Indikator komplett, weil jedes Frame ein eigenes Fenster auf Betriebssystem-Ebene ist und über die Fensterleiste unterscheidbar bleibt.
Buffer-Name und Position
Nach dem linken Block folgt der Buffer-Name — der Name, unter dem der Buffer im Switcher (C-x b) und in der Buffer-Liste (C-x C-b) auftaucht. Wichtig zu wissen:
- Bei dateigebundenen Buffern ist der Name meist der Dateiname (
hello.el). Bei mehreren gleichnamigen Dateien hängt Emacs einen Suffix an (hello.el<2>oder mituniquify-buffer-name-styleeinen Pfad-Teil). - Bei Spezial-Buffern stehen Sternchen drumherum (
*scratch*,*Messages*,*Help*). - Der Buffer-Name kann sich vom Dateinamen unterscheiden — z. B. nach
M-x rename-buffer.
Direkt nach dem Buffer-Namen folgen die beiden Positions-Felder.
Sichtbarer Anteil
Das erste Positions-Feld zeigt, welcher Ausschnitt des Buffers gerade sichtbar ist:
| Wert | Bedeutung |
|---|---|
All | der ganze Buffer passt ins Fenster |
Top | du siehst den Anfang, weiter unten gibt es mehr |
Bot | du siehst das Ende, der Anfang liegt oberhalb |
42% | der sichtbare Bereich beginnt bei ca. 42 % des Buffer-Inhalts |
Bei sehr kleinen Buffern ist das immer All, bei langen Logfiles wandert der Prozentwert beim Scrollen mit.
Zeile und (optional) Spalte
Das zweite Positions-Feld zeigt die aktuelle Cursor-Position:
L42— Zeile 42. Erscheint, wennline-number-modeaktiv ist (Default an).C12— Spalte 12, nullbasiert. Erscheint nur, wenncolumn-number-modeaktiv ist (Default aus).(42,12)— kombinierte Anzeige bei aktiven beiden Modes; das exakte Format hängt von der Emacs-Version ab.
Spaltennummerierung schaltest du dauerhaft mit folgendem Snippet in deiner Konfiguration ein:
;; Zeilennummer ist Default-an, Spaltennummer Default-aus
(column-number-mode 1)
;; Optional: Dateigröße in der Modeline (z. B. "1.2k")
(size-indication-mode 1)Mit size-indication-mode taucht zusätzlich die Buffer-Größe auf, was bei großen Logs nützlich ist.
Major-Mode in Klammern
Hinter dem Positions-Block beginnt der Modus-Bereich in runden Klammern. Der erste Eintrag ist immer der Major-Mode des Buffers — die zentrale Verhaltens-Schicht, die Sprache, Syntax-Highlighting, Einrückung, Tastenkürzel und vieles mehr bestimmt.
| Modeline-Eintrag | Major-Mode-Funktion | Typische Dateien |
|---|---|---|
Emacs-Lisp | emacs-lisp-mode | .el |
Lisp Interaction | lisp-interaction-mode | *scratch* |
Python | python-mode | .py |
Python-ts | python-ts-mode | .py mit tree-sitter |
Org | org-mode | .org |
Markdown | markdown-mode | .md, .markdown |
Text | text-mode | .txt |
Fundamental | fundamental-mode | beliebig (Fallback) |
Pro Buffer ist genau ein Major-Mode aktiv — er beschreibt, „was für ein Dokument" der Buffer ist. Wechseln geht entweder automatisch über den Dateinamen (auto-mode-alist) oder manuell per M-x gefolgt vom Mode-Namen, z. B. M-x markdown-mode RET.
Eine wichtige Beobachtung: Moderne Emacs-Versionen ab 29 liefern für viele Sprachen tree-sitter-Varianten mit. Diese tragen das Suffix -ts-mode im Funktionsnamen und zeigen sich in der Modeline mit Suffix -ts (z. B. Python-ts statt Python). Wenn du also irritiert bist, warum der Mode anders heißt als im Tutorial — das ist die tree-sitter-Variante mit deutlich besserem Syntax-Parser.
Minor-Modes — der bunte Strauß
Alle weiteren Einträge in den Modus-Klammern sind Minor-Modes — zusätzliche, übereinander stapelbare Verhaltens-Schichten. Anders als beim Major-Mode können beliebig viele Minor-Modes gleichzeitig aktiv sein. Eine typische Klammerzeile in einem konfigurierten Emacs könnte so aussehen:
(Python-ts Eldoc Flymake[!2 *3] Yas Company Paredit ElDoc)
└─────┬─┘ └──┬─┘ └──────┬────┘ └┬┘ └──┬──┘ └──┬──┘
│ │ │ │ │ │
Major-Mode │ Linter-Status Snippets Structural
│ (2 Errors, Editing
Inline-Doku 3 Warnings)Manche Minor-Modes zeigen sich nur mit ihrem Namen (Eldoc, Yas, Company), andere bringen eigene Mini-Indikatoren mit, die direkt in der Modeline aktualisiert werden:
| Indikator | Bedeutung |
|---|---|
Flymake[!2 *3] | Flymake hat 2 Fehler und 3 Warnungen im Buffer gefunden |
VC-Git:main | vc-mode zeigt den Git-Branch des aktuellen Buffers |
Wrap | visual-line-mode ist aktiv, lange Zeilen werden umgebrochen |
Narrow | Buffer ist gerade auf einen Teilbereich eingeengt (narrow-to-region) |
Ovwrt | overwrite-mode — Tippen überschreibt statt einzufügen |
Welche Modes überhaupt aktiv sind, beantwortet dir C-h m (describe-mode): Der Befehl listet den Major-Mode und alle aktiven Minor-Modes mit kurzer Beschreibung und Tastenbelegung. Das ist das wichtigste Werkzeug, um zu verstehen, warum sich ein Buffer „komisch" verhält.
Das vollständige Konzept von Major- und Minor-Modes — inklusive Hooks, Auto-Mode-Listen und eigener Modi — gehört in das Kapitel Modes & Hooks. Für die Modeline reicht es, dass du jeden Eintrag in den Klammern als eigene Verhaltens-Schicht erkennst.
Die Modeline customisieren
Die Modeline ist nicht in Stein gemeißelt — sie ist eine gewöhnliche Elisp-Variable, die Emacs beim Zeichnen ausliest. Die zentrale Variable heißt mode-line-format und enthält eine Liste, deren Einträge der Reihe nach gerendert werden. Komplette Umgestaltung ist möglich, aber für den Einstieg reichen meistens drei bis vier Minor-Modes, die zusätzliche Informationen einblenden:
;; Zeilennummer ist Default an, Spaltennummer Default aus
(column-number-mode 1)
;; Dateigröße rechts in der Modeline (z. B. "1.2k", "42M")
(size-indication-mode 1)
;; Uhrzeit und Systemlast einblenden
(setq display-time-24hr-format t)
(setq display-time-default-load-average nil)
(display-time-mode 1)
;; Batterie-Status (Laptop)
(require 'battery)
(when (and battery-status-function
(not (string-match-p "N/A"
(battery-format "%B"
(funcall battery-status-function)))))
(display-battery-mode 1))Wer tiefer einsteigen will, schreibt eine eigene mode-line-format-Liste — das geht weit über diesen Einstiegs-Artikel hinaus und ist Thema des Kapitels Modeline anpassen. Für den Anfang gilt: Lieber drei nützliche Mini-Indikatoren aktivieren, als die ganze Zeile von Hand neu zu bauen.
Die wichtigsten Helfer-Variablen, die du in der Doku immer wieder triffst:
| Variable | Inhalt |
|---|---|
mode-line-format | die komplette Format-Liste der Modeline |
mode-line-modified | das ---- / **** / %%%%-Feld |
mode-line-position | das Positions-Feld (All L42, Top, …) |
mode-line-modes | der Modus-Block in Klammern |
mode-line-misc-info | Sammelfeld für Zeit, Batterie, Mail-Status u. ä. |
Drop-In-Alternativen: doom-modeline, mood-line, nano-modeline
Die Default-Modeline ist informativ, sieht aber sehr nach 1990 aus. Drei Pakete haben sich als Drop-In-Alternativen etabliert — installieren, eine Zeile in die Konfiguration, fertig:
| Paket | Optik | Stärken | Kompromisse |
|---|---|---|---|
doom-modeline | dunkel, „IDE-haft", mit Icons | viele Segmente, perfekte Integration mit nerd-icons | benötigt nerd-icons + passende Font, etwas schwerer |
mood-line | minimal, sehr leise Farben | extrem leicht, keine Icons nötig, schneller Render | wenig Konfigurations-Optionen |
nano-modeline | flach, in der Tradition des Nano-Setups | passt perfekt zum gesamten Nano-Theme-Ökosystem | Stil ist Geschmackssache, weniger Indikatoren |
Beispiel-Konfiguration für doom-modeline (mit use-package):
;; nerd-icons einmalig installieren und Schriftart laden:
;; M-x nerd-icons-install-fonts RET
(use-package nerd-icons
:ensure t)
(use-package doom-modeline
:ensure t
:hook (after-init . doom-modeline-mode)
:custom
(doom-modeline-height 28)
(doom-modeline-bar-width 4)
(doom-modeline-icon t)
(doom-modeline-major-mode-icon t)
(doom-modeline-buffer-encoding nil)) ; redundant, da Default-Encoding meist UTF-8Empfehlung für Einsteiger: erst eine Weile mit der Default-Modeline leben, sie wirklich lesen lernen. Sobald du jedes Feld auf Anhieb erkennst, ist der Wechsel auf eine alternative Modeline eine bewusste Entscheidung — und du verstehst auch, welche Information dir die schickere Variante eventuell wegnimmt. Genau diese Frage greift das Kapitel Modeline anpassen später vertieft auf.
FAQ
Was bedeutet das Sternchen in "**" vor dem Buffer-Namen?
Die vier Sternchen im Modified-Block (****) bedeuten: Der Buffer wurde seit dem letzten Speichern verändert und enthält ungesicherte Änderungen. Speichern mit C-x C-s setzt den Block zurück auf ----. Die Anzeige wechselt in Echtzeit — sobald du auch nur ein Zeichen tippst, springt der Indikator um.
Warum sehe ich "%*%*" statt "****"?
Der Buffer ist sowohl read-only als auch verändert. Read-Only-Status togglst du mit C-x C-q (read-only-mode). Wenn du einen veränderten Buffer auf read-only schaltest, mischt Emacs beide Indikatoren: % (read-only) und * (modified) abwechselnd. Speichern oder zurückschalten auf schreibbar löst den Zustand auf.
Warum zeigt die Modeline keine Zeilennummer?
Standardmäßig ist line-number-mode an, column-number-mode aber aus. Aktivieren über M-x column-number-mode RET oder dauerhaft per (column-number-mode 1) in der init.el. Auf sehr großen Buffern (Default-Schwelle 1 MB, line-number-display-limit) schaltet Emacs die Zeilen-Anzeige automatisch aus, um die Performance nicht zu drücken.
Was ist der Unterschied zwischen "UTF-8-unix" und "UTF-8-dos"?
Das Suffix beschreibt die Zeilenende-Konvention, nicht das Encoding: unix = LF (\n), dos = CRLF (\r\n), mac = CR (\r, nur historisch). In der Modeline siehst du das am Trennzeichen vor dem Modified-Block: : für unix, \ für dos, / für mac. Konvertieren geht mit M-x set-buffer-file-coding-system RET utf-8-unix RET und anschließendem Speichern.
Warum unterscheidet sich die Modeline zwischen meinen Fenstern?
Emacs hebt die Modeline des aktiven Fensters (selected window) anders hervor als die der inaktiven — meist heller bzw. mit kräftigerer Farbe. Das ist Absicht: So erkennst du auf einen Blick, in welchem Fenster der Cursor steckt. Der Inhalt der Modeline ist pro Buffer identisch — wenn derselbe Buffer in zwei Fenstern angezeigt wird, steht in beiden Modelines exakt dasselbe.
Wo bekomme ich Icons in die Modeline?
Vanilla-Emacs zeigt keine Icons in der Modeline. Wer Icons will, installiert nerd-icons (modern, empfohlen) oder all-the-icons (älter, aber sehr verbreitet), läuft einmalig M-x nerd-icons-install-fonts RET und kombiniert das mit doom-modeline. Mit einer entsprechenden Font (z. B. JetBrainsMono Nerd Font) erscheinen pro Mode passende Glyphen.
Wie sehe ich, welche Minor-Modes überhaupt aktiv sind?
Der eingebaute Befehl C-h m (describe-mode) öffnet einen *Help*-Buffer mit dem Major-Mode und einer kompletten Liste aller aktiven Minor-Modes, inklusive deren Beschreibungen und Tastenkürzel. Das ist das verlässlichste Werkzeug, um zu verstehen, warum sich ein Buffer anders verhält als erwartet — und gleichzeitig die schnellste Doku-Quelle für jeden Mode.
Weiterführende Ressourcen
Externe Quellen
- GNU Emacs Manual — Mode Line — die offizielle, zeichengenaue Beschreibung jedes Modeline-Felds.
- GNU Elisp Manual — Mode Line Format — die Elisp-Referenz zu
mode-line-formatund allen zugehörigen Variablen. - seagle0128/doom-modeline — Repository der populärsten alternativen Modeline.
- jessiehildebrandt/mood-line — minimaler, schneller Drop-In-Ersatz.
- rougier/nano-modeline — Modeline aus dem Nano-Theme-Ökosystem.