VI howto

VI - Visual Editor - der standard UNIX Editor

VI - Der Linux/UNIX standard Editor
VI - Grundfunktionen
VI - mehr Funktionen

Der Linux/Unix standard Editor VI

VI (ausgesprochen: wie-ei) ist einer der ältesten Editoren unter UNIX bzw. Linux. Auch wenn es heutzutage per GUI einfachere und intuitiv zu bedienende "Luxus"-Editoren gibt, sind grundlegende Kenntnisse von VI ein großer Vorteil, vor allem dann, wenn man per Telnet oder SSH nur einen remote Zugriff auf ein Linux/UNIX System hat oder das System einfach von einer Shell aus administrieren möchte.

VI entstand 1976, stammt also aus der Zeit der "Dump Terminals", der dummen seriellen Konsolen. Diese waren langsam und erlaubten gerade mal einfache Cursor-Positionierungen auf dem Bildschirm. Popup-Menüs und Maussteuerung waren darauf ausgeschlossen bzw. unbekannt. VI wurde für diese einfachen Bildschirm-Konsolen geschrieben. Seine Bedienung und sein Komfort orientieren sich daran und sind entsprechend einfach gehalten, aber letztendlich genial.
Der wesentliche Vorteil von VI ist, dass er auf fast jedem Linux/UNIX System anzutreffen ist. Dabei ist es nicht mal immer VI sondern oft ist vi nur ein Link auf einen seiner Clones, wie z.B Elvis oder VIM (VI-IMproved).
Der Lernaufwand lohnt sich für jeden User, der sich oft bzw. gern auf der Shell bewegt.

In VI gibt es 3 verschiedene Modi

Die Unterscheidung dieser drei Modi ist das "Hauptproblem" für den VI-Neuling. Hat er das einmal begriffen, läßt sich der Rest leichter verstehen/erlernen.

Diese Modi sind:
  1. Editiermodus: Mittels Editiermodus bewegt man sich durch den Text bzw. die Datei und führt Textkorrekturen aus.
    In diesen Mode geht VI, wenn er gestartet wird.
  2. Eingabemodus: in diesem Mode wird der Text eingegeben bzw. erfasst
  3. der "Last Line" - Kommandozeilen Modus: Zum Speichern, Beenden und komplexere Funktionen z.B. Suchen und Ersetzen

Wechsel zwischen den Modi

Input-Mode --- [ESC] ---> Edit-Mode -- : --> Last-Line-Mode
Input-Mode <-- i oder a -- Edit-Mode <-- [RETURN] -- Last-Line

Beim Aufruf von vi test.txt wird die Datei test.txt (sofern vorhanden) geöffnet und VI geht in den Edit-Mode.
Durch Eingeben von :q[RETURN] wird in den Kommandozeilen-Mode gewechselt VI beendet.
Im Edit-Mode werden die eingebenen Zeichen als Steuerzeichen interpretiert. Um Text schreiben zu können, muss man zunächst mittels i oder a in den Input-Mode wechseln. Im Input-Mode werden alle Zeichen als Text erfasst. Durch Dücken der Escape-Taste wird der Input-Mode beendet und man befindet sich wieder im Edit-Modus.

VI ist ein sehr mächtiger Editor mit ca. 200 Funktionen. Viele Tasten sind mehrfach belegt. So unterscheidet VI z.B. zwischen (Klein) o = Einfügen einer Zeile nach der aktuellen Zeile und (Groß) O = Einfügen vor aktueller Zeile. VI stammt eben aus der Zeit, als es kaum Alternativen zum Erstellen von Programm-Code gab. Heute verwendet man dazu meist Editoren auf der GUI wie z.B. Kate oder Geany, die auch syntaktische Prüfungen durchführen können oder die Code-Syntax farblich darstellen. VI ist und bleibt für die Shell der standard Editor.

Auch der Linux Page Reader "less" verwendet die Syntax der VI-Kommandos. Hier kann man sich mit VI-Kenntnissen leichter bewegen und Textstellen suchen.

zum Seitenanfang

VI - die Grundfunktionen

Für das "Gelegenheits-Editieren" z.B. zur Administration von Rechnern kommt man mit nachfolgenden, wenigen VI-Funktionen ganz gut aus.

Funktionen zum Speichern und Beenden von VI sind "Last Line"-Kommandos

TasteFunktion
:Doppelpunkt im Edit Fenster startet den Last-Line-Mode
qQuitVI verlassen
q!QuitVI ohne Speichern verlassen/Verlassen erzwingen
wWriteDatei speichern
wqWrite & QuitZusammenhängen von w und q
/mustersuchesuche nach muster vorwärts
?mustersuchesuche nach muster rückwärts
nnextwiederhole letzte Suche

VI prüft vor dem Beenden, ob der Text verändert wurde und gibt eine entsprechende Warnung aus. Hat man eine Datei ohne Schreibberechtigung aufgerufen, oder möchte man die Änderungen verwerfen ohne zu speichern, so muss VI mit q! verlassen werden. Anderenfalls läßt sich VI nur nach vorherigem Speichern mit q beenden. Eine Alternative für :wq ist die Eingabe von ZZ.

Bewegen und Löschen im Edit-Modus
Bei den meisten Linux Systeme funktioniern die Cursor-Steuertasten einwandfrei. Falls das mal nicht der Fall sein sollte, kann man sich auch anders durch den Text bewegen.

FunktionZeichenWortZeileDatei
vorwärtslwjL
rückwärtshbkH
löschenxdwdd 

TasteFunktion
0NULLGehe zum Zeilenanfang
$Zeilenendegehe ans Ende der Zeile
HHomegehe zum Anfang der Datei
LLastgehe zum Ende der Datei
12GGotogehe zu Zeile 12 der Datei (ohne Zahl = letzte Zeile)

Wechsel in den Input Mode:
TasteFunktion
iinsertText vor dem Cursor einfügen
IInsertText am Zeilenanfang einfügen
aappendText nach dem Cursor einfügen
AAppendText am Zeilenende anhängen
oopenLeerzeile/Text nach aktueller Zeile einfügen
OOpenLeerzeile/Text vor aktueller Zeile einfügen

Im Input-Mode werden Zeichen eingefügt (nicht überschrieben). Der Input-Mode wird mit Escape verlassen. Falls die Cursor-Tasten nicht oder schlecht implementiert sind, lösen sie u.U. Escape-Sequenzen aus, die VI veranlassen den Input-Mode zu beenden.


Spezielle Funktionen:
TasteFunktion
. wiederholt letztes Änderungskommando
uundomacht die letzte Änderung rückgängig
xx-enZeichen löschen (aus-X-en von Text)
rnreplaceErsetzt aktuelles Zeichen mit Zeichen n
xp tauscht aktuelles mit nachfolgendem Zeichen
JJoinhängt die nächste an die aktuelle Zeile an
löscht [Return] der aktuellen Zeile

Fast alle VI Funktionen können durch Voranstellen einer Zahl mehrfach ausgeführt werden. So löscht beispielsweise 12dd zwölf Zeilen ab der aktuellen Zeile.

Mit den oben aufgeführten Funktionen und dem Verständnis der drei Modi von VI lässt sich VI schon recht gut bedienen und produktiv einsetzen.

zum Seitenanfang

VI - mehr Funktionen

Wer mehr als nur gelegentlich mal eine Config-Datei editieren möchte, wird zusätzliche Funktionen benötigen: wie. z.B. Cut'n'Paste, suchen + ersetzen und Text überschreiben.
Die nachfolgenden Tabellen erheben keinen Anspruch auf Vollständigkeit. Sie sind entsprechend in "Funktionsgruppen" gegliedert. Fast alle VI-Kommandos können durch voranstellen einer Zahl entsprechend häufig ausgeführt werden. So ersetzt beispielsweise 15rx ab dem Cursor 15 Zeichen durch "x" oder 20~ dreht bei den nächsten 20 Buchstaben die Groß- Kleinschreibung um.

Yank und Put

Cut and Paste heißt in der VI-Sprache Yank und Put. Wobei das nicht ganz stimmt, den yank ist ein Copy-Befehl. Durch yy wird die aktuelle Zeile in den allgemeinen Puffer geschrieben. p für Put fügt den Puffer hinter der aktuellen Zeile ein. Das oben schon beschriebene dd Delete funktioniert ähnlich wie Yank, mit dem Unterschied, dass dd die entsprechende Anzahl Zeilen, nach dem Kopieren in den allgemeinen Puffer, löscht. Somit kann man die mit dd gelöschte(n) Zeile(n) an anderer Stelle im Text per p wieder einfügen.

Neben dem allgemeinen Pufffer kennt VI 35 weitere "benannte" Puffer. 26 davon sind über die Buchstaben a...z und 9 über die Ziffern 1...9 zu adressieren. Diese werden über "x[n]yy adressiert, wobei x der Buchstabe oder die Ziffer des Puffes ist und die Option n die Anzahl der zu kopierenden Zeilen ist. Ein vorangestelltes doppeltes Anführungszeichen teilt VI also mit, dass man einen benannten Puffer adressieren möchte.

Delete, Yank und Put in der Übersicht:
TasteFunktion
xlöscht aktuelles Zeichen
Xlöscht Zeichen vor Cursor
dwlöscht Wort
ddlöscht Zeile
d$löscht bis zum Ende der Zeile (alt: D)
d/musterlöscht bis muster
"addlöscht Zeile und speichert sie in Puffer a
ywkopiert Wort
yykopiert Zeile
y$kopiert bis zum Ende der Zeile
"ayykopiert Zeile in Puffer a
pfügt allg. Puffer hinter aktueller Zeile ein
Pfügt allg. Puffer vor aktueller Zeile ein
"apfügt Puffer a hinter aktueller Zeile ein
:r dateifügt datei zwischen aktueller und nächster Zeile ein

Aus der Tabelle kann man sehr schön erkennen, dass sich Funktionen in VI häufig aus anderen Funktionen zusammensetzen. So ist beispielsweise die Funktion xp zum Tauschen zweier hintereinanderliegender Buchstaben um z.B. aus einem "ie" ein "ei" zu machen, nichts anderes als die Funktion x (Löschen eines Zeichens) gefolgt von p (Einfügen hinter Cursor).

Suchen und Ersetzen

Suchen und Ersetzen wird im VI über "Last-Line" oder Doppelpunkt Kommandos durchgeführt. Das einfache Vor- und Rückwärtssuchen ist weiter oben schon aufgeführt. Delete, Yank und Put in der Übersicht:

Suchen:
EingabeFunktion
/mustersucht muster in Datei vorwärts
/muster/nsucht n-tes muster in Datei vorwärts
/muster/+npositioniere Cursor in n-te Zeile hinter muster
/muster/-npositioniere Cursor in n-te Zeile vor muster
?mustersucht muster in Datei rückwärts
nwiederholt letzte Suche
Nwiederholt letzte Suche in umgekehrter Richtung

Suchen und Ersetzen:
EingabeFunktion
s/alt/neuersetzt 1. Vorkommen in aktueller Zeile von alt durch neu
s/alt/neu/gersetzt alle Vorkommen in aktueller Zeile von alt durch neu
1,10s/alt/neu/gersetzt alle Vorkommen in Zeilen 1 bis 10 von alt durch neu
1,$s/alt/neu/gcersetzt alle Vorkommen in Datei von alt durch neu
inkl. Rückfrage. Diese muss mit y oder n beantwortet werden

In einem gut installierten VIM kann man, ähnlich wie bei der Bash, mittels Up- & Down-Cursor-Tasten durch die letzen Kommandos blättern und diese ggf. editieren und wiederholen.


Eingeben/Ändern mit Wechsel in den Input Mode:
TasteFunktion
aappendRechts vom Cursor einfügen
AAppendAm Zeilenende anhängen
iinsertLinks vom Cursor einfügen
IInsertAm Zeilenanfang einfügen
oopenöffnet neue, leere Zeile nach aktueller Zeile
OOpenöffnet neue, leere Zeile vor aktueller Zeile
ssubstituelöscht aktuelles Zeichen und geht in Input-Mode
SSubstitutelöscht aktuelle Zeile und geht in Input-Mode
RReplaceÜberschreiben einschalten
cwchange wordWort löschen und in den Input Mode wechseln
ccchangewie S - ganze Zeile ersetzen
c$Changeab Cursor den Rest der Zeile ersetzen
CChangewie c$ - ab Cursor den Rest der Zeile ersetzen

Ersetzungen/Änderungen ohne Wechsel in den Input Mode:
TasteFunktion
xaus-X-enZeichen unter Cursor löschen
rxreplaceZeichen unter Cursor durch x ersetzen
~Case changeWechsel von Groß- in Kleinbuchstaben und umgekehrt
JJoinZeilen verbinden
. letztes Änderungskommando wiederholen
uundoletzte Änderung rückgängig machen
:e! alle Änderungen seit dem letzten Speichern verwerfen

zum Seitenanfang