Die Buchstaben-Heim-Reihe von Emacs: f/b für „forward/backward", n/p für „next/previous", a/e für „anfang/ende" der Zeile. In Kombination mit den Modifiern Strg (C-) und Alt/Option (M-) deckt sie 90 % aller Navigations-Bedürfnisse ab — ohne die Hände vom Heim-Block zu nehmen. Wer diese sechs Buchstaben verinnerlicht hat, navigiert in Emacs flüssiger als in jedem GUI-Editor, in dem die Pfeiltasten und Cmd-Shortcuts den Workflow dominieren.

Zeichenweise bewegen

Die kleinste Bewegungs-Einheit ist ein einzelnes Zeichen. Vorwärts wie rückwärts ein Zeichen — das sind die beiden Brot-und-Butter-Befehle:

  • Vorwärts ein ZeichenC-f ruft forward-char auf.
  • Rückwärts ein ZeichenC-b ruft backward-char auf.

Beide Funktionen sind auch über M-x forward-char bzw. M-x backward-char erreichbar — relevant vor allem dann, wenn du sie aus eigenem Elisp-Code aufrufst.

Mit einem numerischen Prefix-Argument wird die Bewegung mehrfach ausgeführt: C-u 10 C-f springt zehn Zeichen vorwärts, C-u 3 C-b drei Zeichen rückwärts. Dazu mehr in Sektion 06.

Die Pfeiltasten left und right sind in Vanilla-Emacs an dieselben Funktionen gebunden und tun das Gleiche — sie sind aber unidiomatisch, weil die Hand dafür das Heim-Block verlässt. Wer Emacs ernsthaft nutzt, gewöhnt sich C-f/C-b von Anfang an an: jede einzelne Bewegung spart einen Bruchteil einer Sekunde, in Summe über einen Arbeitstag erheblich.

Wortweise bewegen

Eine Stufe gröber als das einzelne Zeichen ist das Wort. Hier wechselt der Modifier von Strg auf Meta — das ist Emacs' systematisches Muster: C- für die feinkörnige, M- für die gröbere Variante desselben Befehls.

  • Vorwärts ein WortM-f ruft forward-word auf.
  • Rückwärts ein WortM-b ruft backward-word auf.

Was als „Wort" gilt, hängt vom Major-Mode des aktuellen Buffers ab. Emacs definiert Wortgrenzen über eine sogenannte syntax-table — eine Tabelle, in der jedes Zeichen einen Syntax-Typ trägt (Wort-Zeichen, Trennzeichen, Klammer, String-Delimiter usw.). Pro Major-Mode wird diese Tabelle anders belegt:

  • In text-mode und org-mode sind nur Buchstaben und Ziffern Wort-Zeichen — Bindestrich - und Unterstrich _ zählen als Trennzeichen.
  • In den meisten Programmier-Modes (z. B. python-mode, js-mode) ist _ Wort-Zeichen, weil snake_case als ein einzelner Bezeichner gemeint ist.
  • In Lisp-Modes ist auch - Wort-Zeichen — my-cool-function ist ein Wort.

Der praktische Effekt: Dasselbe M-f springt in einem Markdown-Buffer Wort für Wort über einen kebab-case-bezeichner, im Python-Buffer dagegen über snake_case_variable in einem Rutsch.

CamelCase mit subword-mode

Für Sprachen mit CamelCase-Bezeichnern wie Java, TypeScript oder Swift gibt es einen Minor-Mode, der M-f/M-b an Großbuchstaben-Grenzen anhalten lässt:

elisp subword-mode global aktivieren
;; subword-mode für alle Programmier-Buffer einschalten
(add-hook 'prog-mode-hook #'subword-mode)

Mit aktivem subword-mode wird getElementById zu drei Wörtern (get, Element, ById), und MyClassName zu drei (My, Class, Name). Das gilt symmetrisch für vorwärts wie rückwärts und für alle Befehle, die forward-word/backward-word intern verwenden (etwa M-d zum Löschen eines Wortes). Wo dieser Snippet hingehört, erklärt der Artikel zur Konfiguration mit init.el und early-init.el.

Zeilenweise bewegen

Vertikale Bewegung folgt dem gleichen Muster, nur mit den Buchstaben n („next") und p („previous"):

  • Nächste ZeileC-n ruft next-line auf.
  • Vorige ZeileC-p ruft previous-line auf.

Auch hier funktionieren die Pfeiltasten up/down identisch — und auch hier gilt die Heim-Block-Regel: C-n/C-p ist auf Dauer schneller.

Wunsch-Spalte beibehalten

Emacs hat eine angenehme Eigenheit beim vertikalen Bewegen: Er merkt sich die Wunsch-Spalte, in der du dich befandest, als du die vertikale Bewegung begonnen hast. Springst du mit C-n durch eine kürzere Zeile hindurch, landet der Cursor dort am Zeilenende — aber sobald wieder eine ausreichend lange Zeile kommt, kehrt er zur ursprünglichen Spalte zurück.

Beispiel mit Cursor | in Spalte 12:

text Wunsch-Spalte-Verhalten
Die erste|Zeile ist lang genug.       ← Start, Spalte 12
Kurz.                                  ← C-n: Cursor ans Ende (Spalte 5)
Die dritte Z|eile fängt es wieder.    ← C-n: zurück zu Spalte 12

Verwandt dazu ist die Variable track-eol. Steht sie auf t, „klebt" der Cursor am Zeilenende: hast du ihn einmal mit C-e ans Ende einer Zeile gesetzt, bleibt er bei jedem folgenden C-n/C-p am jeweiligen Zeilenende — auch wenn die Zeilen unterschiedlich lang sind. Praktisch für „letztes Zeichen jeder Zeile bearbeiten"-Workflows:

elisp track-eol aktivieren
;; Cursor klebt am Zeilenende, sobald er einmal dort war
(setq track-eol t)

Visuelle vs. logische Zeilen

Standardmäßig bewegen sich C-n/C-p über visuelle Zeilen (line-move-visual = t) — bei umbrochenen langen Zeilen springst du also pro Tastendruck eine Bildschirm-Zeile, nicht eine logische Datei-Zeile. Wer das umgekehrte Verhalten will (etwa für Listen-Verarbeitung), setzt (setq line-move-visual nil) — dann zählt die logische Zeile.

Zeilenanfang und Zeilenende

Die ersten und letzten beiden Positionen einer Zeile erreicht man mit a („anfang") und e („ende"):

  • An den ZeilenanfangC-a ruft move-beginning-of-line auf.
  • Ans ZeilenendeC-e ruft move-end-of-line auf.

Die home- und end-Tasten sind ebenfalls daran gebunden und funktionieren identisch — auch hier ist die Buchstaben-Variante idiomatisch.

back-to-indentation: meist die bessere Wahl

In eingerücktem Code ist C-a selten das, was du wirklich willst: Du landest am Spaltennull-Zeichen, also vor der Einrückung. Viel öfter willst du zum ersten Inhalts-Zeichen einer Zeile — also hinter die Einrückung. Dafür gibt es back-to-indentation:

  • M-m ruft back-to-indentation auf.

Beispiel mit Cursor-Position |:

text C-a vs. M-m bei eingerücktem Code
|    if (user.isActive) {     ← C-a landet hier (Spalte 0)
    |if (user.isActive) {     ← M-m landet hier (erster Nicht-Whitespace)

Toggle zwischen C-a und M-m

Ein beliebter Komfort-Trick: C-a so umbauen, dass es bei wiederholtem Drücken zwischen Spalte 0 und Indentation toggelt — einmal C-a führt zum ersten Inhalts-Zeichen, ein zweites C-a direkt danach zur tatsächlichen Spalte 0. Das externe Paket crux bringt das fertig als crux-move-beginning-of-line. Eine eigene Variante ohne externes Paket:

elisp C-a smart machen
(defun mibeon/smart-beginning-of-line ()
  "Toggle zwischen Indentation und Spalte 0."
  (interactive)
  (let ((orig (point)))
    (back-to-indentation)
    (when (= orig (point))
      (move-beginning-of-line 1))))

(keymap-global-set "C-a" #'mibeon/smart-beginning-of-line)

Wo dieser Code hingehört, erklärt das Konfigurations-Kapitel.

macOS und die Cmd-Pfeil-Erwartung

Wer aus VS Code, TextEdit, Pages oder anderen macOS-Apps kommt, hat eine sehr bestimmte Erwartung an die Pfeiltasten in Kombination mit Modifiern:

KombinationErwartetes Verhalten (macOS-Standard)
Cmd+← / Cmd+→Zeilenanfang / Zeilenende
Cmd+↑ / Cmd+↓Buffer-Anfang / Buffer-Ende
Option+← / Option+→wortweise rückwärts / vorwärts
Option+↑ / Option+↓Absatz rückwärts / vorwärts

Vanilla-Emacs ignoriert Cmd standardmäßig. Die Cmd-Pfeil-Tasten machen also schlicht nichts — was beim Umstieg von macOS-Editoren extrem irritierend ist. Option ist je nach Konfiguration entweder als Meta belegt (siehe Meta-Taste konfigurieren) oder bleibt für deutsche Sonderzeichen frei — Option+f wird in Emacs zu M-f, also wortweise vorwärts, aber Option+← ist nicht automatisch belegt.

Mac-Konventionen nachbauen

Wer die macOS-Reflexe behalten will, baut die Bindings einfach nach. Vorausgesetzt, Cmd ist als Super belegt (mac-command-modifier 'super):

elisp init.el — macOS-Cmd-Pfeil-Bindings nachbauen
;; Nur auf macOS aktivieren, sonst stören die Bindings woanders nicht
(when (eq system-type 'darwin)
  ;; Cmd+Pfeil-Links/Rechts: Zeilenanfang / Zeilenende
  (keymap-global-set "s-<left>"  #'move-beginning-of-line)
  (keymap-global-set "s-<right>" #'move-end-of-line)

  ;; Cmd+Pfeil-Hoch/Runter: Buffer-Anfang / Buffer-Ende
  (keymap-global-set "s-<up>"    #'beginning-of-buffer)
  (keymap-global-set "s-<down>"  #'end-of-buffer)

  ;; Option+Pfeil-Links/Rechts: wortweise (Option = Meta hier nicht nutzbar,
  ;; daher direkt aufs Modifier-Symbol mappen)
  (keymap-global-set "M-<left>"  #'backward-word)
  (keymap-global-set "M-<right>" #'forward-word))

Wo dieser Code hingehört, beschreibt das Konfigurations-Kapitel. Hinweis: Damit s-<...> überhaupt anspricht, muss Cmd in der Konfiguration als Super gemappt sein — Details im Artikel Tasten-Notation.

Eine Geschmacksfrage bleibt: Manche Umsteiger bauen die Bindings dauerhaft nach, andere zwingen sich in der ersten Woche bewusst zu den Emacs-Defaults, um den „echten" Workflow zu lernen. Beides ist legitim — wichtig ist, sich für eine Strategie zu entscheiden, statt jeden Tag zwischen den Mustern hin und her zu denken.

Numerische Prefix-Argumente — dieselben Befehle, mehr Distanz

Jeder Bewegungs-Befehl in Emacs akzeptiert ein numerisches Prefix-Argument, das angibt, wie oft der Befehl ausgeführt werden soll. Damit wird aus „ein Wort vorwärts" sofort „fünf Wörter vorwärts" — ohne dass ein eigener Befehl dafür existieren müsste.

Es gibt zwei Schreibweisen für Prefix-Argumente:

  • C-u N — universelles Prefix, gefolgt von der Zahl und dem Befehl.
  • M-N — Meta mit Ziffer ist ein Shortcut für dasselbe (nur für Ziffern 0–9 sinnvoll, bei mehrstelligen einfach Ziffern nacheinander mit Meta tippen).

Ein paar Beispiele:

TastenfolgeBedeutung
C-u 10 C-f10 Zeichen vorwärts
M-5 M-f5 Wörter vorwärts
C-u 50 C-n50 Zeilen nach unten
M-- M-fein Wort RÜCKWÄRTS (negatives Argument)
C-u -3 C-n3 Zeilen nach OBEN

Das Minus-Argument (M-- bzw. C-u -) kehrt die Richtung eines Befehls um — das ist besonders bei Befehlen praktisch, die keine eigene Rückwärts-Variante haben. C-u 50 C-n ist in vielen Fällen schneller als zu scrollen oder die Maus zu greifen, und der Mehraufwand gegenüber C-n C-n C-n... lohnt sich ab ca. fünf Wiederholungen.

Mehr zum Mechanismus selbst im Artikel zu den M-x-Befehlen — Prefix-Argumente sind in Emacs universell und funktionieren mit fast jedem interaktiv aufrufbaren Befehl, nicht nur mit Bewegungen.

Idiomatische Bewegung — Workflow-Sammlung

Die einzelnen Befehle sind nur die halbe Miete — ihr Wert entsteht aus Kombinationen. Eine Auswahl praxis-relevanter Muster, die in Emacs als „idiomatisch" gelten:

  • An den Anfang der Inhalts-Zeile: M-m statt C-a — bei eingerücktem Code spart das einen Tastendruck und ein „nochmal überlegen".
  • Ein Wort markieren: C-SPC M-f setzt eine Mark und springt ein Wort weiter — die dazwischenliegende Region ist markiert.
  • 50 Zeilen nach unten ohne Scrollen: M-5 0 C-n — schneller als jede Maus-Operation.
  • Wort rückwärts löschen: M-DEL ruft backward-kill-word auf — kombiniert Navigation und Edit in einem Befehl. Pendant vorwärts: M-d (kill-word).
  • Vom Cursor bis Zeilenende killen: C-k (kill-line) — entfernt alles ab Cursor bis Zeilenende und packt es in den Kill-Ring. Mit Prefix-Argument C-u 5 C-k werden fünf ganze Zeilen gekillt.
  • Wort transponieren: M-t (transpose-words) tauscht das Wort vor dem Cursor mit dem dahinterstehenden — Tipp-Fehler-Reparatur in einem Tastendruck.

Diese Mini-Workflows zeigen das Grundprinzip von Emacs: einzelne, kleine, gut benannte Befehle, die sich frei kombinieren lassen. Das ist deutlich anders als das „eine Taste, ein Großbefehl"-Modell vieler GUI-Editoren — und genau deshalb wird Emacs auf Dauer schneller.

Interessantes

Buchstaben-Heim-Bindings sind das Markenzeichen

Die f/b/n/p/a/e-Reihe ist seit den 1970ern unverändert — wer sie meistert, navigiert ohne die Hände vom Heim-Block zu nehmen. Genau das ist der Grund, warum erfahrene Emacs-Nutzer auch in Terminals, IDEs mit Emacs-Keymap und sogar in Browser-Adressleisten (über Erweiterungen) reflexhaft C-a/C-e benutzen.

Pfeiltasten funktionieren, sind aber unidiomatisch

<left>/<right>/<up>/<down> sind in Vanilla-Emacs an dieselben Funktionen gebunden — sie tun also nichts Falsches. Wer sie aber reflexhaft nutzt, bremst sich auf lange Sicht selbst aus, weil jeder Pfeiltasten-Griff die rechte Hand vom Heim-Block weghebt.

Was als "Wort" gilt, ist mode-abhängig

Die syntax-table jedes Major-Modes definiert Wortgrenzen separat. In python-mode ist _ Wort-Zeichen (my_variable = ein Wort), in text-mode Trennzeichen (my_variable = drei Wörter). Dasselbe M-f verhält sich also je nach Buffer anders.

subword-mode für CamelCase

(add-hook 'prog-mode-hook #'subword-mode) aktiviert die CamelCase-Navigation in allen Programmier-Buffern — getElementById wird zu drei Wörtern, und alle wort-basierten Edit-Befehle (M-d, M-DEL, M-t) profitieren mit.

track-eol für Spalten-Klebrigkeit am Zeilenende

Mit (setq track-eol t) bleibt der Cursor bei C-n/C-p am Zeilenende, sobald er es einmal mit C-e erreicht hat — auch wenn die Folgezeilen unterschiedlich lang sind. Praktisch für „am letzten Zeichen jeder Zeile etwas anhängen"-Aufgaben.

macOS ignoriert Cmd standardmäßig

Cmd+← und Cmd+→ tun in Vanilla-Emacs auf macOS nichts. Wer die GUI-Reflexe behalten will, baut die Bindings mit (keymap-global-set "s-<left>" ...) selbst — Voraussetzung: Cmd ist als Super belegt (siehe Tasten-Notation).

Prefix-Argumente machen jede Bewegung zur weiten Reise

C-u 50 C-n ist meist schneller als zu scrollen. M-- M-f dreht jede Vorwärts-Bewegung in eine Rückwärts-Bewegung. Prefix-Argumente sind universell — sie funktionieren mit fast jedem Emacs-Befehl, nicht nur mit Bewegungen.

`M-m` ist bei eingerücktem Code meist die bessere Wahl

back-to-indentation springt zum ersten Nicht-Whitespace-Zeichen — bei if, for, def und ähnlichen Konstrukten ist das praktisch immer der Punkt, den du erreichen willst. C-a landet stur in Spalte 0, was nur selten gemeint ist.

Weiterführende Ressourcen

Externe Quellen

Verwandte Artikel

/ Weiter

Zurück zu Navigation

Zur Übersicht