Das FAQ zum UNIX-Editor VI

"VI" ist (neben dem Line-Editor "ED") der zweite altüberlieferte UNIX-Editor. Es handelt sich um einen Full-Screen-Editor, dessen Kommandosatz aus ungefähr 200 Anweisungen besteht, von welchen allerdings nur etwa 10-20 häufig gebraucht werden. Mit "VI" können etwa 3500-4000 zeilige Files bearbeitet werden, wobei die Länge der einzelnen Zeile 1023 Zeichen (plus [Newline]) nicht überschreiten kann. Es können mehrere Files gleichzeitig bearbeitet werden. Der Editor zeichnet sich des weiteren über eine Recovery-Möglichkeit im Falle eines System-Crashes aus.

Die Bedienung des Editors verlangt etwas Erfahrung - wem die Befehle nicht geläufig sind, dürfte ziemlich ratlos vor dem Bildschirm sitzen. Für den etwas erfahreneren Benutzer habe ich hier eine Kurzbeschreibung mit den wichtigsten Befehlen zusammengestellt. Ich erhebe keinen Anspruch auf Vollständigkeit, aber mit diesen zwei Listen kommt mensch recht gut durch...


Start des Editors
Beenden des Editors
Insert-Mode kontra Command-Mode
Cursorbewegung
Bildbewegung
Text einfügen
Text ändern
Text löschen
Zeilen trennen & zusammenfügen
Suchen & Ersetzen
Spezielles
Abkürzungen
Copy & Paste
"set" - Optionen


Start des Editors

Es gibt verschiedene Möglichkeiten, den Editor zu starten:

vi Startet den Editor. Ein neues (noch namenloses) File wird erstellt.
vi filename Editieren eines existierenden Files oder erstellen eines neuen Files mit gleichzeitiger Namensvergebung
vi file1 file2 ... Editieren von mehreren Files
vi file[0-9] Editieren von allen Files mit Name "file0, file1, ... file9"
vi +n filename Beginn der Editierungen ab Zeile n
view filename Das File wird im "read only"-Modus geladen und Editierungen können nicht gespeichert werden.
vedit filename Starten der Beginner-Variante von "vi" (brauchst Du jetzt hoffentlich nicht mehr)
vi -r Anzeige von geretteten Files nach einem System-Crash
vi -r filename Recover eines Files nach einem System-Crash.

Nach dem Aufruf von "vi" befindest Du Dich automatisch im Command-Mode.


Beenden des Editors

Dazu musst Du Dich im Command-Mode befinden. Es gibt ebenfalls mehrere Möglichkeiten:

ZZ write / quit (Verlassen von vi mit Speichern)
:wq write / quit
:w write, ohne quit
:q quit, ohne write
:wq! write / quit unter Zwang
:w! write, ohne quit unter Zwang
:q! quit, ohne write unter Zwang
:w filename write unter neuem Filenamen


Insert-Mode kontra Command-Mode

"vi" kennt grundsätzlich zwei verschiedene Modi: den Command-Mode und den Insert-Mode. Beim Starten befindest Du Dich automatisch im Command-Mode, in dem, wie der Name schon sagt, die meisten Befehle gegeben werden. Durch die Verwendung der Einfüge-Befehle "iIaAoO" sowie einige Ändern-Befehle wird in den Insert-Mode gewechselt. Von da an werden eingegebene Zeichen als Textzeichen interpretiert, das heisst im Text eingefügt. Um erneut ein Kommando zu geben, musst Du zuerst mit [ESC] in den Command-Mode zurückkehren. Da die Pfeiltasten bei gewissen Terminals als eine Folge von [ESC] und einem Sonderzeichen interpretiert werden, führt dort auch das Drücken einer Cursortaste zurück in den Command-Mode, allerdings verbunden mit einem Fehlersignal (Piepston), da das Sonderzeichen als Kommando gewertet, aber nicht verstanden wird.

Siehe auch die "set"-Option "smd"


Cursorbewegung

Der Cursor lässt sich nur im Command-Mode bewegen. Auf den meisten Terminals sind die normalen Pfeil-Cursortasten problemlos verwendbar. Für Freaks und wenn's weiter als nur gerade einen Buchstaben respektive eine Zeile gehen soll, sind natürlich auch Buchstabenkommandos möglich:

h ein Buchstabe links
l ein Buchstabe rechts
k eine Zeile rauf
j eine Zeile runter
[Newline] eine Zeile runter
e (end) Wortende
b (back) Wortanfang, zurück
w (word) Wortanfang, vorwärts
H (home) Anfang des Bildes
M (middle) Mitte des Bildes
L (last) Ende des Bildes
nG Zeile n
G File-Ende
^ Zeilenanfang (Textanfang)
0 (Null) Zeilenanfang (Position 0)
$ Zeilenende


Bildbewegung

Für die Bewegung des gesamten Bildes stehen zwei verschiedene Befehlstypen zur Verfügung, wovon die eine mittels der Control-Taste, die andere über einen ":"-Befehl aktiviert wird.

[CTRL]/B (back) um eine Bildschirmseite zurück (PgUp)
[CTRL]/F (forward) um eine Bildschirmseite vorwärts (PgDn)
[CTRL]/D (down) 12 Zeilen vorwärts
[CTRL]/U (up) 12 Zeilen zurück
[CTRL]/E (exhibit) 1 Zeile vorwärts
[CTRL]/G (global) Filestatus, sowie Filename und aktuelle Zeilennummer anzeigen
:np Zeile n ausgeben
:m,np Zeilen m bis n ausgeben


Text einfügen

Dies sind die Befehle, die in den Insert-Mode umschalten. "Zeichenkette" steht für den einzugebenden Text.

a Zeichenkette rechts vom Cursor
i Zeichenkette links vom Cursor
A Zeichenkette am Zeilenende
I Zeichenkette am Zeilenanfang
O Zeichenkette über dem Cursor
o Zeichenkette unter dem Cursor


Text ändern

Zum Teil wird hier in den Insert-Mode umgeschaltet! Wird keine Zahl "n" angegeben, so geht "vi" von einer 1 aus.

r (Zeichen) ein Zeichen ändern
ns (n Zeichen) n Zeichen ändern
R (Zeichenkette) einige Zeichen überschreiben
ncw (Wort) n Wörter ändern
cc (Zeichenkette) eine Zeile ändern
C Überschreiben ab aktueller Position bis Zeilenende


Text löschen

Wird die Zahl vor dem Befehl weggelassen, so nimmt "vi" automatisch eine 1 an.

nx n Zeichen über dem Cursor löschen: [DEL]
nX n Zeichen vor dem Cursort löschen: [Backspace]
ndw n Wörter löschen
ndd n Zeilen löschen
dG bis File-Ende löschen
D bis Zeilen-Ende löschen


Zeilen trennen & zusammenfügen

nJ n Zeilen zusammenfügen
a [Newline] [ESC] Zeilen trennen


Suchen & Ersetzen

Beim Suchen & Erstezen kann nach dem Finden durch Drücken von "n" die nächste Zeichenfolge gesucht (und eventuell ersetzt) werden.

/Zeichenkette vorwärts suchen
?Zeichenkette rückwärts suchen
:s/altes Wort/neues Wort erstes Wort in Zeile ersetzen
s7altes Wort/neues Wort/g alle Wörter in der Zeile ersetzen
1,$s/altes Wort/neues Wort/g alle Wörter im File ersetzen
3,8s/altes Wort/neues Wort/g alle Wörter in den Zeilen 3-8 ersetzen


Spezielles

u (undo) letztes Kommando annullieren
U alle Kommandos auf einer Zeile annullieren
CTRL/G wo bin ich?
:!Kommando UNIX-Befehl ausführen
:r filename File in den Puffer lesen. Dabei werden die Zeilen nach der zuletzt angezeigten Cursorposition übertragen.
:r !Kommando UNIX-Befehl ausführen und dessen Output einfügen
:sh temporärer Sprung in die Shell (zurück mittels ctrl/d)
:e neues File editieren (zuerst :w nicht vergessen!)
:n nächstes File in den Puffer lesen (wenn mehrere Files bearbeitet werden)
:w filename Inhalt des Puffers unter "Filename" speichern
:w>> filename Inhalt des Puffers am Ende des Files "Filename" anhängen


Abkürzungen

"vi" erlaubt es, für häufig gebrauchte Wendungen Abkürzungen zu programmieren. Dazu gibst Du folgendes ein:

:ab mymail <A HREF="mailto:pruegg@bigfoot.com">Peter Rüegg</A>

":ab" (abrevation) ist der "vi"-Befehl, "mymail" ist die von Dir gewünschte Abkürzung und der Rest der Zeile ist der Text, der substitutioniert werden soll. Du kannst Dir auf diese Weise beliebig viele Abkürzungen definieren, die, wenn Du sie in einem file ".exrc" (im aktuellen Directory allerdings!) festhälst, auch permanent verfügbar gemacht werden können. Die Abkürzungen werden übrigens ersetzt, sobald Du sie eintippst und ein [SPACE], ein [Newline] oder ein [ESC] folgen lässt. Vorsicht mit Abkürzungen, die einen Sinn haben!


Copy & Paste

"vi" zeichnet sich wie so vieles unter UNIX dadurch aus, dass die implementierten Funktionen gleich in völlig überdimensionierter Art und Weise benutzt werden können. So auch beim "Copy & Paste"-Ersatz, der hier "Yank & Put" heisst. Gleich 27 Puffer sind hierfür vorhanden, 26 benannte (a-z) und ein unbenannter, in dem grundsätzlich die Veränderungen festgehalten werden, die durch das Ausführen eines Befehles passieren (und dann durch "u" zurückgenommen werden können). Der Befehl "Y" wird verwendet, um ein gewisse Anzahl Zeilen in einen Puffer zu schreiben. "Y" alleine schreibt also die aktuelle Zeile in den unbenannten Puffer, "5Y" nimmt die aktuelle und die vier folgenden Zeilen. "a5Y" macht dasselbe, schreibt die Zeilen aber in den Puffer "a" (dasselbe natürlich mit allen andern Buchstaben des Alphabets). Im Unterschied zum unbenannten Puffer bleibt der Inhalt der benannten vorhanden, bis er entweder überschrieben oder "vi" beendet wird. So kann mit dem Kopieren in einen Puffer und anschliessenden ":e"- oder ":n"-Befehl (Laden eines anderen Files) Text von einem File in ein anderes übertragen werden.

Wieder eingefügt wird der Text mit "p" (klein p,nach der aktuellen Zeile) oder "P" (GROSS P,vor der aktuellen Zeile). Um auf einen benannten Puffer zuzugreifen, wird demenstprechend ein "aP" (oder "sp" oder was auch immer...)-Befehl verwendet.

Für nähere Informationen und ausführlichere Markierungsbefehle siehe in der Zusammenfassung unter "Kopieren und Bewegen von Textsegmenten"


"set" - Optionen

"vi" kennt 38 sogenannte "set"-Optionen, von denen hier nur die wichtigsten erklärt werden sollen. Sie alle gelten nur für eine Sitzung (können aber auch im ".exrc"-File im Home-Directory oder mit dem Setzen einer "EXINIT"-Variable im ".profile" festgehalten werden. Gesetzt werden sie mittels

:set option option option ...

wobei durch die alleinige Eingabe von ":set" eine Ausgabe der gesetzten Optionen erfolgt. Rückgängig gemacht werden die Optionen durch Wiederholung mit ihrem Komplement, hier in der zweiten Spalte.

autoindent, ai noai Start einer eingefügten Zeile unter dem ersten Zeichen der vorherigen. Soll diese Startpostition nach links verschoben werden, so ist (im Command-Mode) [CTRL]/D zu betätigen.
ignorecase, ic noic Gross- und Kleinbuchstaben werden bie Suchbefehlen nicht mehr unterschieden
number, nu nonu automatische Zeilennummerierung
redraw noredraw Beim Ersetzen und Löschen von Zeichen(folgen) wird der neue Zustand sofort angezeigt
shiftwidth, sw sw=n Shiftlänge bei der Eingabe von CTRL/D (im Command-Mode und bei autoindent) und m>> oder m<< (m Zeilen um n Zeichen shiften, links oder rechts)
showmatch, sm nosm Bei Eingabe von ")" und "}" wird die öffnende Klammer durch den Cursor kurz angezeigt (Sehr hilfreich bei "C"-sourcen).
showmode, smd nosmd Angabe am Bildschirm (unterste Zeile) in welchem Modus Du Dich befindest.
exrc noexrc Durch "noexrc" werden die im ".exrc"-File enthaltenen Optionen nicht berücksichtigt.


30. April 1997, Peter Rüegg