Neben Normal, Insert, Visual und Command-Line kennt Vim noch eine Reihe spezialisierter Modi, die im Alltag seltener auftauchen, aber an bestimmten Stellen genau das Richtige sind. Der Replace-Mode überschreibt Zeichen, statt einzufügen — praktisch beim Editieren von formatierten Tabellen oder ASCII-Diagrammen. Der Select-Mode ist Vims Versuch, Anfängern aus der IDE-Welt das Vertraute „markieren-mit-Maus-und-tippen" zu erlauben. Der Operator-pending-Mode schließlich ist gar kein klassischer Modus mit Eingabe, sondern der versteckte Halbschritt zwischen einem getippten Operator und seiner ausstehenden Motion — und Bühne für eine ganze Klasse von Mappings, die ein eigenes Plugin-Genre tragen. Dieser Artikel deckt alle drei ab.
Replace-Mode (R): überschreiben statt einfügen
Aus dem Normal-Mode wechselst du mit dem großen R in den Replace-Mode. Die Statusline zeigt -- REPLACE --. Im Replace-Mode verhält sich die Tastatur weitgehend wie im Insert-Mode — mit einem entscheidenden Unterschied: jedes neu getippte Zeichen überschreibt das Zeichen unter dem Cursor und rückt eins nach rechts, statt einzufügen und alles Nachfolgende zu verschieben.
" Buffer-Inhalt: Hallo Welt
" Cursor steht auf "W" (Spalte 7)
R " Replace-Mode (Statusline: -- REPLACE --)
VIM " jeder Buchstabe überschreibt einen
<Esc> " zurück in Normal-Mode
" Ergebnis: Hallo VIMt
" - "W" durch "V" ersetzt
" - "e" durch "I" ersetzt
" - "l" durch "M" ersetzt
" - "t" bleibt — wir haben nur drei Zeichen getipptBei einem Backspace im Replace-Mode passiert etwas Besonderes: Vim macht den letzten Replace rückgängig, stellt also das ursprüngliche Zeichen wieder her. Das ist eine kleine Komfort-Funktion gegen Vertipper, die der Insert-Mode in dieser Form nicht hat.
Wer am Zeilenende ankommt und weiter tippt, verlängert Replace die Zeile — er löscht also keinen Zeilenumbruch, sondern hängt einfach an. Damit wird Replace-Mode an Zeilenenden identisch zum Insert-Mode.
Wann ist Replace sinnvoll?
Replace ist nicht der erste Reflex und auch nicht für tägliche Edits gedacht. Er glänzt in zwei Szenarien:
- Formatierte Tabellen oder ASCII-Diagramme, in denen die Spalten-Ausrichtung erhalten bleiben muss. Wer in einer Markdown-Tabelle den Wert in einer Zelle ändert, will die
|-Trenner nicht verschieben — Replace überschreibt nur die Werte. - Pattern-Daten mit fester Länge, etwa Hex-Dumps, IP-Adressen, Maskierungen.
Für die meisten Edits bleibt c{motion} (change) die elegantere Wahl, weil sie sich in die Operator-Motion-Grammatik einfügt.
Virtual Replace (gR): Tabs als logische Spalten
Eine weniger bekannte Variante: gR startet den Virtual-Replace-Mode. Der Unterschied zum normalen Replace ist die Behandlung von Tabs und Mehrbyte-Zeichen: Virtual Replace betrachtet sie als eine logische Spalte, nicht als das eigentliche Zeichen-Volumen.
" Buffer hat einen Tab (gleich 8 Spalten visuell):
" Hallo[TAB]Welt
" Cursor auf dem Tab.
" Mit R (klassisch):
R abc<Esc>
" Ergebnis: das Tab wird durch "abc" ersetzt, die nachfolgende
" Spalten-Ausrichtung von "Welt" verschiebt sich nach links.
" Mit gR (virtual):
gR abc<Esc>
" Ergebnis: das Tab wird visuell durch "abc " ersetzt — die
" 8 Spalten bleiben erhalten, "Welt" steht weiterhin in Spalte 9.Gleicher Effekt bei Mehrbyte-Zeichen wie ä, ö, 漢字: R zählt Bytes, gR zählt Spalten (visual width). Wer Code-Tabellen, ASCII-Art oder kommentierte Diagramme editiert, fährt mit gR deutlich entspannter, weil sich die Spaltenstruktur nicht verschiebt.
Einzelzeichen ersetzen: r und gr
Für einen schnellen Ein-Zeichen-Ersatz braucht es keinen Modus-Wechsel. Im Normal-Mode tippt man r + das neue Zeichen:
" Cursor steht auf einem "a"
rb " ersetzt das "a" durch "b" — kein Modus-Wechsel, sofort fertig
" Mehrere identische Zeichen ersetzen — mit Count:
3rx " ersetzt drei Zeichen ab Cursor durch jeweils "x"
" (sinnvoll z. B. um drei "-" durch "x" zu ersetzen)Analog ersetzt gr ein Zeichen unter Berücksichtigung der virtuellen Breite — relevant nur, wenn der Cursor auf einem Tab oder Mehrbyte-Zeichen steht.
r ist eines der häufigsten Vim-Befehle überhaupt: Tippfehler-Korrektur in einem Anschlag, ohne Modus-Wechsel.
Select-Mode: Vim für Maus-Workflows
Der Select-Mode ist eine spezielle Variante des Visual-Mode, die so funktioniert wie die Auswahl in einem normalen Editor: ein Bereich ist markiert, und beim Tippen wird die Markierung durch den getippten Text ersetzt — wie in VS Code, Word oder einem Browser-Textfeld. Konkret heißt das: drückt man im Select-Mode a, wird die Markierung durch ein einzelnes „a" ersetzt, anschließend ist man im Insert-Mode.
Aus dem Normal-Mode erreicht man Select-Mode auf drei Wegen:
| Taste | Variante |
|---|---|
| gh | Select-Mode charwise (analog zu v im Visual) |
| gH | Select-Mode linewise (analog zu V) |
| g Ctrl-h | Select-Mode blockwise (analog zu <C-v>) |
Sichtbarer Unterschied zum Visual-Mode: die Statusline zeigt -- SELECT --. Die Selektion sieht identisch aus.
Wann ist Select-Mode sinnvoll?
Für Vim-Profis: praktisch nie. Visual-Mode ist konsistenter mit der Operator-Motion-Grammatik und in jeder Hinsicht flexibler. Select-Mode existiert hauptsächlich aus zwei Gründen:
- Maus-gestützte Workflows: Wenn
:set selectmode=mouseaktiv ist, wechselt Vim bei einer Mausauswahl automatisch in den Select-Mode statt in den Visual-Mode. Damit verhält sich Vim für Anwender, die hauptsächlich mit der Maus arbeiten, vertrauter. - Snippet-Engines: Plugins wie
vim-ultisnipsnutzen Select-Mode für ihre Tab-Stops — der nächste Platzhalter ist markiert, der User tippt sofort den neuen Wert, das ist der ergonomische Weg. Wer Snippets nutzt, ist regelmäßig im Select-Mode, ohne es zu merken.
Wer das Verhalten von Maus-Selektionen wieder auf Visual umstellen möchte, setzt:
" Maus-Selektion startet Visual-Mode statt Select-Mode
" (Default in den meisten modernen Configs)
set selectmode=Operator-pending-Mode: der versteckte Halbschritt
Wenn du im Normal-Mode d drückst, wartet Vim auf eine Motion oder ein Text-Object. In dieser Wartezeit befindest du dich technisch im Operator-pending-Mode (:help omap-info). Der Cursor ist sichtbar als Block (oder als Bindestrich, je nach Konfiguration), keine Statusline-Meldung — der Modus ist absichtlich kurzlebig.
Drei Aktionen sind im Operator-pending-Mode möglich:
- Eine Motion tippen —
w,},$,f(, … — der Operator wirkt auf den Bereich. - Ein Text-Object tippen —
iw,ap,i", … — der Operator wirkt auf das benannte Objekt. - Den Operator-pending-Modus abbrechen — mit
<Esc>oder einem zweitend(wasddergibt, also „ganze Zeile löschen").
Eigene Operator-pending-Mappings: omap
Hier wird es interessant: der Operator-pending-Mode hat einen eigenen Mapping-Namespace. Mit onoremap definierst du Mappings, die nur greifen, wenn ein Operator aktiv ist — also typischerweise eigene Text-Objects oder eigene Motions.
" "in next parentheses" — auf das nächste ( ) im Buffer wirken,
" egal wo der Cursor steht.
" Aufruf: din( → delete in next ( )
onoremap in( :<C-u>normal! f(vi(<CR>
" "in last quotes" — analog auf das letzte vorherige "
onoremap il" :<C-u>normal! F"vi"<CR>
" "until the next blank line"
onoremap u<Space> :<C-u>normal! V}<CR>Diese drei Beispiele erlauben dir, Operator-Motion-Befehle zu komponieren, die in Standard-Vim nicht existieren. din( löscht den Inhalt der nächsten Klammer, egal wie weit sie entfernt ist — eine Aktion, die in vielen Sprachen täglich gebraucht wird und für die es in Vanilla-Vim keinen Einzelbefehl gibt.
Plugins wie targets.vim, vim-textobj-user und vim-indent-object füllen genau diesen Namespace mit fertigen, durchdachten Erweiterungen. Wer einmal versteht, dass Operator-pending einen eigenen Mode-Namespace hat, kann jeden dieser Plugins lesen und gegebenenfalls selbst nachbauen. Das gesamte Thema folgt im Kapitel Text Objects.
Modus-Übersicht — alle Vim-Modi auf einen Blick
Zur Orientierung eine vollständige Liste der Modi, die Vim kennt, geordnet nach Häufigkeit im Alltag:
| Modus | Eintritt aus Normal | Statusline | Häufigkeit |
|---|---|---|---|
| Normal | (Default) | (leer) | ~90 % |
| Insert | i, a, o, c{m}, … | -- INSERT -- | ~5 % |
| Command-Line | :, /, ? | (Eingabe in unterster Zeile) | ~3 % |
| Visual | v, V, <C-v> | -- VISUAL -- (Variante) | ~2 % |
| Replace | R | -- REPLACE -- | < 1 % |
| Virtual-Replace | gR | -- VREPLACE -- | sehr selten |
| Select | gh, gH, g<C-h> | -- SELECT -- | sehr selten (außer via Maus oder Snippets) |
| Operator-pending | d, c, y, … warten | (unsichtbar) | implizit bei jedem Operator |
| Terminal | :terminal (Vim 8+) | -- TERMINAL -- | im Terminal-Workflow |
Diese Verteilung ist nicht zufällig: Vims Designer haben den Normal-Mode als Default gewählt, weil dort die Komposition aus Operatoren, Motions und Text-Objects zu Hause ist — und die ist mit Abstand der häufigste Edit-Vorgang. Die spezialisierten Modi sind genau das: spezialisiert. Wer sie kennt, kann sie gezielt einsetzen — wer sie nicht kennt, kommt im Alltag trotzdem zurecht.
FAQ
Wann nehme ich `R` und wann `c$`?
R überschreibt bestehende Zeichen und lässt nachfolgenden Text in Position. c$ (oder C) löscht bis Zeilenende und wechselt in Insert. Faustregel: wenn die Spalten-Ausrichtung nach dem Edit identisch sein muss, ist R richtig — sonst ist c{motion} sauberer, weil es sich in die Operator-Motion-Grammatik einfügt.
Was passiert mit `r` am Zeilenende?
r ersetzt ein Zeichen — wenn am Zeilenende keins ist, gibt es einen Beep. Bei r<CR> wird das Zeichen unter dem Cursor durch einen Zeilenumbruch ersetzt — was die Zeile teilt. Das ist eine kleine, oft vergessene Anwendung: an einer Stelle einen Zeilenumbruch einbauen, ohne Insert zu betreten.
`gh` ist nicht `:help h`
Häufige Verwechslung: gh im Normal-Mode startet den Select-Mode, nicht „Hilfe zu h". Wer Hilfe zu Motions sucht, tippt :help motion.txt oder :help h. gh selbst hat seinen Help-Tag unter :help gh.
Operator-pending kennt man, ohne es zu kennen
Jeder Vim-User ist hunderte Male pro Tag im Operator-pending-Mode — zwischen dem d und dem w von dw. Der „Modus" ist so kurz, dass er nicht als solcher wahrgenommen wird. Erst wenn man eigene Mappings dafür baut (onoremap) oder ein Plugin wie targets.vim analysiert, wird der Namespace bewusst.
`:set selectmode=mouse,cmd` für IDE-Workflow
Wer aus einer Maus-zentrierten IDE kommt und sich Vim schrittweise erschließen will, kann mit set selectmode=mouse,cmd das Maus-Auswahl-Verhalten an Editoren wie VS Code angleichen — markieren, tippen, der markierte Text wird ersetzt. Langfristig ist Visual-Mode der sauberere Weg; als Übergangs-Konfiguration kann Select-Mode aber den Einstieg erleichtern.
Replace im Visual-Mode — `r` ersetzt ALLE markierten Zeichen
Eine spezielle Anwendung: v (Visual), Bereich erweitern, dann r- ersetzt jedes Zeichen in der Selektion durch -. Im Visual-Block-Mode mit r# wird ein Rechteck-Bereich vollständig mit # gefüllt — praktisch für Trenner und Maskierungen. Diese Verwendung von r ist im Visual-Mode-Artikel ausführlich dokumentiert.
Weiterführende Ressourcen
Externe Quellen
- Vim Help: Replace mode — formale Definition von R.
- Vim Help: Virtual-Replace-mode — gR und Tab-Behandlung.
- Vim Help: Select-mode — Select-Mode-Verhalten und Konfiguration.
- Vim Help: omap-info — Operator-pending-Mappings.
- Vim Help: vim-modes — Übersicht aller Modi.