🧩 Die Sprache von Vim

Operator + Anzahl + Bewegung/Textobjekt

Vim-Befehle sind Sätze: ein Verb (Operator), eine Zahl und ein Ziel. Wer 5 Operatoren und 20 Ziele kennt, beherrscht 100 Befehle – statt 100 Tastenkürzel auswendig zu lernen. d2w = „lösche zwei Wörter“, ci" = „ändere innerhalb der Anführungszeichen“, yap = „kopiere einen Absatz“.

① Operator – was?
② Anzahl – wie oft?
③ Bewegung – wohin?
… oder Textobjekt – welches Stück?

Tipp: Klicke im Text rechts auf ein Zeichen, um den Cursor dorthin zu setzen.

dw
„lösche bis zum Anfang des nächsten Wortes“
exklusiv – das Zeichen am Ziel gehört NICHT mehr dazu
VORHER – farbig: der Bereich, auf den der Operator wirkt
1const summe = berechne(preis, menge) * 1.19;
2if (summe > 100) {
3 rabatt = "zehn Prozent";
4 log("<b>Rabatt</b> gewährt");
5}
6
7Ein zweiter Absatz: Wörter, Satzzeichen und WORTE.
NACHHER
1const summe = be(preis, menge) * 1.19;
2if (summe > 100) {
3 rabatt = "zehn Prozent";
4 log("<b>Rabatt</b> gewährt");
5}
6
7Ein zweiter Absatz: Wörter, Satzzeichen und WORTE.
Lösche (d) + Bewegung w (exklusiv): „rechne“ (6 Zeichen) gelöscht → Register "" + "-

🔬 Wie Vim die Tasten liest

Register
"a
Text landet in Register "a
Anzahl
3
3 ×
Operator
d
löschen (landet im Register – „ausschneiden“)
Anzahl
2
2 ×
Bewegung / Textobjekt
w
zum Anfang des nächsten Wortes (Wort = Buchstaben/Ziffern/_ oder eine Folge von Satzzeichen)
✔ vollständig – Gesamtanzahl 6

Zwei Anzahlen werden multipliziert: 2d3w = d6w. Register und Anzahl sind optional, das Ziel nicht.

📚 Nachschlagen

Operatoren

dlöschen (landet im Register – „ausschneiden“)
clöschen und in den Einfügemodus wechseln
ykopieren (in ein Register)
>Zeilen um 'shiftwidth' einrücken
<Zeilen um 'shiftwidth' ausrücken
gUin GROSSBUCHSTABEN umwandeln
guin kleinbuchstaben umwandeln
g~Groß- und Kleinschreibung umkehren

Operator doppelt = ganze Zeile: dd cc yy >> gUU

Bewegungen

Zeichen & Zeilen
hein Zeichen nach linksexklusiv
lein Zeichen nach rechtsexklusiv
jeine Zeile nach untenzeilenweise
keine Zeile nach obenzeilenweise
Wörter
wzum Anfang des nächsten Wortes (Wort = Buchstaben/Ziffern/_ oder eine Folge von Satzzeichen)exklusiv
Wzum Anfang des nächsten WORTES (WORT = alles bis zum nächsten Leerraum)exklusiv
ezum Ende des (nächsten) Wortesinklusiv
Ezum Ende des (nächsten) WORTESinklusiv
bzum Anfang des (vorigen) Wortesexklusiv
Bzum Anfang des (vorigen) WORTESexklusiv
gezum Ende des vorigen Wortesinklusiv
Zeile
0zur ersten Spalte der Zeileexklusiv
^zum ersten Nicht-Leerzeichen der Zeileexklusiv
$zum letzten Zeichen der Zeile (mit Anzahl: n-1 Zeilen weiter)inklusiv
ff{z}: vorwärts auf das nächste Zeichen z in der Zeileinklusiv
tt{z}: vorwärts bis direkt vor das nächste zinklusiv
FF{z}: rückwärts auf das vorige zexklusiv
TT{z}: rückwärts bis direkt hinter das vorige zexklusiv
;letztes f/F/t/T in gleicher Richtung wiederholeninklusiv
,letztes f/F/t/T in Gegenrichtung wiederholenexklusiv
Datei & Absatz
ggzur ersten Zeile (mit Anzahl: zu Zeile n)zeilenweise
Gzur letzten Zeile (mit Anzahl: zu Zeile n)zeilenweise
}zur nächsten Leerzeileexklusiv
{zur vorigen Leerzeileexklusiv
Suchen & Springen
%zur passenden Klammer ( ) [ ] { } (sucht ab Cursor die erste Klammer der Zeile)inklusiv
//muster⏎ – zum nächsten Trefferexklusiv
??muster⏎ – zum vorigen Trefferexklusiv
nletzte Suche wiederholenexklusiv
Nletzte Suche in Gegenrichtungexklusiv
*nächstes Vorkommen des Wortes unter dem Cursorexklusiv
#voriges Vorkommen des Wortes unter dem Cursorexklusiv

Textobjekte

Objekti… (inner)a… (around)
Wortnur das WortWort + folgender Leerraum (sonst vorangehender)
WORTnur das WORT (bis Leerraum)WORT + Leerraum
Absatzdie Zeilen des AbsatzesAbsatz + folgende Leerzeilen
"…"Text zwischen den Anführungszeicheninkl. Anführungszeichen + Leerraum
'…'Text zwischen den Hochkommasinkl. Hochkommas + Leerraum
(…) – auch bInhalt der runden Klammerinkl. Klammern
[…]Inhalt der eckigen Klammerinkl. Klammern
{…} – auch BInhalt des Blocksinkl. geschweifter Klammern
<…>Inhalt der spitzen Klammerinkl. < >
<tag>…</tag>Inhalt zwischen den Tagsinkl. öffnendem und schließendem Tag

Textobjekte gibt es nur nach einem Operator oder im Visual-Modus – sie sind keine Bewegungen. Der Cursor darf irgendwo im Objekt stehen. LazyVim erweitert sie mit mini.ai (z. B. af Funktion,ac Klasse, ao Block).

exklusiv, inklusiv, zeilenweise – der feine Unterschied

Text:    foo bar baz        Cursor auf f (Spalte 1)

dw       [foo ]bar baz      w ist exklusiv: bis VOR den Anfang von „bar“ → "bar baz"
de       [foo] bar baz      e ist inklusiv: bis EINSCHLIESSLICH „o“        → " bar baz"
d$       [foo bar baz]      $ ist inklusiv                                   → ""
dj       ganze Zeilen       j ist zeilenweise: aktuelle + nächste Zeile weg

Sonderregel (:help exclusive): Endet eine exklusive Bewegung in Spalte 1 einer späteren Zeile,
wird das Ende an das Ende der Zeile davor verschoben – beginnt sie vor dem ersten Zeichen der
Zeile, wird der Befehl sogar zeilenweise. Darum löscht di{ die Innenzeilen eines Blocks komplett.