# 1.103.8

# Allgemeine Dateibearbeitung mit vi

Beschreibung: Prüfungskandidaten müssen in der Lage sein, Textdateien mit vi zu bearbeiten. Dieses Lernziel beinhaltet Navigation im vi, die grundlegenden vi Modi, Einfügen, Bearbeiten, Löschen, Kopieren und Auffinden von Text.

Die wichtigsten Dateien, Bezeichnungen und Anwendungen:

- vi
- `/, ?`
- `h,j,k,l`
- `G, H, L`
- `i, c, d, dd, p, o, a`
- `ZZ, :w!, :q!, :e!`
- `:!`

Der Unix-Standard-Editor ist - unabhängig vom verwendeten System - immer das Programm vi. Dieser Editor ist auf allen Terminals lauffähig, das bedeutet aber auch, daß er sich nicht auf die Existenz bestimmter Funktionstasten verlassen kann, um bestimmte Befehle auszuführen. Einfache Terminals haben nicht einmal Pfeiltasten, der Editor vi muß also auch die Möglichkeit haben, mit anderen Befehlen Aktionen wie die Bewegungen des Cursors vorzunehmen.

Aus diesem Grund kennt der Editor vi verschiedene Modi. Die beiden wichtigsten sind der Kommandomodus und der Eingabemodus. Im Kommandomodus werden alle eingegebenen Zeichen als Befehle interpretiert, statt sie als in den Text einzugebende Zeichen zu interpretieren. Im Eingabemodus werden alle Zeichen an der Cursorposition in den Text eingefügt. Der Wechsel vom Eingabemodus in den Kommandomodus erfolgt immer durch die Esc-Taste. Beim Aufruf von vi befinden wir uns grundsätzlich im Kommandomodus.

Der Editor vi wird in der Regel zusammen mit einem Dateinamen aufgerufen.

      vi Datei

Dadurch wird vi angewiesen, die angegebene Datei zu editieren. Existiert die Datei noch nicht, so startet vi mit einem leeren Puffer, beim Speichern wird dann aber der angegebene Dateiname verwendet.

### Befehle zum Bewegen des Cursors im Kommandomodus

Nachdem vi nicht davon ausgehen kann, daß dem Terminal Pfeiltasten zur Verfügung stehen, muß er Befehle kennen, die die Aufgabe dieser Pfeiltasten übernehmen. Dazu dienen die Tasten `h j k l`, die im Kommandomodus folgende Bedeutung haben:

h | Bewegt den Cursor nach links
j | Bewegt den Cursor nach unten
k | Bewegt den Cursor nach oben
l | Bewegt den Cursor nach rechts

Jedem dieser Befehlszeichen kann eine Zahl vorangestellt werden, die angibt, wie oft der Befehl ausgeführt werden soll. Der Befehl `23j` bewegt den Cursor also 23 Zeilen nach unten.

Neben diesen grundlegenden Befehlen gibt es noch weitere Möglichkeiten den Cursor zu bewegen:

w | Bewegt den Cursor auf den Beginn des nächsten Wortes
b | Bewegt den Cursor auf den Beginn des aktuellen Wortes
0 | Bewegt den Cursor auf den Beginn der aktuellen Zeile
$ | Bewegt den Cursor auf das Ende der aktuellen Zeile
Strg-f | (Forward) Eine Bildschirmseite vorwärts (PgDn)
Strg-b | (Back) Eine Bildschirmseite zurück (PgUp)
G | Bewegt den Cursor zum Dateiende (letzte Zeile)
nG | Bewegt den Cursor in die nte Zeile der Datei
H | Bewegt den Cursor in die erste Zeile des aktuellen Bildschirms
nH | Bewegt den Cursor in die nte Zeile des aktuellen Bildschirms
L | Bewegt den Cursor in die letzte Zeile des aktuellen Bildschirms
nL | Bewegt den Cursor in die nte Zeile des aktuellen Bildschirms von unten

Auch diese Befehle (bis auf 0) können alle nach einer Zahl auftreten, die angibt, wie oft der Befehl ausgeführt werden soll. Mit `3w` bewegt sich der Cursor also auf den Beginn des dritten Wortes nach dem aktuellen Wort. Bei den Befehlen `G, H` und `L` ist angegeben, was die Zahl jeweils bedeutet.

Die modernen Versionen von vi, die unter Linux zum Einsatz kommen, kennen natürlich auch dei entsprechenden Funktionstasten der PC-Tastatur. Es ist also sehr wohl möglich, die Pfeiltasten, Home, End, PgUp und PgDn zu verwenden. Trotzdem sollten die hier besprochenen Befehle bekannt sein, zumindestens die vier grundlegenden Cursorbewegungen `h j k l`.

### Befehle zum Wechsel in den Eingabemodus

Ein Editor ist dazu gedacht, Text in eine Datei zu schreiben, die wichtigsten Befehle sind also die, wie vom Kommandomodus in den Eingabemodus gewechselt werden kann. vi bietet hierfür viele verschiedenen Möglichkeiten an, die sich auch wieder aus der alten terminalbasierten Arbeitsweise erklären. Heute - mit Verwendung der Pfeiltasten - können wir bedenkenlos im Eingabemodus den Cursor bewegen. Früher - ohne Pfeiltasten - musste für jede Bewegung des Cursors in den Kommandomodus gewechselt werden. Aus diesem Grund gibt es so viele verschiedene Möglichkeiten, in den Eingabemodus zu wechseln:

i | Einfügen vor der aktuellen Cursorposition
I | Einfügen am Anfang der aktuellen Zeile
a | Einfügen nach der aktuellen Cursorposition
A | Einfügen am Ende der aktuellen Zeile
o | Einfügen nach der aktuellen Zeile
O | Einfügen vor der aktuellen Zeile
R | Überschreiben des Textes (Replace)
C | Ersetzen der aktuellen Zeile ab Cursorposition

Achtung: Auch diesen Befehlen kann eine Zahl vorangestellt werden. Der Befehl `23i` führt zwar auch nur einmal in den Eingabemodus, die geschriebenen Zeilen werden aber 23 mal eingefügt.

### Suchen im Text

Um ein bestimmtes Wort - bzw. einen regulären Ausdruck - zu suchen, bietet vi zwei Methoden:

/Suchmuster | Sucht nach dem Suchmuster von der Cursorposition in Richtung Dateiende und bewegt den Cursor auf das gefundene Ergebnis.
?Suchmuster | Sucht nach dem Suchmuster von der Cursorposition in Richtung Dateianfang und bewegt den Cursor auf das gefundene Ergebnis.

Beiden Methoden kann wiederum eine Zahl vorausgehen, die dann den Cursor nicht zum ersten, sondern zum nten Auftreten des Suchmusters bewegt.

### Löschen von Text

Um aus dem Kommandomodus heraus Text aus der Datei zu löschen, existieren viele verschiedenen Möglichkeiten. die wichtigsten sind

x | Löscht das Zeichen, auf dem der Cursor gerade steht.
dl | Löscht das Zeichen, auf dem der Cursor gerade steht (wie x).
dd | löscht die aktuelle Zeile
dw | löscht von der Cursorposition bis zum Anfang des folgenden Wortes
db | löscht von der Cursorposition nach links bis zum Anfang des aktuellen Wortes
d$ | löscht von der Cursorposition bis zum Zeilenende
d0 | löscht von der Cursorposition nach links bis zum Anfang der aktuellen Zeile

Die Löschbefehle speichern den gelöschten Text in einem Zwischenpuffer. Es ist möglich, diesen Zwischenpuffer wieder an einer beliebigen Stelle des Textes auszugeben. Somit ist auch eine Art Kopieren oder Verschieben von Textblöcken möglich. Die dazu nötigen Befehle sind:

p | Fügt den Inhalt des Zwischenpuffers nach der aktuellen Cursorposition ein.
P | Fügt den Inhalt des Zwischenpuffers vor der aktuellen Cursorposition ein.
yy | Liesst eine Zeile in den Zwischenpuffer, ohne sie zu löschen.

Es gibt auch noch eine raffinierte Methode, Text zu löschen oder zu ersetzen. Dazu wird ein Befehl zusammen mit einem der Befehle zur Cursorbewegung benutzt. Das Löschen bzw. Ersetzen bezieht sich dann auf den Bereich zwischen der aktuellen Cursorposition und dem Punkt, an den der Befehl zur Cursorbewegung den Cursor bewegt hätte:

dCursor-Bewegung | Löscht den Bereich zwischen aktueller Cursorposition und dem Punkt, an den die Cursor-Bewegung den Cursor geführt hätte.
cCursor-Bewegung | Ersetzt den Bereich zwischen aktueller Cursorposition und dem Punkt, an den die Cursor-Bewegung den Cursor geführt hätte durch den Eingabetext.

Der Befehl `d3k` würde also den Text zwischen der aktuellen Cursorposition bis 3 Zeilen weiter nach oben (3k bewegt den Cursor 3 Zeilen nach oben) löschen. Als Cursor-Bewegung kann jeder beliebige Befehl angegeben werden, der den Cursor bewegt, also auch ein Suchbefehl.

### Beenden und Sichern

Die meisten Befehle des vi zum Beenden und Sichern sind sogenannte Ex-Befehle, die durch einen führenden Doppelpunkt eingeleitet werden. Diese Befehle verweigern unter bestimmten Umständen ihren Dienst, wenn ihnen kein Ausrufungszeichen angefügt wird. So kann der vi nicht mit `:q` beendet werden, wenn der Text, den der Editor bearbeitet hat, verändert wurde, aber noch nicht gesichert ist. Durch das Anhängen eines Ausrufungszeichen an den Befehl (`:q!`) wird diese Einschränkung aufgehoben. Folgende Befehle sind in diesem Zusammenhang interessant:

ZZ | Sichert die Datei und beendet den Editor
:w Dateiname | Sichert die Datei. Wurde beim Aufruf von vi schon ein Dateiname angegeben, kann er hier weggelassen werden.
:w! Dateiname | Wie `:w`. Speichert aber auch, wenn es Gründe gibt, die das Speichern normalerweise verunmöglichen (Datei existiert schon)
:wq Dateiname | Speichern der Datei und Beenden des Editors (auch hier kann ein ! angegeben werden, wenn ansonsten das Speichern unmöglich wäre). Der Dateiname kann weggelassen werden, wenn er schon bekannt ist.
:x Dateiname | Wie `:wq`. Datei wird aber nur gespeichert, wenn es Veränderungen gab.
:q | Beendet den Editor
:q! | Beendet den Editor auch wenn vorher nicht gesichert wurde.

### Sonstige wichtige Kommandos

Neben den bereits vorgestellten Befehlen gibt es noch hunterte anderer. Hier seien nur noch ein paar genannt, die wirklich wichtig sind:

:e Dateiname | Läd die angegebene Datei in den Editor. Nur ausführbar, wenn die aktuelle Datei schon gesichert wurde.
:e! Dateiname | Läd die angegebene Datei in den Editor. Auch ausführbar, wenn die aktuelle Datei noch nicht gesichert wurde.
:r Dateiname | Läd die angegebene Datei an der aktuellen Cursorposition in den Text.
:! Shellbefehl | Führt den angegebenen Shellbefehl aus und kehrt dann zum Editor zurück.
:Bereich! Shellbefehl | Filtert den angegebenen Bereich durch das angegebene Shellkommando und ersetzt ihn durch die Ausgabe des Shellkommandos. Bereiche werden durch ihre Zeilennummern angegeben in der Form erste_Zeile,letzte_Zeile. Ein Dollarzeichen bezeichnet die letzte Zeile der Datei. Soll die ganze Datei gefiltert werden, kann also die Angabe `1,$` benutzt werden. Die aktuelle Zeile wird durch einen Punkt (.) repräsentiert.
u | Undo der letzten Aktion.