Zum Hauptinhalt springen
  1. Blog/

VIM Grundlagen: Bewegen, Suchen und Editieren im Terminal

·1111 Wörter·6 min
Michael Bäcker (aka BakermanLP)
Autor
Michael Bäcker (aka BakermanLP)
Ich bin Baujahr 1972, lebe in Schwabach und spiele für mein Leben gerne mit Computern und Freunden.

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:

  • dw löscht bis zum nächsten Wortanfang, 2dw löscht zwei Worte
  • dW löscht bis zur nächsten Leerstelle, auch über Satzzeichen hinweg
  • D löscht bis zum Zeilenende (Kurzform für d$)
  • 3dd löscht drei ganze Zeilen
  • 3yy kopiert 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,.d

Lö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 #