Vor jeder Motion und vor fast jedem Operator kann eine Zahl stehen — und sie multipliziert die Aktion. Aus j wird 5j (fünf Zeilen runter), aus dd wird 10dd (zehn Zeilen löschen), aus cw wird 3cw (drei Wörter ändern). Das ist eines der einfachsten Vim-Konzepte und gleichzeitig eines der am meisten unterschätzten: Wer Counts beherrscht, ersetzt Wiederholtes Tasten-Drücken durch präzise Zahlen-Eingabe und beschleunigt nahezu jede Edit-Operation. Dieser Artikel erklärt, wie Counts wirken, wo sie multiplikativ kombiniert werden, wie sie im Insert-Mode funktionieren — und welche Stellen Vim hat, an denen Counts überraschen oder ganz anders gemeint sind.

Das Grundprinzip

Eine Zahl vor einem Vim-Befehl wirkt als Multiplikator. Das gilt für:

  • Motions: 5j = fünf Zeilen nach unten, 10w = zehn Wörter vorwärts, 3f" = das dritte " nach Cursor finden.
  • Operatoren: 3dd = drei Zeilen löschen, 5yy = fünf Zeilen kopieren, 2cc = zwei Zeilen ändern.
  • Einzel-Befehle: 3x = drei Zeichen löschen, 5p = den Register-Inhalt fünfmal einfügen, 4>> = vier Zeilen einrücken.
  • Modus-Eintritte: 5o = neue Zeile einfügen, dann den getippten Text fünfmal einfügen (siehe Insert-Counts unten).

Vim sammelt während der Eingabe Ziffern, bis ein Nicht-Ziffer-Befehl folgt. Drückt man 5 im Normal-Mode, passiert sichtbar nichts — der Status zeigt unten rechts oft die gepufferte Zahl an. Erst der nächste Befehls-Buchstabe löst die Aktion aus.

text Counts ohne Geheimnisse
5j               " fünf Zeilen nach unten
12k              " zwölf Zeilen nach oben
3dd              " drei Zeilen löschen
10x              " zehn Zeichen ab Cursor löschen
100yy            " hundert Zeilen kopieren

Wichtig: die Zahl 0 ist kein Count-Eintritt. 0 ist die Motion „springe zum Zeilenanfang". Vim weiß, dass ein Count nicht mit 0 beginnen kann, und behandelt das einzelne 0 deshalb als eigenständige Motion. 40j funktioniert (vier-null-j), aber 04j ist 0 (Zeilenanfang) gefolgt von 4j (vier Zeilen runter) — also eine ganz andere Operation.

Counts auf Operator-Motion-Kombis

Wenn Count und Operator und Motion zusammenkommen, kann die Zahl an zwei Stellen stehen — und das Ergebnis ist multiplikativ:

TastenfolgeWirkung
dwein Wort löschen
3dwdrei Wörter löschen (Count vor Operator)
d3wdrei Wörter löschen (Count vor Motion) — funktional identisch
3d2wsechs Wörter löschen (3 × 2)
5y3lfünfzehn Zeichen kopieren (5 × 3)
2c5jsechs Zeilen ändern (5 + 1 für Startzeile, × 2 ... eigentlich nicht — siehe unten)

Die Multiplikation funktioniert für die meisten Operator-Motion-Kombis. Bei linewise-Motions wie j/k ist sie aber subtiler: 5j als Motion erfasst die aktuelle Zeile und die fünf darunter — sechs Zeilen insgesamt. 2c5j wäre dann zwölf Zeilen. Wer in einer Mass-Edit-Operation die Zahl genau treffen will, sollte beim ersten Mal in der Praxis testen.

Im Alltag ist die Position des Counts Geschmacksache. 3dw und d3w produzieren das gleiche Ergebnis. Die Variante mit Count vor dem Operator (3dw) liest sich oft natürlicher („dreimal lösche ein Wort"), die mit Count vor der Motion (d3w) liest sich strukturell wie ein Befehl mit Argument („lösche bis zum dritten Wort").

Spezielle Counts

Einige Vim-Befehle interpretieren ihre Counts auf nicht-multiplikative Weise. Die wichtigsten:

Befehl mit CountBedeutung — nicht intuitiv
5Gspringe zu Zeile 5 (nicht „5 mal G")
50%springe zu 50 % des Buffers
5ggspringe zu Zeile 5 (analog 5G)
3H / 3Ldritte Zeile vom Top / Bottom des sichtbaren Fensters
5/foo<CR>das fünfte Vorkommen von foo (nicht: fünfmal suchen)
:5,15dRange im Command-Line — kein Count, sondern Zeilenbereich

G ist die häufigste Verwechslungs-Quelle: viele Anfänger lesen 5G als „fünfmal G", erwarten also fünf Sprünge zum Buffer-Ende — was sinnlos wäre, weil Buffer-Ende bei einem Mal erreicht ist. Vim interpretiert das tatsächlich als „springe zu Zeile 5". Eine kleine Falle für die Übergangsphase.

Auch % als Motion (springe zum passenden Klammer-Paar) hat Sonder-Verhalten mit Count: 50% ist nicht „fünfzigmal zur passenden Klammer", sondern „springe zu 50 % der Datei". Logisch, sobald man die Sonderbedeutung kennt — überraschend, wenn man sie zum ersten Mal sieht.

Counts im Insert-Mode

Eine der eleganteren Vim-Funktionen: Counts gelten auch beim Eintritt in den Insert-Mode. Was man im Insert tippt, wird beim Drücken von Esc entsprechend dem Count multipliziert.

text Insert-Counts in Aktion
" Aufgabe: ein Trenner aus 50 Bindestrichen
50i-<Esc>          " "i" mit Count 50, "-" tippen, Esc — 50 mal "-" eingefügt

" Aufgabe: eine Tab-Einrückung 8-fach
8i<Tab><Esc>       " 8 Tabs

" Aufgabe: eine Zeile mit 10 leeren Plätzen anlegen
10i <Esc>          " 10 Leerzeichen

" Aufgabe: drei identische Code-Zeilen darunter erzeugen
3oconsole.log("X");<Esc>   " drei neue Zeilen, jeweils mit dem Code

Wichtig dabei: die Multiplikation wirkt erst beim Drücken von Esc. Solange du im Insert-Mode tippst, siehst du nur eine Kopie. Esc löst die Vervielfachung aus. Das ist ein wiederkehrendes Vim-Pattern (siehe auch Visual-Block-Insert) — und es irritiert manche Anfänger, die das Verhalten beim Tippen erwarten.

Die Funktion ist ein eingebauter Trenner- und Boilerplate-Generator. Statt 50 Tasten für 50 Bindestriche reichen vier (50i-<Esc>). Statt zehnmal eine Zeile zu kopieren mit yy10p kann man sie auch zehnmal direkt erzeugen mit 10oContent<Esc>.

Counts auf Such- und Replace-Operationen

Counts wirken auch auf Such-Motions und sind dort wenig bekannt:

text Counts auf Suche
/foo<CR>           " erste Stelle "foo" finden
3n                 " drei Vorkommen weiter — viel schneller als 3x n drücken

" Mit Count direkt beim Suchen:
3/foo<CR>          " direkt zum DRITTEN Vorkommen springen

Bei :substitute gibt es keinen Count im klassischen Sinn, aber ein verwandtes Konzept: der Range entscheidet, wie weit die Ersetzung wirkt:

text Substitute mit Range
:.,+5s/foo/bar/g    " ersetze in der aktuellen Zeile und den nächsten 5
:,+10s/foo/bar/g    " kürzer geschrieben (",." als Default)
:5,15s/foo/bar/g    " in den Zeilen 5 bis 15

Der ,+N-Range ist eine kleine Bequemlichkeit — er erlaubt „die nächsten N Zeilen" ohne absolute Zeilennummern.

Counts auf <C-a> und <C-x> — Zahlen erhöhen

Eine spezielle Verwendung: <C-a> und <C-x> erhöhen/erniedrigen die Zahl unter (oder rechts vom) Cursor. Mit Count lässt sich die Schrittweite einstellen:

text Zahlen-Inkrement mit Count
" Cursor steht auf der "5" in "var x = 5"
<C-a>              " x = 6 (Standard-Schritt = 1)
5<C-a>             " x = 11 (5 erhöhen)
100<C-a>           " x = 111

" Im Visual-Block-Mode mit g<C-a> entstehen aufsteigende Zahlen pro Zeile.
" Siehe auch den Visual-Mode-Artikel.

Mit set nrformats+=alpha werden zusätzlich Buchstaben inkrementiert — <C-a> auf einem a macht b. Praktisch für Listen-Punkte oder Spalten-Labels.

Praktische Anwendungen — wann ein Count Zeit spart

Counts sind nicht für jeden Edit sinnvoll. Wer die Zahl erst zählen müsste, ist mit .-Repeat oft schneller. Wer aber die Anzahl schon kennt oder schätzen kann, hat mit Counts den direktesten Weg:

AufgabeMit CountAlternative
Zehn Zeilen nach unten springen10j}} (Absatz-Sprünge)
Zwanzig Leerzeichen einfügen20i <Esc>c-w + Zeichen-für-Zeichen
Eine ASCII-Trenn-Linie80i-<Esc>Plugin oder Manual
Drei Wörter löschen3dw oder d3wdw.dw (= 3 × dw)
Bis zum dritten Komma löschend3f,dt,dt,dt, (umständlich)
Fünf Mal denselben Edit wiederholen5. (5x dot-repeat)manuelles Wiederholen
Direkt zu Zeile 42 springen42G oder :42mit /pattern suchen

Die letzte Spalte zeigt den Punkt: Counts ersetzen nicht alle Wiederholungen — bei unklarer Anzahl ist .-Repeat (siehe nächster Artikel) der robustere Weg. Bei klarer Anzahl sind Counts der direkteste.

Besonderheiten

`0` ist eine Motion, kein Count-Start

40j ist „vierzig j", 04j ist „erst zum Zeilenanfang, dann vier j" — zwei völlig verschiedene Operationen. Vim erkennt, dass ein Count nie mit Null beginnen kann, und behandelt das einzelne 0 immer als Zeilenanfangs-Motion.

Counts werden in `.`-Repeat mitgespeichert

Wer 3dw ausführt und dann . drückt, wiederholt inklusive dem Count — also nochmal drei Wörter löschen, nicht eines. Wer den Count weglassen will, drückt vor dem . einen neuen Count: 1. führt den letzten Edit mit Count 1 aus.

Bei `j`/`k` zählt der Count Zeilen, nicht logische Sprünge

5j ist genau fünf Zeilen weiter — auch wenn dazwischen Wrap-Lines oder Folds liegen. Wer in visueller (wrap-aware) Zählung navigieren will, nutzt gj/gk mit Counts: 5gj ist fünf visuelle Zeilen.

Counts im Insert wirken erst beim Esc

Während 50i- tippt man nur einen einzigen Bindestrich. Erst Esc multipliziert. Vim zeigt während der Eingabe nicht live, was am Ende rauskommt — das ist Absicht: solange die Eingabe läuft, kann man sie korrigieren. Erst der Esc commit-et die Multiplikation.

Sehr große Counts sind nicht ungesund

1000j springt nicht „in 1000 Schritten", sondern direkt. Vim optimiert die Motion — wenn Zeile 1000 darunter nicht existiert, springt es zum Buffer-Ende. Bei Operationen wie 1000dd wird ein potenziell sehr großer Block gelöscht, aber Vim macht das in einem einzigen Undo-Schritt rückgängig.

`v` und `V` ignorieren Counts beim Eintritt

Wer 5v drückt, kommt nicht „fünfmal" in den Visual-Mode (was sinnlos wäre), sondern direkt. Der Count vor v/V/<C-v> wird ignoriert. Counts auf der Visual-Selektion wirken über Motions innerhalb der Selektion: v5j markiert sechs Zeilen.

Weiterführende Ressourcen

Externe Quellen

Verwandte Artikel

/ Weiter

Zurück zu Modi

Zur Übersicht