Isearch ist die inkrementelle Suche von Emacs — und für viele User der wichtigste Navigations-Befehl überhaupt. Du drückst C-s, tippst, und Emacs hebt parallel zur Eingabe alle Treffer hervor und springt zum ersten. Eingabe verfeinern, Match wechseln, beenden — alles mit derselben Tasten-Logik. Wer einmal verinnerlicht hat, dass C-s nicht „Speichern" heißt, sondern „Suchen, und zwar sofort", navigiert in einer 5000-Zeilen-Datei schneller als mit jedem Scrollen, Greppen oder Bookmark-Sprung.

C-s und C-r: Vorwärts und rückwärts

Isearch hat zwei Einstiegs-Tasten — eine pro Richtung. Beide öffnen denselben Modus, nur die Such-Richtung unterscheidet sich. Auch der lange M-x-Name ist verfügbar, falls die Tastenkombi auf deinem Setup belegt ist (z. B. wenn C-s im Terminal vom Flow-Control geschluckt wird):

  • C-s isearch-forward: sucht ab Point in Richtung Buffer-Ende.
  • C-r isearch-backward: sucht ab Point in Richtung Buffer-Anfang.
  • M-x isearch-forward / M-x isearch-backward als ausgeschriebene Varianten.

Der Ablauf ist immer derselbe — und genau diese Konstanz macht isearch so schnell zu lernen:

  1. Du drückst C-s. In der Echo-Area erscheint der Prompt I-search: (bzw. I-search backward: bei C-r).
  2. Du tippst Zeichen für Zeichen die Suche. Schon nach dem ersten Zeichen springt Point an die nächste Fundstelle, alle weiteren Treffer im sichtbaren Bereich werden farblich hervorgehoben.
  3. Du verfeinerst die Eingabe, springst zwischen Treffern oder beendest die Suche.

Beendet wird mit RET: Point bleibt am aktuellen Treffer stehen — du bist „angekommen". Abgebrochen wird mit C-g: Point springt zurück zur Startposition, als wäre nichts passiert. Diese saubere Trennung zwischen „bleiben" und „abbrechen" ist eine der Kern-Eigenschaften von isearch und unterscheidet ihn von Suchdialogen in klassischen Editoren.

Zusätzlich legt Emacs beim Beenden die ursprüngliche Position auf den Mark-Ring ab — du kannst sie mit C-u C-SPC jederzeit wieder ansteuern. Isearch ist also gleichzeitig Suche und Mark-Operation.

Während der Suche navigieren

Die zweite Hälfte von isearch sind die Tasten, die im laufenden Modus wirken — nicht zum Start. Hier sitzt die eigentliche Power: Emacs erkennt die Tasten als „Such-Befehle" statt als „normale Editier-Befehle", solange isearch aktiv ist.

TasteWirkung
C-szum nächsten Treffer (vorwärts) springen
C-rzum vorherigen Treffer (rückwärts) springen
RETSuche beenden, Point bleibt am aktuellen Treffer
C-gSuche abbrechen, Point geht zurück zur Start-Position
DEL / BACKSPACEletztes Zeichen aus der Eingabe entfernen, zurück zum vorherigen Match
C-wdas Wort am Cursor an die Sucheingabe anhängen
M-s C-eden Rest der aktuellen Zeile an die Eingabe anhängen
C-yden obersten kill-ring-Eintrag an die Eingabe anhängen
M-yvorigen kill-ring-Eintrag anhängen (nach C-y zyklisch)
C-qnächstes Zeichen wörtlich (quoted) übernehmen — z. B. C-q TAB

Die spannendsten Tasten sind C-w und DEL. C-w schnappt sich das Wort, auf dem Point gerade steht, und macht es zur Suche — damit beantwortest du in zwei Tastendrücken die Frage „wo wird dieses Symbol noch verwendet?". DEL wiederum ist nicht „Backspace in der Eingabe", sondern springt mit zurück: der vorletzte Match wird wieder aktiv. Isearch denkt also wirklich Schritt für Schritt mit.

So fühlt sich eine typische Such-Session an — vom ersten Treffer bis zum gewünschten:

text ASCII-Schema: typische isearch-Session
Start:    Point steht in Zeile 12.
          | def render_card(card):
          |     return card.title

C-s       I-search:
h         I-search: h
          → springt zum 'h' in "card.title" (Zeile 13)

e         I-search: he
          → kein 'he' im sichtbaren Bereich → Treffer in Zeile 47:
          |     header = build_header(card)

a         I-search: hea
          → derselbe Treffer (header) bleibt
          → weitere Highlights im Buffer markiert

C-s       → nächster Treffer (Zeile 89): heading.tag
C-s       → nächster Treffer (Zeile 134): page.header
DEL       I-search: he   ← 'a' entfernt
          → zurück zum 'he'-Match in Zeile 47

RET       Suche beendet. Point bleibt in Zeile 47 vor 'header'.

Zwei Detail-Hinweise zum Verhalten:

  • Nicht-Such-Tasten beenden isearch automatisch. Drückst du z. B. C-a (Zeilenanfang), beendet Emacs die Suche zuerst und führt dann den Befehl aus. Das ist gewollt — du verlässt isearch flüssig in jede Editier-Aktion.
  • Wrap-around statt „Ende". Stößt C-s auf das Buffer-Ende, meldet die Echo-Area Failing I-search. Ein weiterer C-s springt zum Buffer-Anfang und sucht von vorne — der Prompt wechselt zu Wrapped I-search.

History-Cycling und Modus-Toggles

Isearch merkt sich jede beendete Suche in einer eigenen History. Mit zwei Tasten cycelst du durch die letzten Eingaben, ohne sie nochmal tippen zu müssen. Daneben gibt es Toggles, mit denen du mitten in der Suche das Such-Verhalten umschaltest:

TasteWirkung
M-pzur vorigen Suche in der isearch-History
M-nzur nächsten Suche in der isearch-History
M-rToggle: Regex-Suche an/aus
M-cToggle: Case-Sensitivity an/aus
M-s wWort-Modus — nur ganze Wörter matchen
M-s _Symbol-Modus — nur ganze Symbole matchen (für Programmier-Modes)
M-s SPCLax-Space-Modus — Leerzeichen in der Eingabe matchen beliebigen Whitespace
M-s iToggle: auch unsichtbaren Text (Overlays) durchsuchen

Der wichtigste praktische Effekt von M-p / M-n: zwei aufeinanderfolgende C-s ohne Eingabe nehmen automatisch die letzte Suche. Das spart bei wiederholten Such-Mustern enorm — z. B. wenn du dasselbe Symbol in mehreren Buffern verfolgst.

Die Toggles bleiben für die aktuelle Session aktiv. Schaltest du mit M-r auf Regex um, sucht der Rest der Session als Regex; ein weiteres M-r schaltet zurück. So lässt sich eine begonnene wörtliche Suche unterwegs in eine Regex-Suche heben, ohne sie abzubrechen.

Konfig-Tipp: Scrollen während der Suche

Per Default beendet Scrollen die laufende isearch. Eine einzige Zeile in der Konfiguration ändert das:

elisp init.el — isearch beim Scrollen aktiv lassen
;; Scrollen während isearch lassen, ohne die Session zu beenden
(setq isearch-allow-scroll t)

;; Zusätzlich: Cursor mittig halten beim Treffer-Sprung
(setq isearch-lazy-count t)

isearch-lazy-count als kostenloser Bonus blendet im Prompt einen Zähler ein (z. B. [3/17] I-search: header) — du siehst sofort, an welchem Treffer du gerade stehst und wie viele es insgesamt sind. Wohin diese Zeilen gehören, beschreibt der Artikel zur Konfiguration mit init.el und early-init.el ausführlich; in Kürze: in deine ~/.config/emacs/init.el.

M-e: Sucheingabe editieren

Sobald die Suche länger als ein paar Zeichen ist — mehrere Wörter, ein Tippfehler weiter hinten, ein Whitespace-Detail — wird das reine „DEL bis zum Fehler" lästig. Für genau diesen Fall gibt es M-e (isearch-edit-string):

  • M-e hebt die aktuelle Sucheingabe in den Minibuffer als normalen Text.
  • Du editierst dort mit allen üblichen Mitteln: Pfeiltasten, M-f / M-b für Wort-Sprünge, C-a / C-e, Selektion, Kill/Yank.
  • Mit RET kehrst du in isearch zurück — der überarbeitete String ist sofort aktiv, das Highlighting wird neu berechnet.

Eine zweite, gleichwertige Variante heißt M-s e — sie ruft denselben Befehl auf, passt aber in das einheitliche M-s …-Schema der spezialisierten isearch-Befehle. Beide Wege landen im selben Editor; welcher Tastendruck dir besser in den Finger geht, ist Geschmackssache.

Region-Suche

Ist beim Start von C-s bereits eine Region aktiv, beschränkt Emacs die Suche automatisch auf diese Region — kein zusätzlicher Schalter nötig. Das ist eines der unterschätzten Detail-Features: „nur in diesem Block ersetzen" wird damit zum Zwei-Schritt-Workflow.

Der typische Ablauf:

  1. Bereich markieren — z. B. mit C-SPC und C-M-h (markiert die aktuelle Funktion) oder per C-x h (markiert den ganzen Buffer, was die Region-Suche wieder neutralisiert).
  2. C-s drücken. Die Region bleibt aktiv, isearch startet im Region-Modus.
  3. Tippen wie gewohnt — Treffer werden nur innerhalb der Region gefunden. Stößt C-s ans Region-Ende, meldet die Echo-Area Failing I-search und springt erst beim zweiten Druck zurück an den Region-Anfang.

Die Eingrenzung gilt für die gesamte Such-Session, bis du sie mit RET oder C-g beendest — auch wenn du zwischendurch über die History cycelst oder den Modus toggelst. Praktisch: das so begonnene M-% für Ersetzungen erbt die Region-Begrenzung mit.

Isearch zu anderen Befehlen weiterleiten

Eine der mächtigsten — und am wenigsten bekannten — Eigenschaften von isearch: du kannst aus einer laufenden Suche heraus direkt zu verwandten Befehlen springen, die die aktuelle Eingabe als Startwert übernehmen. Du tippst die Suche also nur einmal.

TasteWirkt alsEffekt
M-s oisearch-occurlistet alle Treffer im Buffer in einem *Occur*-Buffer auf
M-%query-replace mit aktueller Eingabestartet interaktives Ersetzen — Eingabe ist schon gesetzt
C-M-%query-replace-regexp mit aktueller Eingabedasselbe als Regex-Ersetzung
M-s eisearch-edit-stringvolles Editieren der Eingabe im Minibuffer
M-s h rhighlight-regexphebt alle Treffer permanent im Buffer hervor

Der typische Workflow: du suchst mit C-s headr, siehst, dass es ein Tippfehler ist, korrigierst mit M-e auf header, prüfst mit C-s ein paar Treffer und springst dann mit M-% direkt in query-replace, ohne den String erneut zu tippen. Drei Befehle, eine einzige Eingabe.

M-s o ist die Brücke zwischen punktueller Suche und Übersicht: aus jeder isearch-Session entsteht in einer Taste ein vollständiger Index aller Treffer mit Zeilennummern. Im *Occur*-Buffer reicht RET auf einer Zeile, um zum Treffer im Original-Buffer zu springen.

Praktische Tipps für den Alltag

Sieben Muster, die isearch von „kann ich auch" zu „nutze ich täglich" machen:

  • Symbol unter dem Cursor weitersuchen. Cursor aufs Wort stellen, C-s, dann C-w — das Wort ist die Suche. Weiteres C-s springt zum nächsten Treffer. Mehrfaches C-w hängt zusätzliche Wörter an.
  • Smart-Case ohne Konfiguration. Per Default ist isearch case-insensitive — bis du selbst einen Großbuchstaben tippst. Sobald die Eingabe mixed-case ist, schaltet Emacs automatisch auf case-sensitive (Variable isearch-case-fold-search). Manuell überschreibst du mit M-c.
  • Letzte Suche wiederholen, ohne zu tippen. C-s C-s startet isearch und nutzt sofort die Eingabe der letzten Session. Bei C-r C-r analog für die Rückwärts-Variante.
  • Definition statt Vorkommen. Im Symbol-Modus (M-s _) matchen nur ganze Symbole — header findet header, aber nicht header_id oder pageHeader. Gold wert beim Lesen fremder Codebases.
  • Region als Eingrenzung. Region markieren, dann C-s — Suche ist automatisch begrenzt. Folge-Befehle wie M-% erben die Eingrenzung.
  • Aus isearch in Occur. M-s o — drei Tasten für die komplette Trefferliste in einem eigenen Buffer.
  • Den Rest der Zeile mitnehmen. M-s C-e hängt den Text von Point bis Zeilenende an die Eingabe — perfekt, um ein längeres Muster aus dem Buffer zu „greifen", statt es zu tippen.

Wer diese sieben Muster sitzen hat, braucht für die meisten Navigations- und „wo war das nochmal"-Fragen kein anderes Tool mehr — kein Greppen über externe Shells, kein Fuzzy-Finder, kein Bookmark-Tanz.

Besonderheiten

Inkrementell heißt: sofort sehen

Isearch ist inkrementell — du siehst nach jedem Tastendruck, ob deine Eingabe Treffer hat, ohne erst RET zu drücken. Ein Tippfehler wird sofort sichtbar (kein Highlight), eine zu vage Suche zeigt sofort dutzende Treffer im Buffer.

`C-w` während isearch fügt das Wort am Cursor an

Cursor aufs Symbol stellen, C-s drücken, dann C-w — die Suche ist gesetzt. Perfekt für „wo wird dieses Symbol noch benutzt?" ohne Maus, ohne Tippen.

`M-s o` macht aus jeder Suche eine vollständige Trefferliste

Aus laufender isearch heraus mit M-s o in den *Occur*-Buffer wechseln — alle Treffer mit Zeilennummern, RET springt zum gewählten Treffer. Drei Tasten für die Übersicht über den ganzen Buffer.

`M-e` ermöglicht das volle Editieren der Sucheingabe

Bei komplexen Mustern (mehrere Wörter, Whitespace-Details, Regex) ist das endlose DEL-Tippen unzumutbar. M-e hebt die Eingabe in den Minibuffer — editieren wie normaler Text, RET zurück in isearch.

isearch + aktive Region = automatisch begrenzte Suche

Region markieren, dann C-s. Kein Schalter, kein extra Kommando — die Suche bleibt innerhalb der Region, und auch nachgeschaltete Befehle wie M-% erben die Begrenzung.

`M-%` aus isearch springt direkt in `query-replace`

Eingabe einmal tippen, mit Treffern verifizieren, dann M-% — du landest in query-replace mit dem String als Such-Wert. Keine Doppel-Eingabe, kein Mode-Wechsel.

`C-g` springt zurück — `RET` bleibt am Treffer

Die saubere Trennung zwischen „erfolgreiches Beenden" und „abbrechen wie nie passiert" ist eine der besten Eigenschaften von isearch. RET = ich bin angekommen, C-g = zurück zur Startposition.

`isearch-allow-scroll = t` ist Quality-of-Life pur

Per Default beendet jedes Scrollen die isearch-Session. Mit der Variable auf t kannst du während der Suche scrollen, ohne sie zu verlieren — der gefundene Treffer bleibt aktiv, du gewinnst nur den Kontext drumherum.

`isearch-lazy-count = t` zeigt einen Live-Zähler

Mit dieser Variable steht im Prompt z. B. [3/17] I-search: header — du weißt sofort, an welchem Treffer du stehst und wie viele es insgesamt gibt. Kein blindes C-s-Klicken mehr.

Weiterführende Ressourcen

Externe Quellen

Verwandte Artikel

/ Weiter

Zurück zu Navigation

Zur Übersicht