6.2 vi
Auch wenn der vi-Editor nicht alle der obigen Features abdecken kann, so ist er doch – hat man ihn einmal verstanden – recht einfach zu bedienen, und vor allen Dingen ist er klein, schnell und überall verfügbar.
Abbildung 6.1 Der vi-Editor mit geladener httpd.conf
6.2.1 Den vi starten
Der Editor wird über die Kommandozeile aufgerufen. Dabei wird optional ein zu editierender bzw. neu zu erstellender Dateiname <Dieser wird erst beim Abspeichern der Textdatei tatsächlich erstellt.> übergeben.
Status-Zeile
Nachdem der Editor geladen worden ist, bekommt man ein fast leeres Terminalfenster <Der vi-Editor läuft nicht auf allen Terminals ganz perfekt. Ein vt100- oder vt220-Terminal sollte jedoch problemlos seinen Dienst tun.> zu sehen. Die Tilde-Zeilen stehen für leere Zeilen. Die unterste Zeile wird als Statuszeile genutzt und gibt Ihnen den Dateinamen sowie die Zeilenanzahl und die Dateigröße in Zeichen respektive Bytes an:
# Statuszeile bei einer neuen Datei: /tmp/file: new file: line 1 # Statuszeile bei einer bereits gesicherten Datei: /tmp/file: 1 lines, 5 characters.
Listing 6.1 Statuszeile
6.2.2 Kommando- und Eingabemodus
Um mit dem vi arbeiten zu können, muss man zunächst wissen, dass er über zwei Modi verfügt: den Eingabe- und den Kommandomodus.
Im Eingabemodus wird Text eingefügt, ersetzt oder gelöscht. Im Kommandomodus lässt sich der Editor konfigurieren. Zudem werden die wichtigen Operationen wie das Abspeichern einer Datei oder das Suchen von Textstellen in diesem Modus abgewickelt.
Wie kommt man denn überhaupt ...
... wieder heraus? Ganz einfach: Zunächst wird mit der Escape-Taste in den Kommandomodus gewechselt. Anschließend kann in der Statuszeile (die nun zur Kommandozeile geworden ist) der Befehl zum Beenden eingegeben werden. Da Steuerbefehle mit einem Doppelpunkt beginnen und zum Beenden der Quit-Befehl (q) verwendet wird, muss nun folglich :q eingegeben werden.
6.2.3 Dateien speichern
Dateien werden im Kommandomodus gespeichert. Das dafür notwendige Kommando »write« (w) schreibt die Datei unter dem geöffneten Namen auf das Speichermedium. Allerdings kann auch ein Dateiname für die Datei als Parameter für w übergeben werden: :w /home/user/test. Möchte man speichern und gleichzeitig den Editor beenden, so können die Befehle kombiniert werden: :wq [Dateiname].
Soll ohne Rücksicht auf Verluste von veränderten Daten (also ohne sie zu speichern) ein »Quit« durchgeführt werden bzw. sollen Veränderungen an einer schreibgeschützten Datei – auf die man natürlich Änderungsrechte an den Dateiattributen besitzen muss – durchgeführt werden, muss dem Kommando ein Ausrufezeichen übergeben werden: :q! bzw. :w! oder :wq!.
6.2.4 Arbeiten mit dem Eingabemodus
Nach dem Start des vi-Editors befindet man sich im Kommandomodus. Möchte man Text schreiben, muss zunächst in den Eingabemodus gewechselt werden. Je nachdem, in welchen Eingabemodus Sie wechseln möchten, ist dafür eine bestimmte Funktionstaste anzuwenden.
Kommando | Wirkung |
i (insert) | Text vor dem aktuellen Zeichen einfügen |
I | Text am Anfang der Zeile einfügen |
a (append) | Text hinter dem aktuellen Zeichen einfügen |
A | Text am Ende der Zeile einfügen |
o (open) | Text in einer neuen Zeile unterhalb der aktuellen Zeile einfügen |
O | Text in einer neuen Zeile oberhalb der aktuellen Zeile einfügen |
Am besten probieren Sie alle obigen Kommandos einmal mit einer Beispieldatei aus. Schreiben Sie sich doch eine Mail im vi, und senden Sie sich diese dann via Eingabeumlenkung mit dem mail-Programm.
6.2.5 Navigation
Um sich im Text zu bewegen, greift man in der Regel auf die Cursor-Tasten zurück. Mit diesen allein werden leider oftmals längere Scroll-Abenteuer unvermeidlich sein. Aus diesem Grund haben sich die Entwickler des Editors einige Features überlegt, um sich effizient und schnell im Text bewegen zu können.
Kommando | Wirkung |
$ | Ende der aktuellen Zeile |
^ und 0 | Zum Anfang der aktuellen Zeile |
w | Ein Wort vorwärts |
b | Ein Wort rückwärts |
Strg+F | Eine Seite vorwärts blättern (geht manchmal auch mit der Bild-Ab-Taste) |
Strg+B | Eine Seite rückwärts blättern (geht manchmal auch mit der Bild-Auf-Taste) |
G | Zur letzten Zeile der Datei bewegen |
f[n] | Zum nächsten Vorkommen des Zeichens n in der aktuellen Zeile gehen (Achtung: case-sensitive) |
:[n] und [n]G | Zur Zeile n bewegen. Eignet sich gut, um Kompilierfehlern im Quellcode nachzugehen. |
An älteren Unix-Terminals standen oftmals keine Cursor-Tasten zur Verfügung.
Daher kann auch mit den Tasten h (rechts), j (runter), k (rauf) und l (rechts) navigiert werden. Dazu muss allerdings in den Kommandomodus gewechselt werden.
6.2.6 Löschen von Textstellen
Sofern Sie an Editoren grafischer Oberflächen wie etwa aus der Windows-Welt gewöhnt sind, ist Ihnen bekannt, dass mit der Backshift-Taste ein geschriebenes Zeichen wieder gelöscht werden kann. Im vi-Editor steht diese Funktionalität nicht zur Verfügung. Ein Löschvorgang muss – wie immer – über den Kommandomodus mit entsprechenden Anweisungen bewerkstelligt werden.
Die nachstehende Tabelle fasst die vi-Kommandos zum Löschen von Textstellen zusammen:
Kommando | Wirkung |
dw | Löscht das aktuelle Wort. |
d$ und D | Löschen vom aktuellen Zeichen bis zum Ende der Zeile |
d0 und d^ | Löschen vom aktuellen Zeichen bis zum Zeilenanfang |
df[c] | Löscht vom aktuellen Zeichen bis zum Vorkommen von c in der aktuellen Zeile. |
dG | Löscht alles von der aktuellen bis zur einschließlich letzten Zeile des Buffers. |
d1G | Löscht alles von der aktuellen bis zur einschließlich ersten Zeile des Buffers. |
dd | Löscht die aktuelle Zeile. |
Sollten Sie einmal aus Versehen eine Aktion durchgeführt haben, die wieder rückgängig gemacht werden soll (etwa unbeabsichtigtes Überschreiben oder Löschen), kann dieser Vorgang mit dem Kommando u (undo) rückgängig gemacht werden. Doch beachten Sie, dass diese Möglichkeit nur für den letzten Vorgang besteht. Sobald Sie ein neues Wort geschrieben haben, ist Ihnen diese Möglichkeit also verbaut. Da hilft nur das vorher erstellte Backup bzw. das Beenden, ohne zu speichern (:q!).
6.2.7 Textbereiche ersetzen
Oftmals möchten Sie ein Wort nicht einfach nur löschen, sondern überschreiben, einzelne Zeichen eines Wortes ersetzen oder Ähnliches. Dies wird mit den c-Kommandos bewerkstelligt.
Kommando | Wirkung |
cw | Überschreibt ein ganzes Wort. |
c$ und D | Überschreiben vom aktuellen Punkt bis zum Ende der Zeile |
c0 und c^ | Überschreiben vom aktuellen Punkt bis zum Anfang der Zeile |
cf[c] | Überschreiben bis zum nächsten Zeichen »c« der aktuellen Zeile |
Nehmen wir einmal an, der Inhalt einer Datei text.txt beinhaltet den String »Das ist der Inhalt von 'text.txt'.«. Nun soll das Wort »ist«, in »wird« geändert werden. Bewegen Sie den Cursor dazu auf den Buchstaben »i« des Wortes »ist«, und drücken Sie zunächst die Taste c und anschließend w.
Daraufhin wandelt sich der letzte Buchstabe des Wortes in ein Dollarzeichen ($) um und signalisiert damit das Ende des Textbereichs, den Sie nun ersetzen können. Alles, was nun eingetippt wird, setzt der vi-Editor vor den String »der Inhalt ...«:
# nach Aktivierung von 'cw': Das is$ der Inhalt von 'test.txt'. # daraus wird: Das wird der Inhalt von 'text.txt'.
Listing 6.2 So ändert man Textstellen.
6.2.8 Kopieren von Textbereichen
Der Kopiervorgang im vi-Editor gestaltet sich ein wenig kompliziert.
Zunächst einmal muss zwischen dem Verschieben und dem tatsächlichen Kopieren von Textbereichen unterschieden werden.
Löscht man einen Textbereich mit dem dX-Kommando (etwa dd, um eine ganze Zeile zu löschen), so wird dieser in den Zwischenspeicher kopiert und kann an beliebiger Stelle wieder eingefügt werden. Dazu muss lediglich die Taste p betätigt werden. Ein kleines p fügt den Text vor der Cursor-Position ein – ein großes P hinter dieser Position.
Möchte man den Text jedoch tatsächlich Kopieren
kopieren, so muss man das y-Kommando verwenden.
Die Handhabung entspricht der des oben genannten Kommandos. Der Unterschied besteht lediglich darin, dass der Text nicht gelöscht wird.
6.2.9 Shiften
Mithilfe von zwei Größer- bzw. Kleiner-als-Zeichen („) und („) kann eine Zeile um eine Shift-Einheit nach links bzw. rechts gerückt werden. Dieses Feature eignet sich hervorragend bei programmiertechnischen Anwendungen des Editors, etwa wenn es darum geht, eine Schleife um einen Kommandoblock zu setzen.
Die Shift-Einheit kann über die Option :set shiftwidth=x gesetzt werden, wobei x die Anzahl der Zeichen ist, um die verschoben werden soll.
6.2.10 Die Suchfunktion
In den vi-Editor wurde eine exzellente Suchfunktion implementiert. Sie gestattet neben den normalen Suchvorgängen auch die Suche mittels regulärer Ausdrücke. Reguläre Ausdrücke haben Sie bereits in den vorangegangenen Kapiteln kennen gelernt.
Generell wird eine Suche mit einem Slash im Kommandomodus des Editors eingeleitet. Diesem Slash folgt anschließend der Suchbegriff, etwa
/Bewerbung.
Mithilfe von regulären Ausdrücken kann auch nach dem Zeilenanfang bzw. -ende, dem Wortanfang und -ende oder nach Strings mit beliebigen Zeichen etc. gesucht werden.
# Nach dem Wort ' awk ' suchen: /\ awk\ # Nach einer Zeile suchen, die mit 'Eine' beginnt: /^Eine # Suchen nach Wörtern, die auf 'h' enden. Dabei kann # hinter dem 'h' ein Leerzeichen, Punkt oder # Ausrufezeichen stehen: /?*h[\ .!]
Listing 6.3 Suchen nach Textstellen
Um zum nächsten Suchergebnis zu springen, muss lediglich erneut ein Slash im Kommandomodus eingetippt werden.
6.2.11 Konfiguration
Natürlich lässt sich der vi-Editor auch konfigurieren. Dies geschieht mit dem set-Kommando. Über einen Aufruf von :set all erhalten Sie eine Liste möglicher optionaler Einstellungen. Die folgende Auflistung enthält die wichtigsten davon: <Dabei ist zu beachten, dass einige Optionen durch »no« abgeschaltet werden. »noautoindent« stellt beispielsweise »autoindent« ab.>
- (no)autoindent
- Diese Option bewirkt, dass Einrückungen auch in Folgezeilen fortgeführt werden. Das ist sehr praktisch, wenn es um Programmierung geht.
- (no)number
- Diese Option schaltet die Zeilenzahlen an. Sie werden dabei am linken Rand des Editors angezeigt. Der Nachteil besteht im schwindenden Editierplatz.
- shiftwidth & tabstop
- shiftwidth wurde bereits weiter oben erläutert. Ähnlich wie shiftwidth legt tabstop eine Zeichen-Weite fest. Während shiftwidth die Shift-Weite, also die Einrück-Einheit festlegt, tut tabstop dies für die Tabulator-Einheit: :set tabstop/shiftwidth=x
- (no)showmatch
- Diese Option lässt Klammerpaare bei der Schließung aufblinken. Dies kann sich bei der Softwareentwicklung ebenfalls als sehr praktisch erweisen.
- (no)showmode
- Diese Option zeigt in der unteren rechten Ecke der Statuszeile den Modus an, in dem sich der Editor momentan befindet (etwa »append«, »command« oder »insert«).
Um diese Einstellungen dauerhaft zu setzen, sollte man diese in die Datei /.exrc eintragen:
set autoindent set number set showmode
Listing 6.4 Eine Beispiel .exrc-Datei