10.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. Vor allen Dingen aber ist er klein, schnell und überall verfügbar.
Abbildung 10.1 Der vi-Editor mit geladener httpd.conf
10.2.1 Den vi starten
Der Editor wird über die Kommandozeile aufgerufen. Dabei wird optional der Name einer zu editierenden oder neu zu erstellenden Datei [Fn. 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 [Fn. Der vi-Editor läuft nicht auf allen Terminals ganz perfekt. Ein VT100- oder VT220"=kompatibles Terminal sollte jedoch problemlos seinen Dienst tun.] zu sehen. Die Tilden 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:
Listing 10.1 Statuszeile
# Statuszeile bei einer neuen Datei:
/tmp/file: new file: line 1
# Statuszeile bei einer bereits gesicherten Datei:
/tmp/file: 1 lines, 5 characters.
10.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 überhaupt wieder heraus?
Ganz einfach: Zunächst wechseln Sie mit der Esc-Taste in den Kommandomodus. Anschließend können Sie in der Statuszeile (die nun zur Kommandozeile geworden ist) den Befehl zum Beenden eingeben. Da Steuerbefehle mit einem Doppelpunkt beginnen und zum Beenden der Quit-Befehl (q) verwendet wird, muss nun folglich :q eingegeben werden.
10.2.3 Dateien speichern
Dateien werden im Kommandomodus gespeichert. Das hierfür notwendige Kommando »write« (w) schreibt die Datei unter dem geöffneten Namen auf das Speichermedium. Allerdings kann auch ein Name für die Datei als Parameter für w übergeben werden: :w /home/user/test. Um zu speichern und gleichzeitig den Editor zu beenden, können die Befehle kombiniert werden: :wq [Dateiname].
[+]Soll ohne Rücksicht auf Verluste von veränderten Daten (also ohne die Änderungen zu
speichern) ein Quit durchgeführt werden oder sollen Veränderungen an einer schreibgeschützten Datei –
für die man natürlich Änderungsrechte besitzen muss – durchgeführt werden, muss dem
Kommando ein Ausrufezeichen übergeben werden: :q! beziehungsweise :w! oder :wq!.
10.2.4 Arbeiten mit dem Eingabemodus
Nach dem Start des vi-Editors befinden Sie sich zunächst im Kommandomodus. Um Text zu schreiben, wechseln Sie in den Eingabemodus. Dies kann mit verschiedenen Eingabekommandos erfolgen.
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 an einer Beispieldatei aus. Schreiben
Sie sich einfach eine Mail im vi, und senden Sie sich diese dann via Eingabeumlenkung mit dem mail-Programm selbst zu.
10.2.5 Navigation
Um sich im Text zu bewegen, greift man in der Regel auf die Cursor-Tasten zurück. Mit diesen allein sind leider oftmals längere Scroll-Abenteuer unvermeidlich. 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 zurück |
Strg + F |
eine Seite vorwärtsblättern (geht manchmal auch mit der Bild-Ab-Taste) |
Strg + B |
eine Seite zurückblä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 Compilierfehlern im Quellcode nachzugehen) |
[»]An älteren Unix-Terminals standen oftmals keine Cursor-Tasten zur Verfügung. Daher
kann auch mit den Befehlen h (rechts), j (runter), k (rauf) und l (links) navigiert werden. Dazu muss allerdings in den Kommandomodus gewechselt werden.
10.2.6 Löschen von Textstellen
Sofern Sie an die Editoren grafischer Oberflächen wie etwa aus der Windows-Welt gewöhnt sind, ist Ihnen bekannt, dass mit der Backspace-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öscht 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 Sie wieder rückgängig
machen möchten (etwa unbeabsichtigtes Überschreiben oder Löschen), so ist dies mit
dem Kommando u (undo) möglich. Doch beachten Sie, dass diese Möglichkeit nur für den jeweils letzten
Vorgang besteht. Sobald Sie hinter dem Wort, das Sie wieder löschen möchten, ein neues
Wort geschrieben haben, ist Ihnen diese Möglichkeit also verbaut. Da hilft nur das
vorher erstellte Backup oder das Beenden ohne Speichern (:q!).
10.2.7 Textbereiche ersetzen
Oftmals möchten Sie ein Wort nicht einfach nur löschen, sondern es überschreiben, einzelne Zeichen eines Wortes ersetzen oder Ähnliches. Dies können Sie mit den c-Kommandos umsetzen.
Kommando | Wirkung |
cw |
Überschreibt ein ganzes Wort. |
c$ und D |
Überschreibt vom aktuellen Punkt bis zum Ende der Zeile. |
c0 und c^ |
Überschreibt vom aktuellen Punkt bis zum Anfang der Zeile. |
cf[c] |
Überschreibt bis zum nächsten Zeichen »c« der aktuellen Zeile. |
[zB]Nehmen wir einmal an, der Inhalt einer Datei text.txt enthält den String »Dies 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 ...«:
Listing 10.2 So ändert man Textstellen.
# nach Aktivierung von 'cw':
Das is$ der Inhalt von 'test.txt'.
# daraus wird:
Das wird der Inhalt von 'text.txt'.
10.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« dahinter.
Möchte man den Text jedoch tatsächlich kopieren, so muss man das y-Kommando verwenden. Die Handhabung entspricht der des oben genannten dx-Kommandos. Der Unterschied besteht lediglich darin, dass der Text nicht gelöscht wird.
10.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 den Befehl :set shiftwidth=x gesetzt werden, wobei x die Anzahl der Zeichen ist, um die der Text verschoben werden soll.
10.2.10 Die Suchfunktion
Im vi wurde eine exzellente Suchfunktion implementiert. Sie gestattet neben den normalen Suchvorgängen auch die Suche mittels regulärer Ausdrücke, wie Sie sie bereits in Kapitel kap_regex kennengelernt haben.
Generell wird eine Suche mit einem Slash im Kommandomodus des Editors eingeleitet. Diesem Slash folgt der Suchbegriff, etwa /Bewerbung. Mithilfe von regulären Ausdrücken kann auch nach dem Zeilenanfang und -ende, nach dem Wortanfang und -ende oder nach Strings mit beliebigen Zeichen gesucht werden.
Listing 10.3 Suchen nach Textstellen
# 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[\ .!]
[+]Um zum nächsten Suchergebnis zu springen, muss lediglich erneut ein Slash im Kommandomodus
eingetippt werden.
10.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 fasst die wichtigsten zusammen: [Fn. 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. Dies ist sehr praktisch, wenn es um Programmierung geht. - (no)number
Diese Option schaltet die Zeilenzahlen an. Die Zahlen werden dabei am linken Rand des Editors angezeigt. Der Nachteil besteht im schwindenden Editierplatz. - shiftwidth & tabstop
shiftwidth wurde bereits weiter oben in Abschnitt vi_shiften 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 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 (z. B. »append«, »command« oder »insert«).
[»]Um diese Einstellungen dauerhaft zu setzen, sollte man sie in die Datei ~/.exrc eintragen:
Listing 10.4 Eine exemplarische .exrc-Datei
set autoindent
set number
set showmode
Ihr Kommentar
Wie hat Ihnen das <openbook> gefallen? Wir freuen uns immer über Ihre freundlichen und kritischen Rückmeldungen.