~/lpic-1/103.8/ vi-tutorial.md
0% -- NORMAL --
LPIC-1 · Prüfung 102 · Thema 103.8

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.

3Gewichtung (LPI)
4Modi im Überblick
60+Befehle & Kürzel
1976Erstveröffentlichung von vi
00

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.

Lernstrategie: Am besten lässt sich vi nicht durch Lesen, sondern durch Tippen lernen. Praktisch jede Linux-Distribution bringt das interaktive Trainingsprogramm vimtutor mit (siehe Abschnitt 12). Ein Durchlauf dauert etwa 30 Minuten und festigt die hier beschriebenen Befehle deutlich besser als reines Auswendiglernen.
01

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.

Terminal
vi # öffnet vi ohne Datei, leerer Puffer vi datei.txt # öffnet (oder legt an) datei.txt vi a.txt b.txt c.txt # öffnet drei Dateien nacheinander

Wurden mehrere Dateien angegeben, befindet man sich zunächst in der ersten. Zum Wechseln zwischen den geöffneten Dateien dienen zwei Ex-Kommandos:

BefehlWirkung
:nwechselt zur nächsten Datei in der Argumentliste
:Nwechselt zur vorherigen Datei in der Argumentliste
Hinweis: Wird vi ohne Root-Rechte auf eine schreibgeschützte Datei angewendet, lässt sich die Datei zwar öffnen und lesen, ein Speichern mit :w schlägt jedoch fehl. In diesem Fall hilft nur ein erneuter Aufruf mit ausreichenden Rechten (z. B. über sudo vi datei).
02

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.

NORMAL

Kommandomodus

Der Startzustand von vi. Tastendrücke werden als Befehle interpretiert: Navigation, Löschen, Kopieren, Moduswechsel.

Start: beim Öffnen von vi aktiv
INSERT

Einfügemodus

Eingetippte Zeichen werden direkt als Text in die Datei geschrieben — wie in einem gewöhnlichen Editor.

Erreichen: i a I A o O  ·  Verlassen: Esc
EX / COMMAND-LINE

Kommandozeilenmodus

Für komplexere Aktionen wie Speichern, Beenden, Suchen&Ersetzen oder Shell-Aufrufe. Erkennbar am Doppelpunkt in der letzten Zeile.

Erreichen: : aus dem Normal-Modus
VISUAL

Visueller Modus (vim)

Eine Erweiterung von vim (nicht im klassischen vi): markiert Textbereiche, auf die anschließend ein Befehl angewendet wird.

Erreichen: v (zeichenweise) / V (zeilenweise)

→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.

Modell des Zyklus
NORMAL --i / a / o--> INSERT ^ | |----------Esc-------------| NORMAL ----:--------> EX-KOMMANDO --Enter--> NORMAL
Klassischer Anfängerfehler: Text wird im Normal-Modus getippt, weil man vergessen hat, vorher mit Esc aus dem Insert-Modus zurückzukehren oder eben nicht in ihn zu wechseln. Die Zeichen werden dann als Befehle ausgeführt und die Datei verändert sich auf unerwartete Weise. Im Zweifel hilft immer: mehrfach Esc drücken, um sicher im Normal-Modus zu landen.
04

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.

TasteStartet Einfügen …
ivor dem Zeichen unter dem Cursor (insert)
anach dem Zeichen unter dem Cursor (append)
Iam Anfang der aktuellen Zeile (vor dem ersten Nicht-Leerzeichen)
Aam 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
Merkregel: Kleinbuchstaben (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:

TasteWirkung
Escverlässt den Insert-Modus, zurück in den Normal-Modus
05

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)

BefehlWirkung
xlöscht das Zeichen unter dem Cursor
Xlöscht das Zeichen links vom Cursor
dwlöscht vom Cursor bis zum nächsten Wortanfang
d0löscht vom Zeilenanfang bis vor den Cursor
d$ bzw. Dlöscht vom Cursor bis zum Zeilenende
ddlö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.

BefehlWirkung
cclöscht die aktuelle Zeile und wechselt in den Insert-Modus
Clöscht bis zum Zeilenende und wechselt in den Insert-Modus
cwlöscht das aktuelle Wort und wechselt in den Insert-Modus
rersetzt genau ein Zeichen (bleibt im Normal-Modus)

→Kopieren (yank) und Einfügen (put)

BefehlWirkung
yykopiert die aktuelle Zeile in die Zwischenablage (yank)
ywkopiert das aktuelle Wort
pfügt den Inhalt der Zwischenablage nach dem Cursor bzw. unter der Zeile ein (put)
Pfügt den Inhalt der Zwischenablage vor dem Cursor bzw. über der Zeile ein
Wichtig: Auch 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

BefehlWirkung
umacht die letzte Änderung rückgängig (undo)
Strg-rstellt 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:

5x → löscht 5 Zeichen ab Cursor
7dd → löscht 7 Zeilen ab Cursor
5yy → kopiert 5 Zeilen ab Cursor
3p → fügt den Inhalt 3-mal ein
06

Suchen und Ersetzen

→Suchen im Text

BefehlWirkung
/mustersucht vorwärts nach "muster" (regulärer Ausdruck möglich)
?mustersucht rückwärts nach "muster"
nwiederholt die letzte Suche in derselben Richtung
Nwiederholt 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].

BefehlWirkung
:s/alt/neu/ersetzt das erste Vorkommen von "alt" in der aktuellen Zeile
:s/alt/neu/gersetzt alle Vorkommen in der aktuellen Zeile (global)
:1,$s/alt/neu/gersetzt in allen Zeilen der Datei (Zeile 1 bis Dateiende)
:%s/alt/neu/ggleichbedeutend mit :1,$ — die ganze Datei
:4,7s/alt/neu/gersetzt nur innerhalb der Zeilen 4 bis 7
:s/alt/neu/gcwie g, fragt aber vor jedem Ersetzen um Bestätigung (confirm)
Beispiel
:%s/Fehler/Warnung/gc # fragt bei jedem Treffer in der ganzen Datei nach
07

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.

BefehlWirkung
:wspeichert die Datei, ohne vi zu verlassen
:w dateinamespeichert unter einem anderen Dateinamen (Speichern unter)
:w!erzwingt das Speichern, z. B. bei schreibgeschützten Dateien mit passenden Rechten
:qbeendet vi — nur möglich, wenn keine ungespeicherten Änderungen bestehen
:q!beendet vi ohne zu speichern, verwirft alle Änderungen
:wqspeichert und beendet in einem Schritt
:xspeichert und beendet, aber nur, falls tatsächlich Änderungen vorliegen
ZZKurzform (Normal-Modus, kein Doppelpunkt) für "speichern und beenden", entspricht :x
Achtung, Verwechslungsgefahr: :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.
08

Weitere Ex-Kommandos

Neben Speichern, Beenden und Suchen&Ersetzen bietet der Kommandozeilenmodus einige weitere praktische Funktionen.

BefehlWirkung
:r dateiliest den Inhalt einer anderen Datei ein und fügt ihn unterhalb der Cursorzeile ein (read)
:e dateilädt eine andere Datei zur Bearbeitung nach (edit)
:e! dateiwie :e, verwirft dabei aber ungespeicherte Änderungen der aktuellen Datei
:!kommandoführt ein beliebiges Shell-Kommando aus, ohne vi zu verlassen
Shell-Kommando aus vi heraus ausführen
:!ls -la # zeigt die Ausgabe von "ls -la" an, # mit ENTER geht es zurück in den Editor
09

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.

BefehlWirkung
:set optionaktiviert eine Option, z. B. :set number
:set noopptiondeaktiviert eine Option, z. B. :set nonumber
:set option?zeigt den aktuellen Status einer Option an
:set alllistet alle verfügbaren Optionen mit ihrem aktuellen Wert

→Gebräuchliche Optionen

Anzeige
numberZeilennummern einblenden
showmodeaktuellen Modus in der Statuszeile anzeigen
listnicht druckbare Zeichen sichtbar machen
Suchverhalten
ignorecaseGroß-/Kleinschreibung bei der Suche ignorieren
wrapscanSuche springt am Dateiende zum Anfang zurück

→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.

~/.vimrc anlegen bzw. erweitern
ls -la ~/.vimrc echo "set showmode" >> ~/.vimrc echo "set number" >> ~/.vimrc

Beim nächsten Start liest vim diese Datei automatisch ein und wendet die enthaltenen Einstellungen an.

10

Aufrufoptionen auf der Befehlszeile

vi kann bereits beim Start angewiesen werden, den Cursor an eine bestimmte Stelle zu setzen.

AufrufWirkung
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"
Beispiel
vi /etc/profile +/PATH # öffnet /etc/profile, Cursor steht bereits auf der ersten Fundstelle von "PATH"
11

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)

Terminal
update-alternatives --config editor # zeigt eine Auswahlliste aller registrierten Editoren an

→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:

~/.bashrc
EDITOR=/usr/bin/nano export EDITOR alias editor=$EDITOR

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.

12

Ü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
Erzeuge über die Shell eine mehrzeilige Textdatei und öffne sie anschließend so mit vi, dass der Cursor direkt auf der ersten Zeile steht, die das Wort "Zeile" enthält.
cat > datei <<EOF eine Datei mit Text und ein paar Zeilen darin die einmal oder mehrmals vorkommen EOF vi datei +/Zeile
Aufgabe 2 — Navigation und Zähler Navigation
Öffne dieselbe Datei erneut, springe direkt an das Dateiende, dann drei Zeilen nach oben und anschließend an den Anfang dieser Zeile.
vi datei G " an das Dateiende 3k " drei Zeilen nach oben 0 " an den Zeilenanfang
Aufgabe 3 — Zeilen löschen und wieder einfügen Bearbeiten
Lösche die zweite Zeile der Datei und füge sie anschließend wieder als letzte Zeile ein.
2G " zur zweiten Zeile dd " löschen (landet in der Zwischenablage) G " zur letzten Zeile p " nach der aktuellen Zeile einfügen
Aufgabe 4 — Global ersetzen mit Bestätigung Suchen & Ersetzen
Ersetze in der gesamten Datei jedes Vorkommen von "Zeile" durch "Reihe", aber nur nach Bestätigung für jeden einzelnen Treffer.
:%s/Zeile/Reihe/gc
Aufgabe 5 — vimtutor Vertiefung
Installiere bei Bedarf und starte das interaktive Trainingsprogramm für vim.
# Ubuntu/Debian sudo apt install vim-gui-common # Fedora sudo dnf install vim-enhanced # Start vimtutor
13

Cheat-Sheet: alle Befehle auf einen Blick

Kompakte Referenz der in diesem Tutorial behandelten Befehle, gruppiert nach Themenbereich.

Navigation
h j k llinks / runter / hoch / rechts
w b eWort vor / zurück / Wortende
0 ^ $Zeilenanfang / erstes Zeichen / -ende
gg GDateianfang / Dateiende
H M Loben / Mitte / unten im Bildschirm
Strg-f/b/d/uSeite/halbe Seite vor/zurück
nG oder :nzu Zeile n springen
Einfügemodus
i avor / nach Cursor einfügen
I AZeilenanfang / Zeilenende einfügen
o Oneue Zeile unter / über der aktuellen
Esczurück in den Normal-Modus
Löschen / Ändern / Kopieren
x XZeichen löschen (rechts / links)
dw dd DWort / Zeile / bis Zeilenende löschen
cc C cwZeile / Rest / Wort ändern
yy ywZeile / Wort kopieren
p Pnach / vor Cursor einfügen
u Strg-rrückgängig / wiederherstellen
Suchen / Ersetzen
/muster ?mustervorwärts / rückwärts suchen
n NSuche wiederholen (gleich / umgekehrt)
:s/a/b/gin der Zeile ersetzen (global)
:%s/a/b/gin der ganzen Datei ersetzen
Speichern / Beenden
:w :w!speichern / erzwungen speichern
:q :q!beenden / erzwungen beenden
:wq :x ZZspeichern und beenden
Sonstiges
:r dateiDatei einlesen
:e dateiandere Datei laden
:!kommandoShell-Kommando ausführen
:set optionEditor-Option setzen
EDITORUmgebungsvariable für Standardeditor