Vi, beziehungsweise vim, mag kaum jemand auf Anhieb. Kein Rechtsklick-Menü, keine Icons, und wer unvorbereitet reinstolpert (zum Beispiel über crontab -e), tippt sich erstmal minutenlang durch scheinbar wirkungslose Tastendrücke, bevor er den Editor wieder verlässt. Trotzdem läuft er auf praktisch jedem Unix-artigen System vorinstalliert mit, von Linux über macOS bis HP-UX. Wer sich einmal eingearbeitet hat, hat ein Werkzeug, das überall funktioniert, auch ohne IDE oder Internetverbindung.
Ich nutze vi seit über 20 Jahren und behaupte trotzdem nicht, mehr als einen Bruchteil seiner Fähigkeiten zu kennen. Im Video geht es um die Kommandos, die im Alltag tatsächlich zum Einsatz kommen: bewegen, suchen, editieren, kopieren, ein bisschen Text-Ersetzung. Hier die schriftliche Fassung zum Nachschlagen, ergänzt um ein paar Kommandos, die im Video keinen Platz mehr hatten.
Navigationsmodus und Eingabemodus #
Öffnet man eine Datei mit vi datei.txt, landet man im Navigationsmodus (manche nennen ihn auch Normal- oder Kommandomodus). Hier bewegt man sich nur, geschrieben wird noch nichts. Erst eines der folgenden Kommandos wechselt in den Eingabemodus:
| Taste | Wirkung |
|---|---|
i |
Einfügen vor dem Cursor |
a |
Einfügen nach dem Cursor (append) |
o |
Neue Zeile unter der aktuellen öffnen |
O |
Neue Zeile über der aktuellen öffnen |
Zurück in den Navigationsmodus kommt man mit Esc. Das ist der Reflex, den man sich als Erstes angewöhnen sollte, denn praktisch jedes andere Kommando setzt den Navigationsmodus voraus.
Bewegen im Text #
Die Cursor-Tasten funktionieren ganz normal, die eigentliche Geschwindigkeit kommt aber über die Tastatur ohne Cursor-Tasten:
| Taste | Wirkung |
|---|---|
h j k l |
Links, runter, hoch, rechts |
w |
Zum nächsten Wortanfang |
W |
Zum nächsten Wortanfang, überspringt dabei auch Satzzeichen |
b |
Zum vorherigen Wortanfang (backwards) |
e |
Zum Ende des aktuellen/nächsten Worts |
0 |
Zeilenanfang |
^ |
Erstes Zeichen nach führenden Leerzeichen |
$ |
Zeilenende |
gg |
Zum Dateianfang |
G |
Zum Dateiende |
:1 / :$ |
Erste/letzte Zeile (Kurzform für gg/G) |
:{Zahl} oder {Zahl}G |
Zu einer bestimmten Zeile springen |
Der Unterschied zwischen w und W fällt vor allem bei Code oder Interpunktion auf. w bleibt an Satzzeichen und Sonderzeichen hängen, W springt bis zur nächsten Leerstelle durch.
Eine Bewegung, die ich andauernd nutze: Das Prozentzeichen % springt zur passenden Klammer, von der öffnenden zur schließenden und zurück. Funktioniert bei (), [] und {}, nur bei spitzen Klammern nicht.
Suchen #
Der Schrägstrich / öffnet die Suche nach unten, ? die Suche nach oben. Enter bestätigt, und ab da:
| Taste | Wirkung |
|---|---|
n |
Nächster Treffer (in Suchrichtung) |
N |
Vorheriger Treffer |
* |
Nächstes Vorkommen des Worts unter dem Cursor |
# |
Vorheriges Vorkommen des Worts unter dem Cursor |
* und # werden unterschätzt: Cursor auf ein Wort stellen, * drücken, und man springt direkt zum nächsten Vorkommen, ohne das Wort selbst tippen zu müssen.
Speichern und Beenden #
Zu vi gehört der Witz, dass man nicht mehr herauskommt, wenn man einmal drin ist. In der Praxis reichen meistens zwei Escape-Tasten gefolgt von :q - das verlässt jeden Modus und landet zurück im Navigationsmodus.
| Kommando | Wirkung |
|---|---|
:q |
Beenden (nur ohne ungespeicherte Änderungen) |
:q! |
Beenden ohne zu speichern, Änderungen verwerfen |
:w |
Speichern |
:wq oder :x |
Speichern und beenden |
ZZ |
Speichern und beenden (Kurzform im Navigationsmodus) |
:cq |
Beenden mit Fehlercode, praktisch um etwa einen Git-Commit gezielt abzubrechen |
Zeilen editieren #
| Kommando | Wirkung |
|---|---|
dd |
Zeile löschen |
3dd |
Drei Zeilen löschen (Zahl vor Kommando wiederholt es) |
D |
Ab Cursor bis Zeilenende löschen |
r |
Ein Zeichen ersetzen |
R |
Replace-Modus: überschreibt, bis Esc gedrückt wird |
u |
Letzte Änderung rückgängig |
Strg+r |
Rückgängig gemachte Änderung wiederherstellen |
Die Zahl-vor-Kommando-Logik zieht sich durch fast alle Editier-Befehle, nicht nur durch dd.
Kopieren und Einfügen #
| Kommando | Wirkung |
|---|---|
yy |
Zeile kopieren (yank) |
3yy |
Drei Zeilen kopieren |
p |
Nach der aktuellen Zeile einfügen |
P |
Vor der aktuellen Zeile einfügen |
"+y / "+p |
In/aus der Systemzwischenablage kopieren |
"+y und "+p fehlen im Video, sind aber praktisch, sobald Text zwischen vi und einer anderen Anwendung wechseln soll, vorausgesetzt vi wurde mit Clipboard-Unterstützung gebaut (vim --version | grep clipboard verrät das).
Operatoren und Modifikatoren kombinieren #
Vi wird vor allem deshalb interessant, weil sich Operator, Zahl und Bewegung kombinieren lassen. Das Muster ist immer dasselbe: [Zahl] Operator Bewegung.
| Operator | Bedeutung |
|---|---|
d |
Löschen (delete) |
y |
Kopieren (yank) |
c |
Ändern, löscht und wechselt direkt in den Eingabemodus |
> / < |
Einrücken rechts/links |
Ein paar Beispiele, wie sich das zusammensetzt:
dwlöscht bis zum nächsten Wortanfang,2dwlöscht zwei WortedWlöscht bis zur nächsten Leerstelle, auch über Satzzeichen hinwegDlöscht bis zum Zeilenende (Kurzform fürd$)3ddlöscht drei ganze Zeilen3yykopiert drei Zeilen
Dieselbe Logik funktioniert im Visual Mode (v für zeichenweise, V für zeilenweise, Strg+v für spaltenweise Auswahl): Text markieren, dann d, y oder > anwenden. Praktisch beim Ein- oder Ausrücken von Code-Blöcken: Bereich markieren, > drücken, fertig.
Suchen und Ersetzen #
Für Ersetzungen über eine ganze Datei oder einen Bereich:
:%s/data/work/g% steht für die ganze Datei, s für substitute, data ist der gesuchte Begriff, work der Ersatz. Das g am Ende sorgt dafür, dass auch mehrfache Treffer in derselben Zeile ersetzt werden - ohne g würde nur der erste Treffer pro Zeile ersetzt. Statt % geht auch ein konkreter Bereich, zum Beispiel :5,10s/... für die Zeilen 5 bis 10.
Marken #
Mit m gefolgt von einem Buchstaben setzt man eine Marke an der aktuellen Cursorposition, zum Beispiel ma für Marke a. Zurückspringen geht mit 'a (an den Zeilenanfang der Marke) oder `a (an die exakte Position). Kombiniert mit Operatoren lassen sich damit auch größere, unregelmäßige Bereiche bearbeiten:
:'a,.dLöscht alles von Marke a bis zur aktuellen Zeile. :marks zeigt alle gesetzten Marken, :delm a löscht Marke a wieder.
Ein paar zusätzliche Kommandos #
Kommandos, die im Video nicht vorkamen, im Alltag aber öfter mal reinspielen:
| Kommando | Wirkung |
|---|---|
dip / dap |
Inneren/kompletten Absatz löschen (Text-Objekt) |
ciw |
Wort unter dem Cursor ändern, egal wo im Wort der Cursor steht |
. |
Letztes Kommando wiederholen |
Strg+a / Strg+x |
Zahl unter dem Cursor erhöhen/verringern |
:tabedit datei |
Datei in neuem Tab öffnen |
:set spell spelllang=de |
Rechtschreibprüfung aktivieren |
. wirkt unscheinbar, ist aber eines der nützlichsten Kommandos überhaupt: Jede Änderung, ob Löschen, Einfügen oder Ersetzen, lässt sich mit einem einzigen Tastendruck wiederholen.
Warum sich die Gewöhnung lohnt #
Gewöhnungsbedürftig ist vi ohne Frage, und wer die ersten Stunden damit verbringt, flucht öfter, als er produktiv ist. Sobald die Grundkommandos sitzen, gibt es aber Editier-Operationen, die ich in keinem anderen Editor so schnell hinbekomme, allen voran :%s für Ersetzungen über die ganze Datei und die Kombination aus Operator und Bewegung. Eine IDE ist mir nicht immer verfügbar. Ein vi liegt auf jedem Unix-artigen System bereit, ganz gleich ob Linux, macOS oder ein uraltes HP-UX.
Wer noch tiefer einsteigen will: vimtutor bringt ein interaktives Tutorial direkt mit, und :help key-notation erklärt die Tastenkürzel-Schreibweise aus der offiziellen Dokumentation.
Weiterführende Links #
- vim.org - offizielle Projektseite
- Vim Cheatsheet - kompakte Übersicht aller wichtigen Kommandos