vi verstehen
Ein vollständiges Nachschlagewerk zum Editieren von Textdateien mit vi und vim:
Navigation, Modi, Einfügen, Ändern, Löschen, Kopieren, Suchen und Ersetzen — plus alles, was für
die LPIC-1-Prüfung zu diesem Lernziel relevant ist.
Warum vi?
Auf praktisch jedem Linux- und Unix-System ist vi vorinstalliert — selbst auf
minimalen Servern ohne grafische Oberfläche. Wer als Administrator arbeitet, kommt früher oder
später an einem Punkt, an dem kein anderer Editor zur Verfügung steht. Deshalb verlangt die
LPIC-1-Prüfung nicht nur oberflächliche Kenntnisse, sondern echte Bediensicherheit: Navigation,
Moduswechsel und die wichtigsten Bearbeitungsbefehle sollten aus dem Effeff sitzen.
→vi vs. vim
vi ("visual editor") stammt aus den 1970er-Jahren und wurde ursprünglich von
Bill Joy für BSD Unix entwickelt. vim ("vi improved") ist eine spätere,
quelloffene Weiterentwicklung mit Syntax-Highlighting, mehreren Undo-Stufen, Skriptfähigkeit
und vielem mehr. Auf den meisten modernen Linux-Distributionen ist der Befehl vi
in Wirklichkeit ein Alias oder Symlink auf vim. Für die Prüfung gilt: Alle
klassischen vi-Befehle funktionieren auch in vim identisch.
→Warum keine Maus?
vi ist ein reiner Terminal-Editor und komplett tastaturgesteuert. Das wirkt am
Anfang ungewohnt, erlaubt aber nach etwas Übung ein sehr schnelles Editieren, ohne die Hände
von der Tastatur nehmen zu müssen. Genau dieses Bedienkonzept — kurze, kombinierbare
Tastenkommandos im Kommandomodus — ist der Kern dessen, was die Prüfung abfragt.
vimtutor
mit (siehe Abschnitt 12). Ein Durchlauf dauert etwa 30 Minuten und festigt die hier beschriebenen
Befehle deutlich besser als reines Auswendiglernen.
vi starten und Dateien öffnen
vi lässt sich mit oder ohne Dateiangabe aufrufen, und es können auch mehrere Dateien gleichzeitig geöffnet werden.
Wurden mehrere Dateien angegeben, befindet man sich zunächst in der ersten. Zum Wechseln zwischen den geöffneten Dateien dienen zwei Ex-Kommandos:
| Befehl | Wirkung |
|---|---|
| :n | wechselt zur nächsten Datei in der Argumentliste |
| :N | wechselt zur vorherigen Datei in der Argumentliste |
:w schlägt jedoch fehl. In diesem Fall
hilft nur ein erneuter Aufruf mit ausreichenden Rechten (z. B. über sudo vi datei).
Die vi-Modi verstehen
Der zentrale Unterschied zu den meisten grafischen Editoren: vi kennt mehrere Modi, und dieselbe Taste bedeutet in jedem Modus etwas anderes. Ein Missverständnis darüber ist die häufigste Fehlerquelle für Einsteiger.
Kommandomodus
Der Startzustand von vi. Tastendrücke werden als Befehle interpretiert: Navigation, Löschen, Kopieren, Moduswechsel.
Einfügemodus
Eingetippte Zeichen werden direkt als Text in die Datei geschrieben — wie in einem gewöhnlichen Editor.
Kommandozeilenmodus
Für komplexere Aktionen wie Speichern, Beenden, Suchen&Ersetzen oder Shell-Aufrufe. Erkennbar am Doppelpunkt in der letzten Zeile.
Visueller Modus (vim)
Eine Erweiterung von vim (nicht im klassischen vi): markiert Textbereiche, auf die anschließend ein Befehl angewendet wird.
→Der Grundzyklus
In der Praxis bewegt man sich fast immer im selben Kreislauf: im Normal-Modus navigieren, mit i/a/o in den Insert-Modus wechseln, Text eintippen, mit Esc zurück in den Normal-Modus, und bei Bedarf mit : ein Ex-Kommando absetzen. Dieser Wechsel ist der Kern der vi-Bedienung.
In den Einfügemodus wechseln
Sechs Tasten führen aus dem Normal-Modus in den Insert-Modus — sie unterscheiden sich darin, wo relativ zur Cursorposition der neue Text beginnt.
| Taste | Startet Einfügen … |
|---|---|
| i | vor dem Zeichen unter dem Cursor (insert) |
| a | nach dem Zeichen unter dem Cursor (append) |
| I | am Anfang der aktuellen Zeile (vor dem ersten Nicht-Leerzeichen) |
| A | am Ende der aktuellen Zeile |
| o | öffnet eine neue Zeile unterhalb der aktuellen und wechselt dorthin |
| O | öffnet eine neue Zeile oberhalb der aktuellen und wechselt dorthin |
i, a, o) beziehen sich auf
die Cursorposition, Großbuchstaben (I, A, O) auf die
gesamte Zeile — jeweils Anfang bzw. Ende.
Um den Einfügemodus wieder zu verlassen und in den Normal-Modus zurückzukehren, dient ausschließlich eine Taste:
| Taste | Wirkung |
|---|---|
| Esc | verlässt den Insert-Modus, zurück in den Normal-Modus |
Löschen, Ändern, Kopieren und Einfügen
Diese Befehle folgen einem gemeinsamen Muster: ein Operator (löschen, ändern, kopieren) gefolgt von einer Bewegung (Wort, Zeilenende, ganze Zeile), die festlegt, wie viel Text betroffen ist.
→Löschen (delete)
| Befehl | Wirkung |
|---|---|
| x | löscht das Zeichen unter dem Cursor |
| X | löscht das Zeichen links vom Cursor |
| dw | löscht vom Cursor bis zum nächsten Wortanfang |
| d0 | löscht vom Zeilenanfang bis vor den Cursor |
| d$ bzw. D | löscht vom Cursor bis zum Zeilenende |
| dd | löscht die gesamte aktuelle Zeile |
→Ändern (change) — löschen + Insert-Modus
Die c-Befehle sind das Gegenstück zu den d-Befehlen: Sie löschen den betroffenen Text und wechseln direkt in den Insert-Modus, damit sofort Ersatztext eingetippt werden kann.
| Befehl | Wirkung |
|---|---|
| cc | löscht die aktuelle Zeile und wechselt in den Insert-Modus |
| C | löscht bis zum Zeilenende und wechselt in den Insert-Modus |
| cw | löscht das aktuelle Wort und wechselt in den Insert-Modus |
| r | ersetzt genau ein Zeichen (bleibt im Normal-Modus) |
→Kopieren (yank) und Einfügen (put)
| Befehl | Wirkung |
|---|---|
| yy | kopiert die aktuelle Zeile in die Zwischenablage (yank) |
| yw | kopiert das aktuelle Wort |
| p | fügt den Inhalt der Zwischenablage nach dem Cursor bzw. unter der Zeile ein (put) |
| P | fügt den Inhalt der Zwischenablage vor dem Cursor bzw. über der Zeile ein |
dd und die anderen Löschbefehle legen den gelöschten Text in
derselben Zwischenablage ab. Ein dd gefolgt von p verschiebt damit eine
Zeile effektiv um eine Position nach unten — ein sehr gebräuchliches Muster.
→Rückgängig machen und Wiederholen
| Befehl | Wirkung |
|---|---|
| u | macht die letzte Änderung rückgängig (undo) |
| Strg-r | stellt eine rückgängig gemachte Änderung wieder her (redo, vim-Erweiterung) |
| . | wiederholt den letzten Änderungsbefehl |
→Zähler kombinieren
Wie bei der Navigation lassen sich auch Bearbeitungsbefehle mit einer vorangestellten Zahl vervielfachen:
Suchen und Ersetzen
→Suchen im Text
| Befehl | Wirkung |
|---|---|
| /muster | sucht vorwärts nach "muster" (regulärer Ausdruck möglich) |
| ?muster | sucht rückwärts nach "muster" |
| n | wiederholt die letzte Suche in derselben Richtung |
| N | wiederholt die letzte Suche in umgekehrter Richtung |
Ist die Option wrapscan aktiv (Standardeinstellung), springt die Suche am Dateiende wieder an den Anfang, statt dort abzubrechen.
→Suchen und Ersetzen (Ex-Kommando :s)
Das Ersetzen erfolgt nicht im Normal-Modus, sondern über den Kommandozeilenmodus mit dem Befehl :s (substitute) nach dem Muster :[Bereich]s/Suchmuster/Ersatz/[Flags].
| Befehl | Wirkung |
|---|---|
| :s/alt/neu/ | ersetzt das erste Vorkommen von "alt" in der aktuellen Zeile |
| :s/alt/neu/g | ersetzt alle Vorkommen in der aktuellen Zeile (global) |
| :1,$s/alt/neu/g | ersetzt in allen Zeilen der Datei (Zeile 1 bis Dateiende) |
| :%s/alt/neu/g | gleichbedeutend mit :1,$ — die ganze Datei |
| :4,7s/alt/neu/g | ersetzt nur innerhalb der Zeilen 4 bis 7 |
| :s/alt/neu/gc | wie g, fragt aber vor jedem Ersetzen um Bestätigung (confirm) |
Speichern und Beenden
Diese Befehle sind ausschließlich im Normal- bzw. Kommandozeilenmodus verfügbar — ein häufiger Prüfungsfehler ist, sie im Insert-Modus einzutippen, wo sie lediglich als Text erscheinen.
| Befehl | Wirkung |
|---|---|
| :w | speichert die Datei, ohne vi zu verlassen |
| :w dateiname | speichert unter einem anderen Dateinamen (Speichern unter) |
| :w! | erzwingt das Speichern, z. B. bei schreibgeschützten Dateien mit passenden Rechten |
| :q | beendet vi — nur möglich, wenn keine ungespeicherten Änderungen bestehen |
| :q! | beendet vi ohne zu speichern, verwirft alle Änderungen |
| :wq | speichert und beendet in einem Schritt |
| :x | speichert und beendet, aber nur, falls tatsächlich Änderungen vorliegen |
| ZZ | Kurzform (Normal-Modus, kein Doppelpunkt) für "speichern und beenden", entspricht :x |
:q ohne Ausrufezeichen verweigert das Beenden,
solange ungespeicherte Änderungen bestehen und meldet einen Fehler. Erst :q! erzwingt
den Abbruch ohne Speichern. In der Prüfung wird dieser Unterschied gern gezielt abgefragt.
Weitere Ex-Kommandos
Neben Speichern, Beenden und Suchen&Ersetzen bietet der Kommandozeilenmodus einige weitere praktische Funktionen.
| Befehl | Wirkung |
|---|---|
| :r datei | liest den Inhalt einer anderen Datei ein und fügt ihn unterhalb der Cursorzeile ein (read) |
| :e datei | lädt eine andere Datei zur Bearbeitung nach (edit) |
| :e! datei | wie :e, verwirft dabei aber ungespeicherte Änderungen der aktuellen Datei |
| :!kommando | führt ein beliebiges Shell-Kommando aus, ohne vi zu verlassen |
Editor-Optionen und .vimrc
Mit :set lassen sich zahlreiche Anzeige- und Verhaltensoptionen des Editors steuern — sowohl einmalig innerhalb einer Sitzung als auch dauerhaft über eine Konfigurationsdatei.
| Befehl | Wirkung |
|---|---|
| :set option | aktiviert eine Option, z. B. :set number |
| :set noopption | deaktiviert eine Option, z. B. :set nonumber |
| :set option? | zeigt den aktuellen Status einer Option an |
| :set all | listet alle verfügbaren Optionen mit ihrem aktuellen Wert |
→Gebräuchliche Optionen
→Dauerhafte Konfiguration in ~/.vimrc
Damit Optionen nicht bei jedem Start neu gesetzt werden müssen, trägt man sie in die persönliche Konfigurationsdatei ~/.vimrc ein.
Beim nächsten Start liest vim diese Datei automatisch ein und wendet die enthaltenen Einstellungen an.
Aufrufoptionen auf der Befehlszeile
vi kann bereits beim Start angewiesen werden, den Cursor an eine bestimmte Stelle zu setzen.
| Aufruf | Wirkung |
|---|---|
| vi datei +65 | öffnet die Datei und positioniert den Cursor direkt in Zeile 65 |
| vi datei + | öffnet die Datei mit dem Cursor in der letzten Zeile |
| vi datei +/muster | öffnet die Datei und springt direkt zum ersten Vorkommen von "muster" |
Andere Editoren und der Standardeditor
Für die Prüfung genügt es, die gebräuchlichsten Alternativen zu vi dem Namen nach zu kennen und zu wissen, wie sich der systemweite bzw. persönliche Standardeditor festlegen lässt.
→nano
Ein sehr einsteigerfreundlicher Terminal-Editor ohne Modi — Tastenkürzel werden permanent am unteren Bildschirmrand angezeigt. Beliebt als Standard bei Neulingen, aber weniger effizient in der Bedienung als vi.
→Emacs
Ein sehr mächtiger, erweiterbarer Editor (und teils eigenes Ökosystem) mit einer eigenen Philosophie der Tastenkombinationen, die auf Strg- und Alt-Kombinationen statt auf Modi setzt.
→Systemweiten Standardeditor festlegen (Debian-basiert)
→Persönlichen Standardeditor per Umgebungsvariable setzen
Viele Programme (z. B. crontab -e oder visudo) richten sich nach der Umgebungsvariable EDITOR. Sie lässt sich dauerhaft in der Shell-Konfigurationsdatei ~/.bashrc setzen:
Der export-Befehl macht die Variable auch für Kindprozesse (z. B. aufgerufene Programme) sichtbar — ohne ihn würde EDITOR nur in der aktuellen Shell gelten.
Übungen
Die folgenden Aufgaben eignen sich zum Nachvollziehen in einem echten Terminal. Lösungen einblenden erst, nachdem selbst ein Versuch unternommen wurde.
Aufgabe 1 — Testdatei anlegen und gezielt öffnen Einstieg
Aufgabe 2 — Navigation und Zähler Navigation
Aufgabe 3 — Zeilen löschen und wieder einfügen Bearbeiten
Aufgabe 4 — Global ersetzen mit Bestätigung Suchen & Ersetzen
Aufgabe 5 — vimtutor Vertiefung
Cheat-Sheet: alle Befehle auf einen Blick
Kompakte Referenz der in diesem Tutorial behandelten Befehle, gruppiert nach Themenbereich.