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-bufferauf und springt an den absoluten Anfang des aktuellen Buffers. - M-> ruft
end-of-bufferauf 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
30wurde 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.
;; 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-charauf — 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-positionauf 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:
;; 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-markauf. - 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-<undM->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-markauf und springt zum letzten Mark im globalen Mark-Ring — auch in einem anderen Buffer. Die Größe steuertglobal-mark-ring-max(Default 16).
Welche Befehle den Mark automatisch setzen — und damit Rücksprünge ermöglichen?
beginning-of-bufferundend-of-buffer(also M-< und M->) legen die alte Position immer als Mark im Ring ab.goto-lineundgoto-chartun dasselbe.isearchsetzt 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-bufferundend-of-bufferdie 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. Die100wird 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-SPCist die spezielle Form, die zum letzten Mark im Ring springt.C-1 C-SPCist ein „echtes" numerisches Präfix1und setzt einen neuen Mark (mit dokumentierter, aber selten genutzter Variante intransient-mark-mode).
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 NHinweis: 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
- M-> — ans Buffer-Ende springen, Inhalt überfliegen.
- 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":
- C-x C-f foo.py RET — Datei öffnen.
- 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:
- An Stelle A: C-SPC drücken, dann zu B navigieren.
- C-x C-x — du bist an A. Erneut C-x C-x — du bist an B.
- 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:
- C-x C-SPC — Emacs nutzt den globalen Mark-Ring, wechselt den Buffer und landet an der ursprünglichen Stelle.
- 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:
- C-u C-SPC — zur letzten Position.
- C-u C-SPC — eine weiter zurück.
- 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
- GNU Emacs Manual — Moving Point — vollständige Referenz der Point-Bewegungsbefehle inklusive
M-<,M->,M-g gundM-g c. - GNU Emacs Manual — Mark Ring — Details zum lokalen Mark-Ring, zur Variable
mark-ring-maxund zumC-u C-SPC-Verhalten. - GNU Emacs Manual — Global Mark Ring — globaler Mark-Ring,
pop-global-markundglobal-mark-ring-max.