Nicht jede Bewegung in Emacs ist ein Sprung um ein Zeichen. Über große Distanzen — von Datei-Anfang zu Datei-Ende, zu einer konkreten Zeile, zurück zum letzten Edit — bietet Emacs eigene, präzise Werkzeuge. Buffer-Sprünge, goto-line, exchange-point-and-mark und der Mark-Ring als Rücksprung-History bilden zusammen ein kleines Geflecht, das einmal verstanden den halben Editor verändert. Dieser Artikel sammelt die wichtigsten Distanz-Sprünge und zeigt, wie sie zusammenspielen.

Buffer-Anfang und Buffer-Ende

Die zwei wichtigsten Distanz-Sprünge in Emacs führen an die beiden Ränder des Buffers. Sie sind so grundlegend, dass sie auf den vermutlich knappsten Tastenkombinationen liegen, die Emacs überhaupt vergibt — ein einzelner Meta-Chord mit einer Klammer-Taste:

  • M-< ruft beginning-of-buffer auf und springt an den absoluten Anfang des aktuellen Buffers.
  • M-> ruft end-of-buffer auf und springt an das absolute Ende.
  • M-x beginning-of-buffer RET bzw. M-x end-of-buffer RET tun dasselbe und sind die Notbremse, wenn die Tastenkombi auf deiner Plattform belegt ist.

Die Mnemonik ist so gerade noch direkt: < zeigt visuell „nach links" und damit zum Anfang, > zeigt „nach rechts" und damit zum Ende. Wer einmal M-< und M-> in den Fingern hat, gibt sie nie wieder her — das Springen an die Ränder einer Datei wird zur unbewussten Geste.

Beide Sprünge haben eine Eigenschaft, die im Alltag enorm spart: sie setzen automatisch den Mark an der Ausgangs-Position. Das heißt: Nach einem M-> ans Buffer-Ende kannst du mit C-u C-SPC mit einer einzigen Geste wieder zurück an die Stelle, an der du vorher gearbeitet hast. Mehr zum Mark-Ring in Sektion 05.

DE-Tastatur-Stolperfalle

Auf deutschen Tastaturen liegt < links unten neben dem Y und ist ohne AltGr direkt erreichbar. > ist Shift+< — ebenfalls ohne AltGr. Beide Tasten sind also komfortabel verfügbar, anders als z. B. { oder |, die AltGr brauchen und mit Meta kollidieren. M-< und M-> gehören zu den wenigen Emacs-Default-Bindings, die auf DE-Layout ohne jeden Umweg funktionieren.

Zu einer konkreten Zeile springen

Wer aus einem Stack-Trace oder einer Compiler-Meldung eine konkrete Zeilennummer kennt, will direkt dorthin — kein Scrollen, kein Suchen. goto-line ist der dafür gebaute Befehl.

  • M-g g öffnet einen Minibuffer-Prompt nach der Ziel-Zeilennummer und springt nach RET dorthin.
  • M-g M-g ist auf denselben Befehl gebunden — du kannst die zweite Meta-Taste also gedrückt halten und sparst dir das Loslassen. Beide Bindings führen zu goto-line.
  • M-x goto-line RET ist der vollständige Befehlsname, falls die Tastenkombi nicht passt.

Mit numerischem Präfix ist sogar der Minibuffer-Umweg überflüssig:

  • M-3 0 M-g g springt direkt zu Zeile 30, ohne dass ein Prompt erscheint — die 30 wurde als Präfix-Argument an den Befehl übergeben.
  • C-u 1 0 0 M-g g macht dasselbe für Zeile 100 mit dem klassischen C-u-Präfix.

Praxis-Tipp: Viele Power-User legen goto-line zusätzlich auf eine direkter erreichbare Taste — z. B. C-c g oder die freie Funktionstaste. Die Default-Bindung bleibt nützlich, weil sie in jedem Vanilla-Emacs der Welt funktioniert.

elisp init.el — goto-line auf C-c g zusätzlich legen
;; goto-line als zusätzliche, kürzere Bindung
(global-set-key (kbd "C-c g") #'goto-line)

Wo dieses Snippet hingehört — siehe Artikel zur Konfiguration mit init.el und early-init.el.

Zur Zeichen-Position und „wo bin ich gerade?"

Manche Sprünge gehen nicht an eine Zeile, sondern an eine Zeichen-Position im Buffer — das interne Maß, das Emacs für alles benutzt. Das ist seltener im Alltag, aber gelegentlich aus Logs, Diffs oder Lisp-Debugging genau die richtige Granularität.

  • M-g c ruft goto-char auf — der Prompt fragt nach einer Zeichen-Position (1-basiert vom Buffer-Anfang).
  • M-x goto-char RET ist die explizite Variante.

Die Gegenrichtung — „wo stehe ich gerade?" — beantwortet ein Befehl, der gleich mehrere Antworten in einer Echo-Area-Zeile liefert:

  • C-x = ruft what-cursor-position auf und zeigt das aktuelle Zeichen, seinen Codepoint, die Position im Buffer und die Buffer-Größe. Mit Präfix (C-u C-x =) gibt es dieselbe Information ausführlicher in einem *Help*-Buffer.

Für den dauerhaften Überblick lassen sich Zeilen- und Spaltenanzeige permanent in der Modeline einblenden:

elisp init.el — Zeile und Spalte in der Modeline
;; Aktuelle Zeilennummer in der Modeline anzeigen
(setq line-number-mode t)

;; Aktuelle Spalte in der Modeline anzeigen
(setq column-number-mode t)

line-number-mode ist in modernen Emacs-Versionen ohnehin Default; column-number-mode muss explizit aktiviert werden, ist aber für jeden, der mit Zeilenlängen-Konventionen arbeitet (z. B. 80- oder 100-Spalten-Limit), praktisch Pflicht. Wo dieses Snippet hingehört — wieder siehe Artikel zur Konfiguration mit init.el und early-init.el.

C-x C-x: Point und Mark tauschen

exchange-point-and-mark ist einer der unterschätztesten Befehle in Emacs. Er tauscht die Position von Point und Mark — d. h. dein Cursor springt dorthin, wo der Mark gerade steht, und der Mark wandert an die ursprüngliche Cursor-Position.

  • C-x C-x ruft exchange-point-and-mark auf.
  • M-x exchange-point-and-mark RET ist die ausgeschriebene Variante.

Das klingt nach einer Detail-Operation, ist aber das schweizer Taschenmesser für vier sehr unterschiedliche Workflows:

  • Zurück zum Ausgangs-Punkt nach Region-Setup: Nach C-SPC und einer Navigation ans andere Ende einer Region springt C-x C-x zurück zum Anfang — Region bleibt erhalten.
  • Eine Region „spiegeln": Mehrmaliges C-x C-x toggelt zwischen den beiden Enden einer aktiven Region. Praktisch zum Prüfen oder Editieren an beiden Grenzen.
  • Rückweg nach großen Sprüngen: Da M-< und M-> automatisch den Mark setzen, ist C-x C-x die schnellste Geste zurück — schneller als C-u C-SPC, weil er keinen Ring-Eintrag pop-t, sondern direkt tauscht.
  • „Falsche Richtung" korrigieren: Wenn du eine Region nach unten markiert hast, aber merkst, du musst noch zwei Zeichen am Anfang mitnehmen, springt C-x C-x an den Anfang, du erweiterst dort, und ein weiteres C-x C-x bringt dich ans Ende zurück.

Wichtig: exchange-point-and-mark funktioniert auch bei inaktiver Region. Ist nur ein Mark gesetzt (z. B. durch einen früheren M->), springt Point trotzdem dorthin und tauscht den Platz — die Region wird dabei wieder aktiv, lässt sich aber sofort mit C-g deaktivieren.

Der Mark-Ring als Sprung-History

Das Detail, das aus den einzelnen Distanz-Sprüngen ein richtiges Navigations-System macht, ist der Mark-Ring. Emacs speichert pro Buffer eine History vorheriger Marks (Default-Größe 16 Einträge, Variable mark-ring-max) und legt bei vielen großen Sprüngen automatisch die Ausgangsposition dort ab. Die ausführliche Konzept-Erklärung steht im Artikel zu Point, Mark und Region; hier nur die praktischen Befehle für den Rücksprung:

  • C-u C-SPC springt zum letzten Mark im buffer-lokalen Mark-Ring. Mehrmals drücken cyclet rückwärts durch die History — du landest reihum an den letzten drei, vier besuchten Stellen.
  • C-x C-SPC ruft pop-global-mark auf und springt zum letzten Mark im globalen Mark-Ring — auch in einem anderen Buffer. Die Größe steuert global-mark-ring-max (Default 16).

Welche Befehle den Mark automatisch setzen — und damit Rücksprünge ermöglichen?

  • beginning-of-buffer und end-of-buffer (also M-< und M->) legen die alte Position immer als Mark im Ring ab.
  • goto-line und goto-char tun dasselbe.
  • isearch setzt nach erfolgreicher Suche den Start-Punkt als Mark.
  • imenu, xref-find-definitions (häufig M-.) und ähnliche „Springe-irgendwohin"-Befehle ebenso.

Die Konsequenz: Du kannst dich frei durch eine große Datei oder über mehrere Buffer hinweg bewegen, ohne die Ausgangsposition zu verlieren. Großsprung hin mit M-> oder M-g g, zurück mit C-u C-SPC — das ersetzt praktisch alles, was andere Editoren als „Position-History" bewerben.

Numerische Prefix-Sprünge

Mit einem Präfix-Argument vor einem Sprung-Befehl ändert sich dessen Verhalten — manchmal subtil, manchmal grundlegend. Drei der wichtigsten Varianten:

  • C-u 50 M-> springt nicht ans Buffer-Ende, sondern zu 50 % der Distanz vom Buffer-Anfang. Mit numerischem Präfix interpretieren beginning-of-buffer und end-of-buffer die Zahl als Prozent — C-u 50 M-< landet ebenfalls in der Mitte, weil die Distanz ja vom Anfang aus gemessen wird.
  • M-1 0 0 M-g g ist die Präfix-Variante von goto-line. Die 100 wird als Zeilennummer interpretiert; der Minibuffer-Prompt entfällt komplett.
  • C-u C-SPC versus C-1 C-SPC — beide nutzen ein Präfix, tun aber verschiedene Dinge. C-u C-SPC ist die spezielle Form, die zum letzten Mark im Ring springt. C-1 C-SPC ist ein „echtes" numerisches Präfix 1 und setzt einen neuen Mark (mit dokumentierter, aber selten genutzter Variante in transient-mark-mode).
text Übersicht: Präfix-Verhalten der Sprung-Befehle
Befehl              ohne Präfix          mit C-u N (N = Zahl)
──────────────────  ───────────────────  ─────────────────────────────
M-<                 Anfang des Buffers   Position bei N/10 vom Anfang
M->                 Ende des Buffers     Position bei N/10 vom Anfang
M-g g  (goto-line)  Minibuffer-Prompt    direkt zu Zeile N
M-g c  (goto-char)  Minibuffer-Prompt    direkt zu Zeichen-Position N

Hinweis: Die Prozent-Logik bei M-< und M-> arbeitet historisch mit Zehntel-Schritten (N/10), nicht mit echten Prozent — C-u 5 M-> springt also zur Hälfte, C-u 1 M-> zu 10 % vom Anfang, C-u 9 M-> zu 90 %. In den meisten aktuellen Emacs-Versionen ist die Skala auf Prozente (N/100) umgestellt; in der eigenen Installation lohnt sich ein kurzer Test mit C-u 50 M-> in einer langen Datei, um das tatsächliche Verhalten zu sehen.

Praktische Workflows

Die Befehle dieses Artikels entfalten ihre Stärke erst, wenn sie kombiniert werden. Fünf typische Situationen aus dem Editor-Alltag:

Lange Datei: nach unten schauen, zurück

  1. M-> — ans Buffer-Ende springen, Inhalt überfliegen.
  2. C-u C-SPC — zurück an die Ausgangs-Stelle. Der Mark wurde durch den Sprung automatisch gesetzt.

Alternativ tut es auch C-x C-x, solange du noch keinen neuen Mark gesetzt hast.

Zur Fehler-Zeile aus einem Stack-Trace

Eine Compiler- oder Test-Fehlermeldung nennt „Fehler in foo.py, Zeile 247":

  1. C-x C-f foo.py RET — Datei öffnen.
  2. M-g g 2 4 7 RET — direkt zur Zeile.

Oder noch kürzer: M-2 4 7 M-g g ohne Prompt.

Zwischen zwei Edit-Stellen pendeln

Du arbeitest abwechselnd an Stelle A und Stelle B, oft nur ein paar Zeilen voneinander entfernt:

  1. An Stelle A: C-SPC drücken, dann zu B navigieren.
  2. C-x C-x — du bist an A. Erneut C-x C-x — du bist an B.
  3. Beliebig oft toggeln, ohne dass die Region stört.

Buffer-übergreifend zur letzten Stelle

Nach einem xref-find-definitions-Sprung (oft M-.) bist du in einer anderen Datei. Zurück:

  1. C-x C-SPC — Emacs nutzt den globalen Mark-Ring, wechselt den Buffer und landet an der ursprünglichen Stelle.
  2. Mehrmals drücken cyclet durch die letzten Buffer-Sprünge.

„Wo war ich vor drei Sprüngen?"

Du hast in der Datei mehrere Stellen besucht und willst die letzten Positionen abklappern:

  1. C-u C-SPC — zur letzten Position.
  2. C-u C-SPC — eine weiter zurück.
  3. C-u C-SPC — und noch eine.

Der Ring cyclet — nach 16 Einträgen (oder dem in mark-ring-max gesetzten Wert) beginnt die Liste von vorn.

FAQ

Warum kann ich `M-<` und `M->` problemlos drücken, aber `M-{` nicht?

Auf DE-Tastaturen sind < und > ohne AltGr direkt erreichbar — < liegt links neben Y, > ist Shift+<. { und } dagegen brauchen AltGr (auf AltGr+7 bzw. AltGr+0), und AltGr ist intern oft als C-M- belegt. Damit kollidieren M-{ und M-} mit der Tastatur-internen Modifier-Auflösung und sind praktisch nicht direkt drückbar.

Wo lande ich nach `M->`, wenn ich danach wieder zur ursprünglichen Position will?

Genau dort, wo du vorher warst — denn M-> (und ebenso M-<, goto-line, goto-char) legt die alte Position automatisch im Mark-Ring ab. Ein C-u C-SPC oder ein C-x C-x bringt dich zurück. Das macht die großen Sprünge erst alltagstauglich: du verlierst deine Arbeitsstelle nie.

Was tut `M-g g` ohne Argument?

Es öffnet einen Minibuffer-Prompt nach der Ziel-Zeilennummer und springt nach RET dorthin. Mit Argument — M-3 0 M-g g oder C-u 30 M-g g — entfällt der Prompt komplett, und Emacs springt sofort zur angegebenen Zeile. Beides ist nützlich: der Prompt für „mal eben gucken", die Argument-Variante für Zeilennummern aus Fehlermeldungen.

Wann nutze ich `C-u C-SPC` vs. `C-x C-SPC`?

C-u C-SPC cyclet durch den buffer-lokalen Mark-Ring — du bewegst dich innerhalb der aktuellen Datei zurück. C-x C-SPC (pop-global-mark) springt zum letzten Eintrag im globalen Mark-Ring und wechselt dabei bei Bedarf auch den Buffer. Faustregel: innerhalb der Datei lokal, über Dateien hinweg global.

Kann ich Sprung-Punkte permanent speichern?

Ja — der Mark-Ring vergisst Einträge nach 16 Sprüngen und beim Emacs-Beenden. Für langlebige Marker sind die Emacs-Bookmarks da. C-x r m (bookmark-set) legt einen benannten Bookmark an, C-x r b springt dorthin. Details im Artikel zu Bookmarks im Kapitel Erweiterte Features.

Wie viele Marks merkt sich Emacs?

Pro Buffer 16 im lokalen Mark-Ring (Variable mark-ring-max). Global ebenfalls 16 im globalen Mark-Ring (global-mark-ring-max). Beide Werte lassen sich in der init.el hochsetzen — (setq mark-ring-max 32) z. B. verdoppelt die lokale History. Wer viel springt, profitiert davon spürbar.

`exchange-point-and-mark` ohne aktive Region — funktioniert das?

Ja. Auch bei inaktiver Region springt der Point zum letzten gesetzten Mark; die Region wird dabei reaktiviert. Wer das Highlighting nicht will, drückt direkt im Anschluss C-g — die Region deaktiviert sich, die neue Cursor-Position bleibt. Das ist die unbürokratischste Variante, einen Mark als „Sprung-Ziel" zu nutzen.

Warum liegt `goto-line` ausgerechnet auf `M-g g`?

M-g ist der Prefix-Key für „goto"-Befehle: M-g g für goto-line, M-g c für goto-char, M-g TAB für goto-column, M-g n / M-g p für next-error / previous-error. Die Doppel-Bindung M-g M-g existiert, damit du die Meta-Taste durchgehend gedrückt halten kannst — beide Wege führen zum selben Befehl.

Weiterführende Ressourcen

Externe Quellen

Verwandte Artikel

/ Weiter

Zurück zu Navigation

Zur Übersicht