vi (visual display editor) ist der unter SunOS standardmäßig verwendete Texteditor. Da er zeichenorientiert und nicht fensterorientiert arbeitet, kann er auf allen Terminaltypen eingesetzt werden und unterstützt eine Vielzahl von Dateiformaten.
Sie können mit vi zwar Text eingeben und bearbeiten, aber nicht auf dem Bildschirm formatieren. vi ist deshalb kein Ersatz für ein echtes Textverarbeitungsprogramm. Um in vi eingegebenen Text für den Ausdruck zu formatieren, benötigen Sie ein Programm wie nroff, troff oder ditroff, das die in den Text eingefügten Formatierbefehle liest und in entsprechende Formate umsetzt.
Von dieser Einschränkung einmal abgesehen, ist vi jedoch ein außerordentlich mächtiger Editor, und neue Benutzer fühlen sich angesichts der Fülle teilweise überlappender Befehle und Funktionen zunächst oft überfordert. Dieses Kapitel soll daher nur einen Überblick über die wichtigsten vi-Befehle geben, mit denen Sie sich dann im Laufe der Zeit vertraut machen können.
Von vi gibt es auch eine Art Demoversion namens view. Wenn Sie eine Datei mit view öffnen, stehen zwar alle vi-Befehle zur Verfügung, die Datei kann jedoch nicht gespeichert werden. Auf diese Weise lassen sich versehentliche Änderungen am Dateiinhalt ausschließen.
In den folgenden Abschnitten erfahren Sie, wie Sie vi aufrufen, Text in eine Datei eingeben, die Datei speichern und vi beenden. Dabei erstellen Sie eine Übungsdatei, mit der Sie im weiteren Verlauf des Kapitels arbeiten.
Mit dem folgenden Befehl starten Sie vi und weisen das Programm gleichzeitig an, die Datei test zu öffnen:
$ vi test |
Existiert die Datei bereits, wird sie geladen. Ist eine Datei dieses Namens noch nicht vorhanden, erstellt der Editor sie. In den nachfolgenden Beispielen wird vorausgesetzt, daß test eine neue Datei ist.
Nach dem Aufruf von vi erscheint folgender Bildschirm:
Der Cursor wird in der oberen linken Ecke des Bildschirms angezeigt. Jede Tilde (~) steht für eine Leerzeile.
Sie können vi auch ohne Angabe eines Dateinamens starten und der Datei erst beim Verlassen des Editors einen Namen zuweisen.
In der Statuszeile am unteren Bildschirmrand werden der Dateiname und die Anzahl der Zeilen und Zeichen in der Datei angezeigt. Wenn Sie eine neue Datei erstellen, erscheint in der Statuszeile die Meldung Neue Datei.
vi unterstützt zwei Betriebsmodi: den Eingabemodus und den Befehlsmodus. Im Eingabemodus geben Sie Text in eine Datei ein, während der Befehlsmodus für die Eingabe von Befehlen vorgesehen ist, mit denen spezielle Editorfunktionen aufgerufen werden. Der Befehlsmodus ist der Standardmodus in vi.
Da vi den aktuellen Modus nicht anzeigt, wissen neue Benutzer häufig nicht, in welchem Modus sie sich gerade befinden, was dann leicht zu Verwirrung führt. vi-Probleme lassen sich jedoch weitgehend vermeiden, wenn Sie einige grundlegende Hinweise von Anfang an beachten.
Wenn Sie eine Datei das erste Mal öffnen, befindet sich vi im Befehlsmodus. Bevor Sie Text in die Datei eingeben können, müssen Sie also in den Eingabemodus wechseln. Dafür gibt es mehrere Befehle, z. B. i (insert), mit dem Sie Text an der Cursorposition einfügen, oder a (append), mit dem Sie Text nach der Cursorposition einfügen. (Diese und weitere Eingabebefehle werden später noch ausführlich behandelt.)
Mit der Taste Esc" kehren Sie in den Befehlsmodus zurück. Wenn Sie nicht sicher sind, in welchem Modus Sie sich befinden, können Sie mit Esc" also zunächst in den Befehlsmodus wechseln und dann gegebenenfalls wieder zum Eingabemodus umschalten. Befindet sich vi bereits im Befehlsmodus, wenn Sie Esc" drücken, blinkt der Bildschirm, und es wird ein akustisches Signal ausgegeben, das Sie aber ignorieren können.
Um mit der Texteingabe zu beginnen, geben Sie den Befehl i ein. Damit wechseln Sie in den Eingabemodus.
Geben Sie nun einige kurze Textzeilen ein, und beenden Sie jede Zeile mit Return". Die eingegebenen Zeichen erscheinen links vom Cursor, bereits vorhandene Zeichen werden dabei nach rechts verschoben. Tippfehler korrigieren Sie zunächst durch Löschen mit der Rücktaste (Back Space) und Neueingabe der Zeichen vor Beendigung einer Zeile mit Return".
Wenn Sie mit der Eingabe fertig sind, wechseln Sie mit Esc" zurück in den Befehlsmodus. Der Cursor springt dabei auf das zuletzt eingegebene Zeichen zurück.
Reagiert vi nicht wie erwartet, haben Sie möglicherweise versehentlich auf Großbuchstaben-Eingabe (Caps) umgeschaltet. Auf manchen Systemen wird dieser Modus mit der Taste F1" aktiviert, die sich normalerweise direkt neben der Taste Esc" befindet und daher oft anstelle von Esc" gedrückt wird.
Wenn auf dem Bildschirm verirrte" Systemmeldungen oder andere unerwünschte Zeichen auftauchen, wechseln Sie in den Befehlsmodus und drücken Ctrl-L". Damit weisen Sie vi an, den Bildschirminhalt neu zu zeichnen. Dieser Befehl ähnelt dem OpenWindows-Dienstprogramm Aktualisieren".
Nach dem Öffnen einer Datei befindet sich vi im Befehlsmodus. In diesem Modus können Sie Befehle eingeben, mit denen bestimmte Funktionen ausgelöst werden. Die meisten Editorbefehle bestehen aus einem oder zwei Buchstaben und mitunter auch einer Zahl. Groß- und Kleinbuchstaben haben bei vi-Befehlen meist unterschiedliche Bedeutung. Mit dem Befehl a fügen Sie beispielsweise Zeichen rechts vom Cursor ein, während Sie mit dem Befehl A Zeichen am Ende der Zeile einfügen.
Die meistben Befehle werden automatisch ausgeführt. Return" müssen Sie nur bei Befehlen drücken, die mit einem Doppelpunkt beginnen. Da diese Befehle bei der Eingabe in der Statuszeile angezeigt werden, spricht man mitunter auch vom Statuszeilenmodus als drittem Betriebsmodus. In diesem Handbuch wird jedoch nur zwischen Eingabe- und Befehlsmodus unterschieden.
Mit einem Doppelpunkt beginnende Befehle sind eigentlich ex-Befehle. vi und ex sind jedoch keine separaten Programme, sondern lediglich zwei verschiedene Schnittstellen zu dem gleichen Textbearbeitungsprogramm. vi ist eine bildschirmorientierte Schnittstelle, während ex zeilenorientiert arbeitet. Wenn Sie im Befehlsmodus einen Doppelpunkt eingaben, schalten Sie automatisch auf die Schnittstelle ex um und können so auf den gesamten Funktionsumfang von ex zugreifen, ohne vi verlassen zu müssen. Weitere Hinweise zu diesem Thema finden Sie im Abschnitt "6.6 ex-Befehle".
Bei der Bearbeitung einer Datei mit vi werden die Änderungen nicht direkt in die Datei geschrieben, sondern in eine von vi erzeugte Kopie, die sich in einem temporären Speicherbereich, dem Dateipuffer, befindet. Wenn Sie den Inhalt des Puffers speichern, wird er in die auf der Platte gespeicherte Datei übernommen.
Dieses Verfahren hat Vor- und Nachteile. Einerseits können Sie die Bearbeitung einer Datei jederzeit abbrechen, ohne die Kopie auf der Festplatte zu ändern, andererseits geht der ungesicherte Inhalt des Puffers bei einem Systemabsturz verloren. (Von solchen unvorhergesehenen Unterbrechungen sind vor allem Benutzer entfernter Terminals betroffen, die über Telefonleitungen mit dem Server verbunden sind.)
Am besten schützen Sie sich vor Datenverlusten, wenn Sie Ihre Arbeit regelmäßig, zumindest aber jedesmal nach einer größeren Änderung sichern.
Sie können eine Datei im Prinzip in mehreren, gleichzeitig ablaufenden vi-Sitzungen bearbeiten. Weil Sie dabei aber häufig nicht mehr eindeutig nachvollziehen können, welche Änderungen bereits in die Datei geschrieben bzw. von anderen Sitzungen überschrieben wurden, ist dieses Verfahren nicht zu empfehlen.
vi verfügt über eine Vielzahl von Befehlen zum Speichern des Pufferinhalts und zum Verlassen des Editors, die nur geringfügig voneinander abweichen. Grundsätzlich unterscheidet man zwischen Speichern, Speichern und Beenden und Beenden ohne Speichern.
Um den Inhalt des Puffers in die Datei auf der Platte zu schreiben, geben Sie folgenden Befehl ein:
:w |
Da der Befehl mit einem Doppelpunkt beginnt, müssen Sie zum Abschluß Return" drücken.
Mit folgendem Befehl speichern Sie den Inhalt des Puffers und beenden vi:
:wq |
Sie können statt dessen auch ZZ eingeben. In diesem Fall schließen Sie die Eingabe nicht mit Return" ab.
Wenn Sie die Datei nicht geändert haben und den Editor verlassen wollen, geben Sie folgenden Befehl ein:
:q |
Auch hier müssen Sie die Eingabe mit Return" abschließen. Wenn Sie Änderungen vorgenommen haben, erscheint die Meldung Kein Schreibvorgang seit letzter Änderung (:quit! setzt außer Kraft), und vi wird nicht beendet.
Sollen vorhandene Änderungen nicht übernommen werden, geben Sie folgenden Befehl ein
:q! |
und drücken anschließend Return".
Um eine gespeicherte Datei zu drucken, verlassen Sie vi und geben folgenden Befehl ein:
$ lp dateiname |
dateiname steht für den Namen der Datei, die gedruckt werden soll. Die Datei wird auf dem Standarddrucker ausgegeben, und zwar unformatiert, also genau so, wie sie auf dem Bildschirm erscheint. Weitere Informationen zu Druckbefehlen finden Sie in Kapitel 8.
In den folgenden Abschnitten werden vi-Befehle für verschiedene Aufgabenstellungen behandelt:
Navigationsbefehle
Text einfügen
Text ändern und ersetzen
Änderungen rückgängig machen
Text löschen
Text kopieren und verschieben
Befehle wiederholen
Navigationsbefehle sind Befehle, mit denen Sie den Cursor durch den Text bewegen oder unterschiedliche Ausschnitte einer Datei auf dem Bildschirm anzeigen. Da diese Befehle für die Textbearbeitung besonders wichtig sind, sollten Sie sie beim Lesen der folgenden Abschnitte in Ihrer Beispieldatei ausprobieren.
Nach dem Start von vi befindet sich der Cursor in der oberen linken Ecke des Bildschirms. Im Befehlsmodus bewegen Sie den Cursor mit den Pfeiltasten, der Leertaste und einigen anderen Tasten sowie durch Eingabe von Befehlen.
vi unterscheidet bei der Befehlseingabe zwischen Groß- und Kleinschreibung. Wenn Sie den gleichen" Befehl in Großbuchstaben und Kleinbuchstaben eingeben, kann es also zu sehr unterschiedlichen Ergebnissen kommen.
Wenn auf Ihrer Tastatur Pfeiltasten vorhanden sind, können Sie den Cursor damit beliebig nach oben, unten, rechts und links durch den vorhandenen Text (und die angezeigten Leerzeilen) bewegen.
Wenn Sie auf einem entfernten Terminal mit vi arbeiten, funktioniert diese Methode mitunter nicht, da manche Terminalemulatoren die Pfeiltasten nicht unterstützen. In diesem Fall können Sie ersatzweise folgende Tasten verwenden:
Mit w bewegen Sie den Cursor zum nächsten Wort oder Satzzeichen.
Mit b bewegen Sie den Cursor zum vorhergehenden Wort oder Satzzeichen.
Mit W oder B setzen Sie den Cursor auf das Leerzeichen vor dem nächsten bzw. vorherigen Wort. Satzzeichen werden dabei übersprungen.
Mit e bewegen Sie den Cursor auf das letzte Zeichen des aktuellen Worts.
Mit ^ bewegen Sie den Cursor auf das erste Zeichen der aktuellen Zeile.
Mit $ bewegen Sie den Cursor auf das letzte Zeichen der aktuellen Zeile.
Mit Return" bewegen Sie den Cursor auf den Anfang der nächsten Zeile.
Mit der Rücktaste bewegen Sie den Cursor um ein Zeichen nach links.
Mit der Leertaste bewegen Sie den Cursor um ein Zeichen nach rechts.
Mit H (High") bewegen Sie den Cursor an den Anfang des Bildschirms.
Mit M bewegen Sie den Cursor in die Mitte des Bildschirms.
Mit L bewegen Sie den Cursor an das Ende des Bildschirms.
vi zeigt immer eine Bildschirmseite aus der Textdatei an. Wenn Sie sich am oberen oder unteren Bildschirmrand befinden und den Cursor weiter nach oben oder unten bewegen, wird der Text in die entsprechende Richtung bewegt, so daß vorher nicht sichtbare Zeilen erscheinen. Dieses Verfahren ist bei langen Dateien jedoch sehr umständlich.
Sie können den Bildschirminhalt auch gleich um eine ganze oder halbe Bildschirmseite nach oben oder unten verschieben. (Wenn Sie das in Ihrer Beispieldatei ausprobieren möchten, müssen Sie weiteren Text eingeben.)
Auf einem schnellen System bestehen zwischen dem zeilenweisen und bildschirmweisen Verschieben oft keine großen Geschwindigkeitsunterschiede. Auf einem entfernten Terminal oder einer durch andere Prozesse bereits stark belasteten Workstation nimmt die Geschwindigkeit beim zeilenweisen Verschieben dagegen stark ab.
Mit Ctrl-F" zeigen Sie die nächste Bildschirmseite an. Der Cursor springt dabei auf das erste Zeichen der neuen Seite.
Mit Ctrl-D" verschieben Sie den Bildschirminhalt um eine halbe Seite nach unten.
Mit Ctrl-B" zeigen Sie die vorhergehende Bildschirmseite an.
Mit Ctrl-U" verschieben Sie den Bildschirminhalt um eine halbe Seite nach oben.
vi verfügt über eine ganze Reihe von Befehlen für die Texteingabe, von denen hier nur die wichtigsten vorgestellt werden. Mit jedem dieser Befehle wechseln Sie gleichzeitig in den Eingabemodus. Wenn Sie sich bereits im Eingabemodus befinden, müssen Sie zuerst mit Esc" in den Befehlsmodus zurückkehren.
Mit dem Befehl a legen Sie fest, daß der danach eingegebene Text rechts vom Cursor erscheinen soll. Bewegen Sie den Cursor jetzt auf eine Leerzeile, geben Sie a und danach den gewünschten Text ein, und drücken Sie nach der Eingabe Esc".
Soll der eingegebene Text am Ende der aktuellen Zeile erscheinen, geben Sie statt dessen A ein. Bewegen Sie den Cursor auf eine Textzeile, geben Sie A und den gewünschten Text ein und drücken Sie zum Schluß Esc".
Mit dem Befehl i legen Sie fest, daß der neue Text links vom Cursor eingesetzt werden soll.
Wenn Sie stattdessen I eingeben, wird der Text am Anfang der aktuellen Zeile eingefügt. Probieren Sie beide Befehle aus, und wechseln Sie danach mit Esc" in den Befehlsmodus zurück.
Mit den folgenden Befehlen fügen Sie über oder unter der aktuellen Cursorposition neue Zeilen ein.
Mit o öffnen Sie eine Zeile unter der aktuellen Zeile. Geben Sie jetzt o und ein oder mehrere Textzeilen ein, und drücken Sie zum Schluß wieder Esc".
Mit O öffnen Sie eine Zeile über der aktuellen Zeile.
Wenn Sie Text ändern, ersetzen Sie einen Textblock durch einen anderen. vi bietet dafür mehrere Möglichkeiten.
Um ein Wort durch ein anderes zu ersetzen, setzen Sie den Cursor im Befehlsmodus an den Anfang des Worts und geben cw und danach das neue Wort ein. Danach wechseln Sie mit Esc" zurück in den Befehlsmodus.
Um ein Wort teilweise zu ersetzen, bewegen Sie den Cursor auf das erste Zeichen des zu löschenden Teils, geben cw und die neue Zeichenfolge ein und drücken zum Schluß Esc".
Um eine Zeile zu ersetzen, bewegen Sie den Cursor auf ein beliebiges Zeichen in der Zeile und geben cc ein. Die Zeile wird geleert, d. h. es bleibt eine Leerzeile zurück, in die Sie neuen Text eingeben können. Drücken Sie zum Abschluß Esc".
Um einen Teil einer Zeile zu ersetzen, bewegen Sie den Cursor auf das erste Zeichen des zu löschenden Teils, geben C und den neuen Text ein und drücken zum Schluß Esc". Damit werden alle Zeichen von der Cursorposition bis zum Ende der Zeile gelöscht und durch den neu eingegebenen Text ersetzt.
Um ein Zeichen durch eines oder mehrere andere Zeichen zu ersetzen, bewegen Sie den Cursor auf das Zeichen, geben s und die neuen Zeichen ein und drücken Esc", um in den Befehlsmodus zurückzukehren.
Wenn Sie ein Zeichen durch ein einzelnes anderes Zeichen ersetzen wollen, bewegen Sie den Cursor auf das zu löschende Zeichen und geben r und das neue Zeichen ein. Bei diesem Befehl brauchen Sie Esc" nicht zu drücken, da vi automatisch in den Befehlsmodus zurückkehrt.
Verdreher" lassen sich mit vi recht einfach korrigieren. Nehmen wir an, Sie haben "udn" statt "und" eingegeben. Um den Fehler zu korrigieren, bewegen Sie den Cursor auf das erste Zeichen, das vertauscht werden soll (also das d) und geben xp ein. Das d und das h werden vertauscht, und vi wechselt automatisch zurück in den Befehlsmodus.
Um eine Zeile zu teilen, ohne den Text zu verändern, setzen Sie den Cursor auf ein Leerzeichen in der Zeile, geben r ein und drücken Return". Steht der Cursor dabei auf einem Zeichen, wird es durch das Zeichen Return" (also eine Zeilenschaltung) ersetzt.
Um zwei Zeilen zusammenzuführen, setzen Sie den Cursor auf die obere Zeile und geben J ein. vi bleibt dabei im Befehlsmodus, so daß Sie Esc" nicht zu drücken brauchen.
Wenn Sie Text versehentlich ändern oder eine Änderung nicht das gewünschte Ergebnis hat, können Sie mit einem der folgenden Befehle den ursprünglichen Zustand wiederherstellen.
Mit dem Befehl u machen Sie den zuletzt eingegebenen Befehl rückgängig. (vi bleibt dabei im Befehlsmodus.) Wenn Sie u ein zweites Mal drücken, wird u selbst rückgängig gemacht, d. h. die Änderung wird wiederhergestellt.
Mit dem Befehl U nehmen Sie alle Änderungen zurück, die Sie in der aktuellen Zeile gemacht haben, seitdem sich der Cursor darin befindet. Auch bei diesem Befehl brauchen Sie nach der Eingabe nicht Esc" zu drücken.
Mit den folgenden Befehlen löschen Sie Zeichen, Wörter oder ganze Zeilen. vi bleibt dabei im Befehlsmodus, so daß Sie vor Eingabe neuer Zeichen zuerst in den Eingabemodus wechseln müssen.
Mit dem Befehl x löschen Sie das Zeichen an der Cursorposition.
Wenn Sie ein Zeichen innerhalb einer Zeile löschen, werden die rechts davon stehenden Zeichen um eine Stelle nach links verschoben, so daß keine Lücke zurückbleibt. Sie können mit x auch Leerzeichen löschen.
Um das Zeichen links vom Cursor zu löschen, geben Sie X ein.
Um ein Wort zu löschen, setzen Sie den Cursor auf das erste Zeichen des Worts und geben dw ein. Soll nur ein Teil des Worts gelöscht werden, setzen Sie den Cursor auf das erste zu löschende Zeichen.
Um eine Zeile zu löschen, setzen Sie den Cursor auf ein beliebiges Zeichen in der Zeile und geben dd ein. Damit löschen Sie nicht nur den Text in der Zeile, sondern auch die Zeile selbst.
Sie können auch nur einen Teil einer Zeile löschen.
Wenn Sie nur einen Teil einer Zeile löschen wollen, setzen Sie den Cursor auf das erste zu löschende Zeichen und geben D ein. Damit löschen Sie alle Zeichen von der Cursorposition bis zum Zeilenende.
Um alle Zeichen von der Cursorposition bis zum Zeilenanfang zu löschen, geben Sie statt dessen d0 (d-Null) ein.
Um den gesamten Text von der aktuellen Zeile bis zum Dateiende zu löschen, geben Sie dG ein. Die aktuelle Zeile wird dabei ebenfalls gelöscht.
Um den gesamten Text von der aktuellen Zeile bis zum Dateianfang zu löschen, geben Sie d1G ein. Die aktuelle Zeile wird dabei ebenfalls gelöscht.
In vielen Textverarbeitungsprogrammen können Sie Text kopieren oder ausschneiden und an einer anderen Stelle wieder einsetzen. vi bietet die gleichen Funktionen, die im Englischen yank and put (Kopieren und Einsetzen) und delete and put (Ausschneiden und Einsetzen) heißen.
Beim Kopieren von Zeilen verwenden Sie zwei Befehle: yy oder Y (diese beiden Befehle haben die gleiche Funktion) und p (unten einsetzen) oder P (oben einsetzen).
Um die Zeile zu kopieren, setzen Sie den Cursor auf ein beliebiges Zeichen in der Zeile und geben yy ein. Danach bewegen Sie den Cursor auf die Zeile, unter der die kopierte Zeile eingefügt werden soll, und geben p ein.
Soll die kopierte Zeile über der aktuellen Zeile eingesetzt werden, geben Sie P ein.
Der Befehl yy kann auch auf mehrere Zeilen angewendet werden: Mit 11yy kopieren Sie beispielsweise die aktuelle Zeile und die folgenden zehn Zeilen. Dabei erscheint in der Statuszeile die Meldung 11 Zeilen kopiert.
Die Befehle P und p können auch zusammen mit den zuvor beschriebenen Löschbefehlen verwendet werden, um gelöschten Text über oder unter der Cursorposition wieder einzusetzen.
Da gelöschte oder kopierte Textblöcke in einen Puffer übertragen werden, dürfen Sie vor dem Einsetzen eines Blocks nur Befehle verwenden, mit denen der Cursor bewegt wird. Wenn Sie einen anderen Textblock löschen oder kopieren, wird der Inhalt des Puffers überschrieben.
Beim Bewegen von Zeilen verwenden Sie ebenfalls zwei Befehle: dd und p oder P.
Um eine Zeile zu bewegen, setzen Sie den Cursor auf die Zeile und geben dd ein. Damit löschen Sie die Zeile und übertragen sie in den Puffer. (Sie können auch mehrere Zeilen löschen. Mit 5dd löschen Sie beispielsweise die aktuelle Zeile und die darunterstehenden vier Zeilen.)
Danach bewegen Sie den Cursor auf die Zeile, unter der die gelöschte Zeile eingefügt werden soll, und geben p ein.
Soll die gelöschte Zeile über der aktuellen Zeile eingesetzt werden, geben Sie P ein.
Der Inhalt des Standardpuffers wird, wie bereits erwähnt, jedesmal überschrieben, wenn Sie einen neuen Textblock löschen oder kopieren. Wenn Sie eine oder mehrere Zeilen an verschiedenen Stellen einer Datei einsetzen wollen, können Sie sie in einen benannten Puffer löschen bzw. kopieren. Der Inhalt eines benannten Puffers wird erst überschrieben, wenn Sie eine andere Zeilengruppe explizit darin ablegen.
Um eine oder mehrere Zeilen in einem benannten Puffer zu speichern, stellen Sie vor den Lösch- oder Kopierbefehl ein doppeltes Anführungszeichen (") und den Namen des Puffers. Mit dem Befehl "a4yy kopieren Sie beispielsweise die aktuelle Zeile und die folgenden drei Zeilen in einen Puffer namens a". Mit dem Befehl "b12dd löschen Sie 12 Zeilen in einen Puffer namens b". Sie können auch mehrere Puffer verwenden.
Um Text aus einem Puffer in die Datei einzusetzen, stellen Sie vor den Befehl p oder P ein doppeltes Anführungszeichen und den Namen des Puffers (z. B. "bP).
Wenn Sie die aktuelle Arbeitssitzung beenden, wird der Inhalt aller benannten Puffer gelöscht.
Viele vi-Befehle können zusammen mit einem Zähler eingegeben werden, d. h. mit einer Zahl, die vor dem Befehl steht und angibt, wie oft der Befehl wiederholt werden soll.
Die meisten der bisher behandelten Befehle unterstützen Zähler. Mit 3dd weisen Sie vi beispielsweise an, den Befehl dd dreimal auszuführen und so die aktuelle Zeile und die beiden darauffolgenden Zeilen zu löschen. Mit 2dw löschen Sie zwei Wörter, mit 4x vier Zeichen usw. Zähler können auch bei der Cursorsteuerung verwendet werden. Mit 2Ctrl-F" wechseln Sie zum Beispiel zur übernächsten Bildschirmseite. In den Beschreibungen der weiteren vi-Befehle werden Sie andere Möglichkeiten für die Verwendung von Zählern kennenlernen. Im Abschnitt "6.12 Befehlsübersicht"am Ende dieses Kapitels ist zu Befehlen, die Zähler unterstützen, ein entsprechendes Beispiel angegeben.
Durch Eingabe eines Punkts (.) wiederholen Sie den letzten Textbearbeitungsbefehl. Wenn Sie beispielsweise gerade eine Zeile mit dd gelöscht haben und eine weitere Zeile löschen wollen, setzen Sie den Cursor in diese Zeile und geben einen Punkt ein.
Wenn Sie mit größeren Textblöcken arbeiten, sind ex-Befehle praktischer als die zuvor beschriebenen vi-Befehle. Anstatt die zu löschenden oder zu kopierenden Zeilen zu zählen und dann einen Einfügepunkt zu setzen, geben Sie einfach einen Zeilenbereich an und legen fest, nach welcher Zeilennummer diese Zeilen eingesetzt werden sollen.
Um die Bildschirmzeilen zu numerieren, geben Sie type :set nu ein und drücken Return".
Die Zeilennummern werden am linken Bildschirmrand angezeigt. Wenn Sie die Datei drucken, werden die Nummern nicht ausgegeben.
Um die Ausgabe der Zeilennummern zu deaktivieren, geben Sie :set nonu ein und drücken Return".
Der Kopierbefehl von ex wird in folgendem Format eingegeben:
:zeile#,zeile# co zeile# |
Die beiden ersten, durch ein Komma getrennten Zeilennummern geben den zu kopierenden Bereich an. Die dritte Nummer bezeichnet die Zeile, unter der die kopierten Zeilen eingefügt werden sollen.
Um die Zeilen 1 bis 5 in der Datei test zu kopieren und unter der Zeile 12 einzusetzen, würden Sie also folgendes eingeben:
:1,5 co 12 |
Schließen Sie die Eingabe mit Return" ab.
Bei der Angabe des Zeilenbereichs können Sie zwei Abkürzungen verwenden:
Mit dem folgenden Befehl kopieren Sie den Bereich von der aktuellen Zeile bis Zeile 5 und setzen die kopierten Zeilen nach Zeile 12 ein:
:.,5 co 12 |
Mit dem folgenden Befehl kopieren Sie alle Zeilen von Zeile 6 bis zum Dateiende und setzen die kopierten Zeilen nach Zeile 2 ein:
:6,$ co 2 |
Der Befehl zum Bewegen von Zeilen ist dem oben beschriebenen Kopierbefehl sehr ähnlich:
:zeile#,zeile# m zeile# |
Zeilenbereich und Einfügepunkt werden ebenso angegeben wie beim Kopieren von Zeilen. Die Abkürzungen . und $ sind ebenfalls zulässig. Der Bereich wird hier jedoch nicht kopiert, sondern ausgeschnitten und an einer anderen Stelle wieder eingesetzt.
Um die Zeilen 1 bis 5 zu löschen und nach Zeile 12 wieder einzusetzen, geben Sie folgenden Befehl ein und drücken Return":
:1,5 m 12 |
Mit folgendem Befehl löschen Sie eine Gruppe von Zeilen:
:zeile#,zeile# d |
Um die Zeilen 1 bis 5 zu löschen, geben Sie also folgendes ein:
:1,5 d |
vi bietet mehrere Befehle, mit denen Sie innerhalb einer Datei nach Zeichenfolgen suchen und diese durch andere Zeichenfolgen ersetzen können.
Eine Zeichenfolge ist eine beliebige Kombination aus Buchstaben, Zahlen, Satzzeichen und Sonderzeichen wie Tabs, Zeilenschaltungen und Leerzeichen. Zeichenfolgen können aus einem Teil eines Worts, einem vollständigen Wort oder mehreren Wörtern bestehen.
Um ab der aktuellen Cursorposition in Richtung Dateiende nach einer Zeichenfolge zu suchen, geben Sie einen Schrägstrich (/) und den Suchtext ein und schließen die Eingabe mit Return" ab. Der Cursor springt daraufhin auf die nächste Stelle, an der die Zeichenfolge vorkommt.
Wenn in Richtung Dateianfang gesucht werden soll, geben Sie statt / das Zeichen ? ein. Damit wird die Suchrichtung von n und N umgekehrt.
Danach können Sie den Suchvorgang mit n und N beliebig oft wiederholen, wobei n immer in Standardrichtung und N in umgekehrter Richtung sucht.
Normalerweise wird Groß- und Kleinschreibung beachtet, d. h. wenn Sie nach modus" suchen, wird Modus" nicht gefunden. Soll die Schreibweise ignoriert werden, geben Sie :set ic ein. Diese Einstellung gilt dann solange, bis Sie sie mit :set noic deaktivieren.
Ist die gesuchte Zeichenfolge nicht vorhanden, wird in der Statuszeile die Meldung Muster nicht gefunden angezeigt.
Einige Sonderzeichen ( / & ! . ^ * $ \ ?) haben bei Suchläufen spezielle Bedeutung und müssen daher durch einen vorangestellten Gegenschrägstrich entwertet werden, wenn sie als normale Textzeichen interpretiert werden sollen. Um beispielsweise nach der Zeichenfolge wieso?" zu suchen, geben Sie /wieso\? ein und drücken Return". Um einen Gegenschrägstrich zu entwerten, geben Sie \\ ein.
Die Verwendung dieser Sonderzeichen als Befehle bei einem Suchlauf wird im folgendem Abschnitt beschrieben.
Um genauer zu suchen, können Sie in der Zeichenfolge bestimmte Suchkriterien durch Sonderzeichen angeben:
Zeilenanfang
Zeilenende
Wortanfang
Wortende
Metazeichen
Der Zirkumflex (^) steht für den Anfang einer Zeile. Mit folgendem Befehl suchen Sie nach der nächsten Zeile, die mit der Zeichenfolge Test" beginnt:
/^Test |
Das Dollarzeichen ($) steht für das Ende einer Zeile. Mit folgendem Befehl suchen Sie nach der nächsten Zeile, die mit test." endet (da der Punkt auch als Suchkriterium verwendet werden kann, muß er entwertet werden):
/test\.$ |
Die Zeichenkombinationen \< und \> stehen für den Anfang bzw. das Ende eines Worts und werden an den Anfang und das Ende des Suchtexts gestellt. Auf diese Weise können Sie den Editor anweisen, nach vollständigen Wörtern zu suchen. Bei Eingabe des folgenden Befehls wird also nur das Wort Test" selbst gefunden, andere Wörter, die mit Test" beginnen, dagegen nicht:
/\<Test\> |
Der Punkt (.) steht für ein beliebiges Zeichen. Mit dem folgenden Befehl wird sowohl nach Test" wie nach Text" gesucht:
/Te.t |
Da Sie hier nach einer Zeichenfolge und nicht nach einem Wort suchen, werden auch Wörter wie Testlauf" oder Textverarbeitung" gefunden.
Es gibt noch eine weitere, vielseitigere Möglichkeit, nach verschiedenen Schreibweisen einer Zeichenfolge zu suchen. Dabei setzen Sie die alternativ zu verwendenden Zeichen in eckige Klammern. Wenn Sie /[mh]zeichenfolge eingeben, kann die gesuchte Zeichenfolge also mit m" oder h" beginnen. Geben Sie statt dessen /[d-m]zeichenfolge ein, kann die Zeichenfolge mit einem beliebigen Buchstaben von d" bis m" beginnen.
Der Stern (*) steht für eine beliebige Anzahl (auch Null) des vorhergehenden Zeichens. Durch Kombination mit den Klammern läßt sich die Suche weiter präzisieren. Um zum Beispiel nach allen Zeichenfolgen zu suchen, die mit einem beliebigen Buchstaben beginnen und mit ist" enden, und dabei auch die Zeichenfolge ist" selbst einzuschließen, geben Sie folgendes ein:
/[a-z]*ist |
Wenn Sie eine Zeichenfolge im gesamten Text durch eine andere ersetzen wollen, geben Sie den Suchbefehl in folgendem Format ein:
:g/suchtext/s//ersatztext/g |
Die Eingabe wird mit Return" abgeschlossen. Alle im vorherigen Abschnitt beschriebenen Sonderzeichen können auch beim Ersetzen von Zeichenfolgen verwendet werden.
Um die Zeichenfolge Computer" durch Workstation" zu ersetzen, würden Sie also folgendes eingeben:
:g/Computer/s//Workstation/g |
Wenn Sie nicht sicher sind, ob Sie eine Zeichenfolge überall ersetzen wollen, beenden Sie den Befehl mit gc statt mit g. In diesem Fall werden Sie bei jeder gefundenen Textstelle gefragt, ob die Zeichenfolge tatsächlich ersetzt werden soll. Sie können dann mit y (ja) oder n (nein) antworten.
:g/Computer/s//Workstation/gc |
Wenn der Suchlauf mit Bestätigung durchgeführt wird, können Sie ihn mit Ctrl-C" abbrechen.
Mit dem Befehl G springen Sie zur letzten Zeile einer Datei. Um in eine beliebige andere Zeile zu wechseln, geben Sie vor dem Befehl die Nummer der gewünschten Zeile ein. Mit 1G setzen Sie den Cursor also in die erste Zeile der Datei.
Wenn Sie die Datei test beispielsweise bis Zeile 51 bearbeitet und die Arbeitssitzung danach beendet haben, geben Sie nach dem nächsten Öffnen einfach 51G ein und können dann an der Stelle weiterarbeiten, an der Sie zuvor aufgehört hatten.
Mit folgendem Befehl können Sie den Inhalt einer Datei an einer beliebigen Stelle in die aktuell bearbeitete Datei einsetzen:
:zeile# r dateiname |
Wenn Sie keine Zeilennummer angeben, wird die Datei an der aktuellen Cursorposition eingefügt.
Um die Datei orwell nach Zeile 84 der Datei test einzusetzen, würden Sie also folgendes eingeben:
:84 r orwell |
Sie könnten statt dessen auch den Cursor in Zeile 84 setzen und folgenden Befehl eingeben:
:r orwell |
Sie können mit vi auch mehrere Dateien in einer Editorsitzung bearbeiten. Um beispielsweise zwischen der Datei test und einer Datei namens orwell: zu wechseln, gehen Sie folgendermaßen vor:
Geben Sie :w ein, und drücken Sie Return", um die aktuellen Änderungen an der Datei test zu speichern.
Geben Sie :n orwell ein, und drücken Sie Return", um die Datei orwell zu laden.
Bearbeiten Sie die Datei orwell, und speichern Sie die Änderungen.
Danach haben Sie folgende Möglichkeiten:
Wenn Sie mehrere Dateien nacheinander bearbeiten wollen, geben Sie beim Aufruf von vi die Namen der Dateien an:
$ vi test orwell |
Die Dateien werden in der Reihenfolge geladen, in der sie in der Befehlszeile aufgeführt sind. In unserem Beispiel erscheint also zuerst test. Wenn Sie mit der Bearbeitung dieser Datei fertig sind, geben Sie :n ein, um zur Datei orwell zu wechseln. Wenn Sie zur nächsten Datei übergehen wollen, ohne die Änderungen in der aktuellen Datei zu speichern, geben Sie :n! ein.
Haben die zu bearbeitenden Dateien ähnliche Namen (z. B. test1, test2, test3), können Sie bei der Eingabe der Dateinamen Platzhalter verwenden:
$ vi test* |
In diesem Fall werden die Dateien in alphabetischer Reihenfolge geladen.
Um Zeilen aus einer Datei in eine andere Datei zu kopieren, gehen Sie wie folgt vor:
Bearbeiten Sie die erste Datei.
Kopieren Sie die gewünschten Zeilen in einen benannten Puffer. Verwenden Sie hierzu den Befehl yank. Um z. B. 10 Zeilen in Puffer a zu speichern, geben sie a10y ein.
Wechseln Sie zur nächsten Datei (hier ist es die Datei orwell), ohne vi zu verlassen:
:n orwell |
Setzen Sie den Inhalt des benannten Puffers in die Datei ein. Verwenden Sie hierzu den Befehl put. Um beispielsweise den Inhalt von Puffer a unterhalb der aktuellen Cursorposition einzusetzen, geben Sie ap ein.
Da der Inhalt benannter Puffer verlorengeht, wenn Sie vi beenden, müssen Sie Prozeduren wie die zuvor beschriebene immer während der aktuellen Arbeitssitzung abschließen.
vi unterstützt eine Reihe von Optionen, mit denen Sie das Verhalten des Editors beeinflussen können. Um diese Optionen während einer Arbeitssitzung anzuzeigen, geben Sie folgenden Befehl ein:
:set all |
Schließen Sie die Eingabe mit Return" ab.
Wenn Ihr System abstürzt, besteht die Gefahr, daß der Inhalt des Dateipuffers verlorengeht. Der Pufferinhalt läßt sich jedoch durch einen Neustart von vi mit der Option -r häufig ganz oder teilweise wiederherstellen:
vi -r dateiname |
dateiname ist der Name der Datei, die zum Zeitpunkt des Systemabsturzes bearbeitet wurde. In der Regel werden Sie nach dem Wiederhochfahren des Systems per elektronische Post informiert, daß eine Recover-Datei vorhanden ist.
In der folgenden Tabelle sind die wichtigsten vi-Befehle zusammengefaßt.
Tabelle 6-1 vi-Befehle
Befehl |
Beschreibung |
---|---|
vi starten |
|
vi dateiname |
Öffnet eine Datei oder erstellt eine neue Datei |
vi |
Öffnet eine neue Datei ohne Namen |
vi -r dateiname |
Stellt eine Datei nach einem Systemabsturz wieder her |
Öffnet eine Nur-Lese-Datei |
|
Cursorbefehle |
|
h |
Ein Zeichen nach links |
j |
Eine Zeile nach unten |
k |
Eine Zeile nach oben |
l |
Ein Zeichen nach rechts |
w |
Zum nächsten Wort oder Satzzeichen |
W |
Zum nächsten Wort |
b |
Zum vorhergehenden Wort oder Satzzeichen |
B |
Zum vorhergehenden Wort |
e |
An das Ende des aktuellen Worts |
Return |
Eine Zeile nach unten |
Rücktaste |
Ein Zeichen nach links |
Leertaste |
Ein Zeichen nach rechts |
H |
Zur ersten Bildschirmzeile |
M |
Zur Mitte des Bildschirms |
L |
Zur letzten Bildschirmzeile |
Ctrl-F" |
Zur nächsten Bildschirmseite |
Ctrl-D" |
Eine halbe Bildschirmseite nach unten |
Ctrl-B" |
Zur vorhergehenden Bildschirmseite |
Ctrl-U" |
Eine halbe Bildschirmseite nach oben |
Texteingabe |
|
a |
Zeichen rechts vom Cursor einfügen |
A |
Zeichen am Zeilenende einfügen |
i |
Zeichen links vom Cursor einfügen |
I |
Zeichen am Zeilenanfang einfügen |
o |
Zeile unter dem Cursor einfügen |
O |
Zeile über dem Cursor einfügen |
Textänderung |
|
cw |
Wort rechts vom Cursor ändern |
cc |
Zeile ändern |
C |
Zeile ab Cursorposition ändern |
s |
Zeile bis Cursorposition ändern |
r |
Aktuelles Zeichen ersetzen |
r Return |
Zeile teilen |
J |
Aktuelle und darunterstehende Zeile zusammenführen |
xp |
Aktuelles und rechts davon stehendes Zeichen vertauschen |
~ | |
u |
Letzten Befehl rückgängig machen |
U |
Alle Änderungen an der aktuellen Zeile aufheben |
Letzten ex-Befehl rückgängig machen |
|
Löschen |
|
x |
Aktuelles Zeichen löschen |
X |
Zeichen links vom Cursor löschen |
dw |
Wort rechts vom Cursor ganz oder teilweise löschen |
dd |
Aktuelle Zeile löschen |
D |
Zeile ab Cursorposition löschen |
dG |
Dateiinhalt ab Cursorposition löschen |
d1G |
Dateiinhalt bis Cursorposition löschen |
:5,10 d |
Zeilen 5-10 löschen |
Kopieren und Bewegen |
|
yy |
Zeile kopieren |
Y |
Zeile kopieren |
p |
Pufferinhalt unter der aktuellen Zeile einsetzen |
P |
Pufferinhalt über der aktuellen Zeile einsetzen |
:1,2 co 3 |
Zeilen 1-2 kopieren und nach Zeile 3 einsetzen |
:4,5 m 6 |
Zeilen 4-5 ausschneiden und nach Zeile 6 einsetzen |
Zeilennummern |
|
:set nu |
Zeilennummern anzeigen |
:set nonu |
Zeilennummern ausblenden |
|
Groß-/Kleinschreibung |
:set ic |
Groß-/Kleinschreibung bei Suchläufen ignorieren |
:set noic |
Groß-/Kleinschreibung bei Suchläufen beachten |
Zeilenwechsel |
|
G |
Zur letzten Zeile springen |
1G |
Zur ersten Zeile springen |
21G |
Zu Zeile 21 springen |
Suchen und Ersetzen |
|
/zeichenfolge |
Vorwärts nach zeichenfolge suchen |
?zeichenfolge |
Rückwärts nach zeichenfolge suchen |
n |
Nächste zeichenfolge in Suchrichtung finden |
N |
Vorhergehende zeichenfolge in Suchrichtung finden |
:g/suche/s//ersetze/g |
suche im gesamten Text durch ersetze ersetzen |
Bildschirm |
|
Ctrl-L" |
Bildschirminhalt neu zeichnen |
|
Dateien verknüpfen |
:r dateiname |
dateiname an Cursorposition einsetzen |
:34 r dateiname |
dateiname nach Zeile 34 einsetzen |
Speichern und Beenden |
|
:w |
Änderungen speichern |
:w dateiname |
Änderungen in dateiname speichern |
:wq |
Änderungen speichern und Arbeitssitzung beenden |
ZZ |
Änderungen speichern und Arbeitssitzung beenden |
:q! |