Scrolling in Emacs ist konzeptionell von Navigations-Befehlen wie C-n getrennt: Cursor-Bewegung verschiebt den Point im Buffer und passt den Viewport bei Bedarf an, Scrolling-Befehle verschieben den sichtbaren Ausschnitt und ziehen den Cursor mit, sobald er sonst außerhalb läge. Wer beide Achsen kennt — Point hier, Viewport dort — navigiert deutlich präziser, springt gezielter durch lange Buffer und stellt Code mit zwei Tastendrücken so im Fenster ein, dass das Auge sofort den richtigen Kontext sieht.
Seitenweise mit C-v und M-v
Der häufigste Scrolling-Bedarf ist „eine Bildschirmseite weiter" — und genau dafür gibt es das klassische Paar:
- Eine Seite vorwärts — C-v ruft
scroll-up-commandauf. - Eine Seite rückwärts — M-v ruft
scroll-down-commandauf.
Beide Befehle sind auch über M-x scroll-up-command bzw. M-x scroll-down-command erreichbar, und ebenso über die PgDn- und PgUp-Tasten — die Buchstaben-Variante bleibt aber idiomatisch, weil die Hand am Heim-Block bleibt.
Die seltsame Mnemonik
Der irritierende Punkt für Einsteiger: C-v heißt intern scroll-up-command, scrollt aber den Inhalt nach oben — der Viewport sieht also weiter unten im Buffer. Das ist konsistent, wenn man „up" auf den Buffer-Inhalt bezieht (er wandert auf dem Bildschirm nach oben), aber unintuitiv, wenn man „up" auf den Viewport bezieht. Die Eselsbrücke, die meist hilft: v zeigt nach unten, also „sieh weiter unten nach".
Überlappung zwischen den Seiten
Damit man beim Seiten-Scrollen nicht den Anschluss verliert, behält Emacs zwischen aufeinanderfolgenden Seiten standardmäßig zwei Zeilen Überlappung. Das steuert die Variable next-screen-context-lines (Default: 2). Wer mehr Kontext will, erhöht den Wert:
;; 5 Zeilen statt der Default-2 zwischen Seiten erhalten
(setq next-screen-context-lines 5)Mit numerischem Prefix-Argument wird daraus eine zeilengenaue Variante: C-u 10 C-v scrollt genau 10 Zeilen nach unten statt eine ganze Seite. Wo dieser Konfig-Schnipsel hingehört, beschreibt das Konfigurations-Kapitel.
C-l: Cursor-Position im Viewport steuern
Der unterschätzte Held der Scrolling-Familie ist C-l — recenter-top-bottom. Er bewegt nicht den Point, sondern verschiebt den Viewport so, dass der Cursor an einer bestimmten Stelle des Fensters landet. Beim wiederholten Drücken durchläuft Emacs einen Drei-Stufen-Zyklus:
- Erstes Drücken — Cursor-Zeile wandert in die Mitte des Fensters.
- Zweites Drücken — Cursor-Zeile wandert an den oberen Rand.
- Drittes Drücken — Cursor-Zeile wandert an den unteren Rand.
- Viertes Drücken — zurück zur Mitte, der Zyklus beginnt von vorn.
- Re-Center / Cycle — C-l ruft
recenter-top-bottomauf.
Praktisch ist das vor allem nach einem Sprung mit M-g g oder nach C-s: man landet irgendwo am unteren Rand des Fensters, drückt C-l und hat sofort wieder die Hälfte des Buffers ober- und unterhalb sichtbar.
Mit Prefix-Argument: exakte Zeile
Wer eine konkrete Zeile im Viewport ansteuern will, kombiniert C-l mit einem Prefix-Argument:
| Tastenfolge | Wirkung |
|---|---|
| C-u 0 C-l | Cursor an die oberste Zeile des Fensters |
| C-u 5 C-l | Cursor auf Zeile 5 von oben |
| C-u -1 C-l | Cursor auf die letzte Zeile (von unten gezählt) |
| C-u C-l | Cursor genau in die Bildschirm-Mitte (ohne Cycle-Status) |
Die negative Variante ist besonders praktisch: C-u -3 C-l rückt die aktuelle Zeile drei Zeilen über den unteren Fensterrand — gut, wenn unten gleich weitere Ausgabe entstehen soll und man jetzt schon Platz dafür will.
Weitere Scrolling-Befehle
Neben dem Seiten-Paar gibt es eine Reihe weiterer Scrolling-Befehle für Spezialfälle. Die wichtigsten:
| Befehl | Tastenkombi | Wirkung |
|---|---|---|
scroll-up-line | M-x scroll-up-line | eine Zeile nach unten scrollen (zeilengenau) |
scroll-down-line | M-x scroll-down-line | eine Zeile nach oben scrollen |
scroll-other-window | C-M-v | das andere Window seitenweise vorwärts scrollen |
scroll-other-window-down | C-M-S-v | das andere Window seitenweise rückwärts scrollen |
scroll-left | C-x < | horizontal nach links scrollen |
scroll-right | C-x > | horizontal nach rechts scrollen |
scroll-other-window ist der heimliche Star in Split-Window-Workflows: Du liest in Fenster A eine Doku und willst gleichzeitig in Fenster B durch Code scrollen, ohne das Fenster zu wechseln. C-M-v erledigt das genau, der Cursor bleibt in Fenster A. Mehr zum Window-Konzept im späteren Kapitel zu Windows und Buffern.
Horizontales Scrolling braucht man im Alltag selten. In den meisten Fällen ist es sinnvoller, lange Zeilen visuell umzubrechen oder am Fensterrand abzuschneiden — beides regelt der Buffer-lokale Schalter truncate-lines, der zwischen „Wrap" und „abschneiden" toggelt (interaktiv über M-x toggle-truncate-lines). Erst wenn truncate-lines aktiv ist und Zeilen wirklich aus dem Fenster ragen, wird C-x < / C-x > interessant.
pixel-scroll-precision-mode ab Emacs 29
Eine der besten Quality-of-Life-Verbesserungen der letzten Emacs-Jahre ist pixel-scroll-precision-mode — eingeführt in Emacs 29. Klassisches Emacs-Maus-Scrolling springt zeilenweise: jedes Trackpad-Wisch-Ereignis bewegt den Viewport um eine ganze Textzeile, was auf modernen High-DPI-Displays sichtbar ruckelt. Der neue Modus verarbeitet stattdessen die Pixel-Deltas, die das Betriebssystem liefert, und bewegt den Viewport entsprechend feinkörnig — wie es Browser, Terminals und native macOS-Apps seit Jahren tun.
Aktivieren
;; Pixel-genaues Maus-/Trackpad-Scrolling (Emacs 29+, nur GUI)
(pixel-scroll-precision-mode 1)Empfohlene Feintuning-Parameter
Zwei Variablen lohnen sich für das Gefühl auf Trackpad und Magic Mouse:
(setq pixel-scroll-precision-large-scroll-height 35.0
pixel-scroll-precision-interpolation-factor 30)pixel-scroll-precision-large-scroll-heightschaltet bei sehr großen Sprüngen (z. B. C-v mit aktivem Modus) auf eine kurze Animation um.pixel-scroll-precision-interpolation-factorglättet die Bewegung interpoliert über mehrere Frames — höhere Werte = sanfter, aber träger.
Wo diese Snippets hingehören, erklärt das Konfigurations-Kapitel. Der Effekt ist auf macOS (Magic Mouse, MacBook-Trackpad) und auf Wayland-Linux am deutlichsten — beides Plattformen, deren Eingabe-Stack hochauflösende Scroll-Events liefert. Auf Terminal-Emacs hat der Modus keinen Effekt: dort gibt es keine Pixel-Events, nur Zeilen-Sprünge des Terminal-Emulators.
Auto-Scrolling: wenn der Cursor an den Rand kommt
Bewegt sich der Point durch reguläre Navigations-Befehle (C-n, C-s, M->, …) an den Rand des Fensters, scrollt Emacs automatisch nach, damit der Cursor sichtbar bleibt. Das Verhalten dieses Auto-Scrollings steuern drei Variablen, die für viele User zu den allerersten Customizations gehören.
Die drei wichtigsten Variablen
| Variable | Default | Wirkung |
|---|---|---|
scroll-margin | 0 | Mindest-Abstand des Cursors zum Viewport-Rand, bevor gescrollt wird |
scroll-conservatively | 0 | Bei Werten ≥ 101: zeilenweises Nachscrollen statt seitenweisem Sprung |
scroll-preserve-screen-position | nil | Behält bei C-v/M-v die Cursor-Position auf dem Schirm |
scroll-step | 0 | Älterer, gröberer Vorgänger von scroll-conservatively — heute überholt |
Der oft zitierte „Halb-Seiten-Sprung", wenn der Cursor unten ankommt, ist die Folge des Defaults: Emacs scrollt dann ein gutes Stück, damit der Cursor wieder mittig sitzt — was viele als ruckelig empfinden. Wer das vermeiden will, setzt scroll-conservatively auf einen Wert ≥ 101. Dann fügt Emacs einzeilig nach, sobald der Cursor den Rand erreicht.
Empfohlenes Mini-Setup
;; Cursor bleibt mindestens 4 Zeilen vom Viewport-Rand entfernt
(setq scroll-margin 4)
;; Zeilenweise nachscrollen statt halb-seitenweise springen
(setq scroll-conservatively 101)
;; Bei C-v / M-v Cursor-Position im Fenster behalten
(setq scroll-preserve-screen-position t)Wo dieser Code hingehört, beschreibt das Konfigurations-Kapitel. scroll-margin 4 ist Geschmackssache — manche bevorzugen 0, manche gehen bis 8. Höhere Werte sorgen dafür, dass beim Lesen immer ein paar Zeilen Kontext um die Cursor-Zeile sichtbar bleiben; sehr hohe Werte (z. B. (/ (window-height) 2)) erzeugen ein „immer mittig"-Verhalten, das beim Code-Reading angenehm sein kann.
Praktische Workflows
Die einzelnen Befehle entfalten ihren Wert in Kombinationen. Eine Sammlung von Mustern, die im Alltag immer wieder auftauchen:
- Aktuelle Position zentrieren — C-l. Klassisches Re-Center nach einem Sprung oder einer Suche.
- Aktuelle Zeile an den oberen Rand — C-l C-l. Zweimal drücken springt durch den Cycle bis zur Oben-Position. Alternative: C-u 0 C-l.
- 50 Zeilen nach unten ohne Scroll-Sprung — C-u 50 C-v. Numerisches Prefix macht aus dem Seiten-Scroll einen exakten Zeilen-Scroll.
- Anderes Window scrollen, ohne zu wechseln — C-M-v. Klassiker für Doku-links-/Code-rechts-Setups.
- Im Buffer sehen, was unter dem Cursor steht — C-u -5 C-l schiebt die Cursor-Zeile fünf Zeilen über den unteren Rand, alles darüber wird sichtbar.
- Smooth Maus-Scrolling aktivieren —
(pixel-scroll-precision-mode 1)in derinit.el. Ein einziger Aufruf, und das Trackpad-Verhalten ändert sich sofort. - Auto-Scroll beruhigen —
(setq scroll-conservatively 101)und(setq scroll-margin 4)in der Konfig.
Diese Kombinationen funktionieren ohne jedes externe Paket — alles ist Vanilla-Emacs. Wer sie verinnerlicht, navigiert in großen Buffern (Logdateien, lange Quelldateien, Org-Dokumente) mit drei bis vier Tastendrücken überall hin, wo er gerade sein will.
Maus-Scrolling und Touch-Geräte
Auch wer Emacs primär mit der Tastatur bedient, scrollt im Alltag mit Maus oder Trackpad — beim Lesen langer Buffer, in Doku-Modes, bei eshell-Output. Die Defaults dafür:
| Eingabe | Aktion |
|---|---|
| Mausrad nach oben/unten | mwheel-scroll — ohne Pixel-Modus zeilenweise |
| Shift + Mausrad | schnelleres Scrollen (mehrere Zeilen pro Tick) |
| Trackpad-Wisch (GUI) | mit pixel-scroll-precision-mode pixelgenau |
| Trackpad-Wisch (Terminal) | zeilenweise, kein Pixel-Modus verfügbar |
Das Klischee „Emacs scrollt ruckelig" stammt aus der Vor-Emacs-29-Zeit. Mit aktivem pixel-scroll-precision-mode fühlt sich Maus- und Trackpad-Scrolling auf macOS und auf Wayland-Linux so an wie in nativen Apps oder Browsern — sanft, ohne Sprünge, mit Schwung-Verhalten. Wer Emacs zum ersten Mal auf einem aktuellen MacBook ausprobiert, sollte den Modus von Anfang an aktivieren — der erste Eindruck ist sonst unnötig negativ.
Auf X11-Linux und Windows lohnt sich der Modus ebenfalls, der Effekt ist dort aber kleiner, weil die Eingabe-Pipeline weniger feinkörnige Events liefert. In Terminal-Emacs (emacs -nw) ist pixel-scroll-precision-mode wirkungslos: das Terminal selbst übersetzt Scroll-Events bereits in Zeilen-Sprünge, bevor sie Emacs erreichen.
Interessantes
Cursor-Bewegung und Viewport-Bewegung sind zwei Dinge
Scrolling-Befehle bewegen den Viewport, nicht den Point — der Cursor wird nur mitgezogen, wenn er sonst außerhalb läge. Umgekehrt verschieben Navigations-Befehle wie C-n den Point und ziehen den Viewport nur bei Bedarf nach. Wer beide Achsen separat denkt, navigiert deutlich präziser.
`C-l` ist der unterschätzte Held
recenter-top-bottom bietet drei Cursor-Positionen im Viewport mit einer einzigen Taste: Mitte, oben, unten — und im Cycle wiederholbar. Nach jedem Sprung mit M-g g, C-s oder imenu ist C-l der natürliche Folgegriff.
pixel-scroll-precision-mode hebt die Maus-Erfahrung auf modernes Niveau
Der Modus (Emacs 29+) macht den Unterschied zwischen „Emacs scrollt wie ein modernes Programm" und „Emacs scrollt wie in den 1990ern". Vor allem auf macOS-Trackpads und Wayland-Linux ein echter Sprung — auf Terminal-Emacs ohne Effekt.
`scroll-conservatively 101` ist die berühmte 1-Zeilen-Konfig
Diese eine Zeile ersetzt das gefürchtete „halb-seitige Springen" durch ruhiges, zeilenweises Nachscrollen. Praktisch jeder erfahrene Emacs-User hat sie früher oder später in seine init.el geschrieben — sie ist eines der ersten Customizations, die sich wirklich lohnen.
`scroll-margin 4` hält den Cursor aus dem Randbereich
Mit einem Wert ≥ 1 bleibt der Cursor immer mindestens N Zeilen vom Viewport-Rand entfernt — das Auge muss beim Lesen nicht ständig in den Ecken nachschauen. Viele finden Werte zwischen 4 und 8 ergonomisch.
Prefix-Argument macht `C-l` zur Zeilen-Pinpoint-Taste
C-u 0 C-l setzt die Cursor-Zeile an den oberen Rand, C-u 5 C-l auf Zeile 5 von oben, C-u -3 C-l drei Zeilen über den unteren Rand. Damit positionierst du den Kontext um den Cursor herum exakt so, wie du ihn lesen willst.
`C-M-v` scrollt das andere Window, ohne dass du wechseln musst
In Split-Setups (z. B. Doku links, Code rechts) bleibt der Cursor im aktiven Fenster, während scroll-other-window durch das Nachbar-Fenster blättert. Spart das ständige C-x o-Hin-und-Her.
`next-screen-context-lines` regelt die Überlappung beim Seiten-Scrollen
Default 2 reicht meist, aber bei dichtem Code lohnen sich 4 bis 5 — so verliert das Auge zwischen zwei Seiten nicht den Anschluss.
Weiterführende Ressourcen
Externe Quellen
- GNU Emacs Manual — Scrolling — offizielle Referenz zu
scroll-up-command,scroll-down-command,next-screen-context-lines,scroll-other-window. - GNU Emacs Manual — Recentering — Doku zu
recenter-top-bottom, dem Drei-Stufen-Cycle und den Prefix-Argument-Varianten. - GNU Emacs Manual — Auto Scrolling — vollständige Behandlung von
scroll-margin,scroll-conservatively,scroll-stepundscroll-preserve-screen-position. - GNU Emacs NEWS — Pixel Scrolling — Ankündigung von
pixel-scroll-precision-modein Emacs 29.