Der Visual-Mode ist Vims Antwort auf das, was andere Editoren als „Auswahl mit der Maus" kennen — nur dass die Auswahl mit Motions und Text-Objects gemacht wird und anschließend ein einzelner Operator auf den gesamten Bereich wirkt. Das klingt zunächst nach einem Umweg gegenüber dem Normal-Mode, wo Operator und Motion in einem Befehl kombinieren. Tatsächlich ist Visual-Mode aber für drei Szenarien unschlagbar: wenn der Bereich erst geprüft werden soll, bevor man ihn verändert, wenn er sich nicht sauber durch eine Motion beschreiben lässt, und vor allem für visual-block — die rechteckige Selektion über mehrere Zeilen, mit der Vim Tabellen, Spalten und gleichartige Edits in vielen Zeilen mit drei Tastendrücken erledigt. Dieser Artikel deckt alle drei Varianten ab, zeigt die wichtigsten Operatoren auf einer Selektion und führt in die Block-Edit-Workflows ein, die Vim-Profis schätzen.

Die Idee: Auswahl zuerst, Operator danach

Im Normal-Mode kombiniert Vim Operator und Motion in einer einzigen Befehlssequenz: dw bedeutet „lösche bis zum nächsten Wort". Operator zuerst, dann Motion. Im Visual-Mode dreht sich diese Reihenfolge um: zuerst Auswahl, dann Operator. Konkret:

text Beide Varianten erreichen dasselbe
" Normal-Mode-Variante: Operator + Motion
dw       " lösche bis zum nächsten Wort

" Visual-Mode-Variante: erst Auswahl, dann Operator
vw       " v = visual charwise, w = Motion erweitert Auswahl
d        " auf die Selektion d (delete) anwenden

Funktional identisch — drei Tasten in beiden Varianten. Der Unterschied liegt im Mental Model:

  • Operator-zuerst ist schneller, wenn klar ist, was gelöscht/geändert werden soll. Wenig Tipparbeit, direkt am Ziel.
  • Auswahl-zuerst ist sicherer, wenn der Bereich erst visuell verifiziert werden soll. Du siehst, was markiert wird, bevor du den Operator drückst. Bei komplexen Selektionen, die mehrere Motions/Text-Objects kombinieren, ist das oft hilfreich.

In der Praxis wechselt sich beides ab. Ein Vim-Profi nutzt Operator-Motion-Kombis für die geübten Edit-Muster und Visual-Mode dort, wo „erst markieren, dann sehen, was rauskommt" der bessere Weg ist.

Die drei Varianten

Visual-Mode kennt drei Unterarten, die sich darin unterscheiden, welche Form die Auswahl hat:

EintrittVarianteForm der Selektion
vcharwiseZeichen-genau, von Cursor bis Ziel-Position
Vlinewiseganze Zeilen, immer von Zeilenanfang bis -ende
Ctrl-vblockwiserechteckiger Block über mehrere Zeilen

In allen drei Varianten zeigt die Statusline -- VISUAL --, -- VISUAL LINE -- oder -- VISUAL BLOCK -- an. Der Modus-Wechsel zwischen den drei Varianten geht aus jedem heraus — wer in v ist und auf V umschalten möchte, drückt einfach V.

v (charwise) ist der Default. Cursor steht am Anfang der Selektion, mit Motions wird sie erweitert. Wer vwww tippt, markiert drei Wörter ab Cursor. Wer vi" tippt, markiert den Inhalt zwischen Anführungszeichen (Text-Object).

V (linewise) markiert immer ganze Zeilen, unabhängig davon, wo der Cursor innerhalb der Zeile steht. Praktisch beim Einrücken, Sortieren, Verschieben oder Filtern ganzer Code-Blöcke.

Ctrl-v (blockwise) ist die rechteckige Variante. Mit Ctrl-v, dann nach unten und nach rechts, markierst du ein Rechteck — das wirkt anschließend gleichzeitig auf alle markierten Zeilen. Mehr dazu im Block-Abschnitt unten.

Operatoren auf einer Selektion

Sobald eine Auswahl steht, wirkt fast jeder Operator wie aus dem Normal-Mode gewohnt — nur ohne nachgestellte Motion, weil die Motion schon in der Auswahl steckt. Die wichtigsten:

TasteEffekt auf die Selektion
dlöschen
yyank (kopieren) ins namenlose Register
cchange — löschen und in den Insert-Mode wechseln
> / <einrücken / ausrücken (eine Shiftwidth-Einheit)
=auto-indent über equalprg oder filetype-Plugin
gqreformatieren (Zeilenumbruch nach textwidth)
gu / gUlowercase / uppercase
g~case toggle
!durch externen Shell-Befehl filtern (z. B. !sort zum Sortieren)
:Ex-Befehl auf den Range ('<,'>) anwenden

Eine kleine Eleganz: nach Anwendung des Operators kehrt Vim automatisch in den Normal-Mode zurück. Es ist keine Esc-Taste danach nötig — der Operator beendet die Visual-Phase selbst.

text Beispiele aus dem Alltag
" Aufgabe: drei Zeilen einrücken
V2j>            " V startet linewise, 2j erweitert um 2 Zeilen, > rückt ein

" Aufgabe: einen Code-Block in Großbuchstaben umwandeln
vap             " v = charwise, ap = around paragraph
gU              " uppercase auf die Selektion

" Aufgabe: einen markierten Bereich durch sort filtern
V5j             " linewise, 5 Zeilen nach unten
!sort -u        " durch sort -u filtern

Die zwei am häufigsten unterschätzten Operatoren sind = (auto-indent — formatiert kompletten Code nach den filetype-Regeln) und ! (externer Shell-Filter — !sort, !sort -u, !column -t, !jq ., !awk '...' direkt auf die Selektion anwenden). Beide ersetzen für viele Anwendungen ganze Plugins.

gv und o — zwei kleine Helfer mit großer Wirkung

Zwei Tastenkombinationen verdienen eigene Erwähnung, weil sie im Visual-Workflow regelmäßig Zeit sparen:

gv — die letzte Selektion reaktivieren

gv im Normal-Mode stellt die letzte Visual-Selektion wieder her — exakt mit derselben Form (charwise/linewise/blockwise) und denselben Grenzen. Praktisch in zwei Situationen:

  • Operator vergessen: du markierst, drückst aus Versehen Esc statt eines Operators. gv holt die Selektion zurück.
  • Zwei Operationen am selben Bereich: erst > (einrücken), dann gv (reselektieren), dann = (formatieren).
text gv im Einsatz
Vap            " Absatz markieren (linewise around paragraph)
>              " einrücken — Selektion verschwindet, zurück in Normal-Mode
gv             " Selektion reaktivieren
=              " auto-indent

o — Cursor-Ende der Selektion wechseln

Während einer aktiven Visual-Selektion springt o mit dem Cursor an das andere Ende der Selektion. Das ist nicht nur kosmetisch — von dort aus kannst du die Selektion in die andere Richtung erweitern.

text o im Einsatz
" Buffer-Inhalt:
" Zeile 1
" Zeile 2    ← Cursor steht hier
" Zeile 3

Vj             " linewise, eine Zeile nach unten — Zeile 2 und 3 markiert
o              " Cursor an den Anfang der Selektion (Zeile 2)
k              " jetzt nach oben erweitern — Zeile 1 und 2 markiert
" (Zeile 3 ist nicht mehr in der Selektion)

Im Visual-Block wechselt o ebenfalls zwischen den vier Ecken der Selektion — o springt zur diagonalen Ecke, ein Großbuchstaben-O zur horizontal gegenüberliegenden.

Visual-Block — die Geheimwaffe

Der Visual-Block-Mode mit Ctrl-v ist die wahrscheinlich am häufigsten unterschätzte Vim-Funktion. Er erlaubt rechteckige Selektionen über mehrere Zeilen — und auf diese Rechtecke lassen sich Operatoren anwenden, als wären sie eine zusammenhängende Region.

Drei klassische Anwendungen:

Block-Delete: eine Spalte aus mehreren Zeilen löschen

text Vorher
FOO_aaa = 1
FOO_bbb = 2
FOO_ccc = 3
FOO_ddd = 4

Aufgabe: das Präfix FOO_ aus allen vier Zeilen entfernen.

text Tastenfolge
" Cursor in Zeile 1, Spalte 1 (auf "F")
<C-v>          " Visual-Block-Mode
3j             " drei Zeilen nach unten — vier Zeilen markiert
3l             " drei Spalten nach rechts — vier Zeichen pro Zeile markiert
d              " delete — das Rechteck "FOO_" verschwindet aus allen vier Zeilen
text Nachher
aaa = 1
bbb = 2
ccc = 3
ddd = 4

Block-Insert: einen Präfix in viele Zeilen einfügen

Die umgekehrte Operation. Gleicher Ausgangsbuffer:

text Vorher
aaa = 1
bbb = 2
ccc = 3
ddd = 4

Aufgabe: vor jede Zeile ein // als Kommentar-Präfix einfügen.

text Tastenfolge
" Cursor in Zeile 1, Spalte 1
<C-v>          " Visual-Block-Mode
3j             " drei Zeilen nach unten — alle vier Zeilen markiert (1-Spalte-Breite)
I              " Insert am Block-Anfang (Großbuchstaben-I!)
// <Esc>       " "// " tippen, dann ESC
" Nach dem Esc: Vim repliziert die Eingabe auf alle markierten Zeilen
text Nachher
// aaa = 1
// bbb = 2
// ccc = 3
// ddd = 4

Wichtig: Vim zeigt während des Tippens nur die erste Zeile mit dem neuen Inhalt — die Replikation auf die anderen Zeilen passiert erst beim Drücken von Esc. Das irritiert Anfänger oft („das funktioniert ja nicht!"), ist aber Absicht: solange du tippst, kannst du die Eingabe korrigieren. Erst nach Esc wird die finale Eingabe auf den Block angewendet.

Block-Append: am Block-Ende hängen

Analog zu I (Block-Insert vorne) gibt es A für Block-Append am Ende. Vor allem nützlich, wenn die Selektion eine ungleichmäßige rechte Kante hat — A wirkt dann nicht am rechten Block-Rand, sondern am tatsächlichen Zeilenende jeder einzelnen Zeile.

text Tastenfolge — Semikolon an jede Zeile hängen
" Buffer-Inhalt (vier Zeilen, unterschiedlich lang):
" let x = 1
" let xy = 2
" let xyz = 3
" let xyzw = 4

" Cursor in Zeile 1
<C-v>3j$       " Block über vier Zeilen, bis Zeilenende ($) jeder Zeile
A;<Esc>        " A statt I — Append, dann ; tippen, Esc

Ergebnis: jede Zeile bekommt am Ende ein ;, auch wenn die Zeilen unterschiedlich lang sind. Diese Operation in einem nicht-modalen Editor ist deutlich aufwendiger — typisch mit Regex-Replace oder Multi-Cursor-Manipulation. In Vim sind es fünf Tasten.

Block-Change und String-Replace

Über c (change) kann man im Block-Mode den gesamten markierten Block durch einen neuen String ersetzen:

text Block-Change
" Buffer:
" color: red
" color: red
" color: red

" Cursor auf "r" der ersten Zeile
<C-v>2j2l      " 3 Zeilen × 3 Zeichen (red) markiert
c              " Block-Change
green<Esc>     " neuer String, Esc — wird auf alle Zeilen angewendet

" Ergebnis:
" color: green
" color: green
" color: green

Eng verwandt: r (replace) im Visual-Block-Mode ersetzt jedes Zeichen im Block durch genau ein anderes:

text Block-Replace
" 3×3-Block markiert
r-             " jedes der 9 Zeichen wird durch "-" ersetzt

Praktisch zum Erzeugen von Trenner-Blöcken oder zum Maskieren von Bereichen.

g Ctrl-a — aufsteigende Zahlen pro Zeile

Eine Funktion, die fast wie eine Versteckte Tür wirkt: in einer Visual-Selektion erzeugt g Ctrl-a pro Zeile inkrementell aufsteigende Zahlen. Das ist Vims eingebauter „Sequenz-Generator".

text Vorher
" 1.
" 1.
" 1.
" 1.
text Tastenfolge
" Cursor auf der "1" der ersten Zeile
V3j            " linewise, 4 Zeilen markiert
g<C-a>         " mit g-Prefix: pro Zeile +1 zusätzlich
text Nachher
" 1.
" 2.
" 3.
" 4.

Das gleiche funktioniert mit g<C-x> für absteigende Sequenzen und mit Counts (3g<C-a> für Schritte von 3 pro Zeile). Wer regelmäßig nummerierte Listen, Test-Daten oder Index-Spalten erzeugt, hat damit ein eingebautes Werkzeug, das ohne Plugin auskommt.

Visual-Selektion in Ex-Befehlen nutzen

Wenn man im Visual-Mode : drückt, springt Vim in den Command-Line-Mode — und füllt automatisch den Range mit '<,'> vor, was „von Anfang der Selektion bis zu deren Ende" bedeutet. Das macht Visual-Mode zu einem natürlichen Auswahl-Werkzeug für :s-Substitutionen, :sort, :g und beliebige andere Ex-Befehle:

text Ex-Befehle nur auf Selektion
" Zehn Zeilen markieren
V9j

" Mit : springt Vim in die Command-Line, Vim füllt schon
" den Range vor: ':<,'>
:              " (Vim zeigt: ':<,'>)
s/foo/bar/g    " ersetzt foo durch bar — nur in den markierten Zeilen
<CR>

Das ist deutlich präziser als ein globaler :%s/.../.../g, weil es den Wirkungsbereich auf den explizit markierten Teil beschränkt. Bei Konfig-Files oder Code mit gleichnamigen Strings in unterschiedlichen Kontexten ist das die saubere Variante.

Besonderheiten

Visual-Block ist Vims Antwort auf Multi-Cursor

Was VS Code als „Multi-Cursor" bewirbt, leistet Vim mit Visual-Block + I/A. Es gibt zwar auch Plugins wie vim-multiple-cursors, die echte Multi-Cursor in Vim nachbauen — aber für die meisten Anwendungen ist <C-v> plus Block-Insert das schnellere und stabilere Werkzeug. Ohne Plugin, ohne Lernkurve nach den Modi-Grundlagen.

`V` und `:` als das schnellste Sortier-Werkzeug

Wer eine ungeordnete Liste in Vim hat, markiert sie mit V<motion> linewise und tippt :sort<CR>. Drei bis fünf Tasten — fertig. Mit :sort u zusätzlich Duplikate raus, mit :sort n numerisch, mit :sort r rückwärts. In keinem grafischen Editor geht das schneller.

Block-Insert ohne sichtbares Feedback ist Absicht

Während des Tippens nach Block-I zeigt Vim die Eingabe nur in der ersten Zeile. Anfänger glauben, es funktioniere nicht. Erst nach Esc repliziert Vim den Text auf alle markierten Zeilen. Wenn das Esc fehlt, ist die Replikation aus.

`gv` merkt sich den Modus — auch linewise und blockwise

Wer im Linewise-Visual war und gv aus dem Normal-Mode drückt, kommt zurück in den Linewise-Visual mit identischer Auswahl. Selbiges für <C-v>. Das ist kein generisches „letzte Selektion", sondern eine vollständig restaurierte Visual-Phase.

`o` in Block-Mode wechselt Ecken, nicht nur Enden

Im charwise/linewise wechselt o zwischen den zwei Enden. Im Block-Mode gibt es vier Eckeno wechselt zur diagonalen Ecke, O zur horizontal gegenüberliegenden. Das ist nützlich, wenn die Block-Selektion in eine andere Richtung erweitert werden soll als ursprünglich begonnen.

`g` ist ein versteckter Datengenerator

Test-Daten generieren? Tabellen-Spalte mit fortlaufenden IDs? Migrations-Skript mit nummerierten Schritten? V<motion>g<C-a> erzeugt sie in drei Tastendrücken aus einer Liste identischer Startwerte. Ein Vim-Trick, der in keinem Anfänger-Tutorial steht — aber im Alltag erstaunlich oft passt.

Weiterführende Ressourcen

Externe Quellen

Verwandte Artikel

/ Weiter

Zurück zu Bedienkonzept

Zur Übersicht