vi - Der Standard Unix-Editor
Von Peter H. Rüegg (peach auf trash.net)
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 |
s/altes 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. |