VI - Visual Editor - der standard UNIX Editor
VI - Der Linux/UNIX standard EditorVI - 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:- 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. - Eingabemodus: in diesem Mode wird der Text eingegeben bzw. erfasst
- 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-ModeInput-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 SeitenanfangVI - 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
Taste | Funktion | |
: | Doppelpunkt im Edit Fenster startet den Last-Line-Mode | |
q | Quit | VI verlassen |
q! | Quit | VI ohne Speichern verlassen/Verlassen erzwingen |
w | Write | Datei speichern |
wq | Write & Quit | Zusammenhängen von w und q |
/muster | suche | suche nach muster vorwärts |
?muster | suche | suche nach muster rückwärts |
n | next | wiederhole 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.
Funktion | Zeichen | Wort | Zeile | Datei |
vorwärts | l | w | j | L |
rückwärts | h | b | k | H |
löschen | x | dw | dd |
Taste | Funktion | |
0 | NULL | Gehe zum Zeilenanfang |
$ | Zeilenende | gehe ans Ende der Zeile |
H | Home | gehe zum Anfang der Datei |
L | Last | gehe zum Ende der Datei |
12G | Goto | gehe zu Zeile 12 der Datei (ohne Zahl = letzte Zeile) |
Wechsel in den Input Mode:
Taste | Funktion | |
i | insert | Text vor dem Cursor einfügen |
I | Insert | Text am Zeilenanfang einfügen |
a | append | Text nach dem Cursor einfügen |
A | Append | Text am Zeilenende anhängen |
o | open | Leerzeile/Text nach aktueller Zeile einfügen |
O | Open | Leerzeile/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:
Taste | Funktion | |
. | wiederholt letztes Änderungskommando | |
u | undo | macht die letzte Änderung rückgängig |
x | x-en | Zeichen löschen (aus-X-en von Text) |
rn | replace | Ersetzt aktuelles Zeichen mit Zeichen n |
xp | tauscht aktuelles mit nachfolgendem Zeichen | |
J | Join | hä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 SeitenanfangVI - 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.
Taste | Funktion |
x | löscht aktuelles Zeichen |
X | löscht Zeichen vor Cursor |
dw | löscht Wort |
dd | löscht Zeile |
d$ | löscht bis zum Ende der Zeile (alt: D) |
d/muster | löscht bis muster |
"add | löscht Zeile und speichert sie in Puffer a |
yw | kopiert Wort |
yy | kopiert Zeile |
y$ | kopiert bis zum Ende der Zeile |
"ayy | kopiert Zeile in Puffer a |
p | fügt allg. Puffer hinter aktueller Zeile ein |
P | fügt allg. Puffer vor aktueller Zeile ein |
"ap | fügt Puffer a hinter aktueller Zeile ein |
:r datei | fü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:Eingabe | Funktion |
/muster | sucht muster in Datei vorwärts |
/muster/n | sucht n-tes muster in Datei vorwärts |
/muster/+n | positioniere Cursor in n-te Zeile hinter muster |
/muster/-n | positioniere Cursor in n-te Zeile vor muster |
?muster | sucht muster in Datei rückwärts |
n | wiederholt letzte Suche |
N | wiederholt letzte Suche in umgekehrter Richtung |
Suchen und Ersetzen:
Eingabe | Funktion |
s/alt/neu | ersetzt 1. Vorkommen in aktueller Zeile von alt durch neu |
s/alt/neu/g | ersetzt alle Vorkommen in aktueller Zeile von alt durch neu |
1,10s/alt/neu/g | ersetzt alle Vorkommen in Zeilen 1 bis 10 von alt durch neu |
1,$s/alt/neu/gc | ersetzt 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:
Taste | Funktion | |
a | append | Rechts vom Cursor einfügen |
A | Append | Am Zeilenende anhängen |
i | insert | Links vom Cursor einfügen |
I | Insert | Am Zeilenanfang einfügen |
o | open | öffnet neue, leere Zeile nach aktueller Zeile |
O | Open | öffnet neue, leere Zeile vor aktueller Zeile |
s | substitue | löscht aktuelles Zeichen und geht in Input-Mode |
S | Substitute | löscht aktuelle Zeile und geht in Input-Mode |
R | Replace | Überschreiben einschalten |
cw | change word | Wort löschen und in den Input Mode wechseln |
cc | change | wie S - ganze Zeile ersetzen |
c$ | Change | ab Cursor den Rest der Zeile ersetzen |
C | Change | wie c$ - ab Cursor den Rest der Zeile ersetzen |
Ersetzungen/Änderungen ohne Wechsel in den Input Mode:
Taste | Funktion | |
x | aus-X-en | Zeichen unter Cursor löschen |
rx | replace | Zeichen unter Cursor durch x ersetzen |
~ | Case change | Wechsel von Groß- in Kleinbuchstaben und umgekehrt |
J | Join | Zeilen verbinden |
. | letztes Änderungskommando wiederholen | |
u | undo | letzte Änderung rückgängig machen |
:e! | alle Änderungen seit dem letzten Speichern verwerfen |
zum Seitenanfang