vi ist ein visual interface zum Zeileneditor ex (wie ed) und wurde von Bill Joy zu einer Zeit entworfen, in der man noch mit Terminals und 300 Baud Verbindungsraten kämpfte. Der Editor wurde so programmiert, dass man editieren und sich produktiv fühlen konnte, auch wenn der Bildschirmaufbau sehr träge war. Die Arbeit an vi begann mit dem Code von em (editing for mortals) von George Coulouris am University College in London. Bill meinte jedoch, dass editing einfacher und produktiver sein sollte und im Sommer `76 enstand in drei Monaten vi. Stoff von gestern? Von wegen, macht mal ein telnet/ssh mit eurem Handy und ihr werdet diese Eigenschaften schätzen lernen.
Mittlerweile gibt es vi-Varianten auf fast jedem Betriebssytem (sogar auf Windows oder Palm). Im Laufe der Zeit wurde er der uneingeschränkte Unix-Standard-Editor, der Bestandteil des System V Release wurde.
Es scheint schwer zu sein, gegenüber vi eine neutrale Haltung einzunehmen. Entweder liebt man ihn oder hasst ihn. vielleicht liegt es daran, dass seine vielen kurzen Befehle ihn zum einen sehr schnell zu bedienen machen, zum anderen aber eine ziemliche Hürde für den Einsteiger darstellen. Dabei kommt man schon mit einem knappen Dutzend Befehlen recht weit.

Abb. 1: Dieses Motiv ist ein beliebtes T-shirt motiv [Geekshirts].
Letztlich ist die Wahl des besten Editors eine sehr subjektive Sache. Jeder Programmierer oder Systemverwalter sollte aber mindestens einen Editor sehr gut kennen, da der Expertenbetrieb sehr viel Zeit sparen kann. Und die sehr tastaturfreundliche Platzierung der vi-Kernbefehle macht ihn zu einem sehr angenehmen Werkzeug für vielschreiber.
Auf den meisten Linux-Systemen ist ein wesentlich erweiterter und verbesserter vi im Einsatz: vi improved - kurz vim. Er bietet im Vergleich zum klassischen vi viele zusätzliche Features und besseres Handling. Außerdem gibt es eine Version gvim, die in einem eigenen GTK-Fenster arbeitet und auch die Maus mit verwendet. Es gibt sogar ein Projekt, bei dem vim in der Gnome-Umgebung in eine Bonobo-Komponente verpackt wird,und damit zum Beispiel als integrierter eMail-Editor in Evolution eingesetzt werden kann.
vi kommt auf Linux-Systemen in verschiedenen Varianten. Je nach Bedarf kann man sie einfach per rpm installieren oder man holt sich die aktuellste Version (6.0.152) [vimHome] und kompiliert sie. Version 6.1 sollte im März oder April 2002 erscheinen.
bunzip2 vim-6.xxx.tar.bz2
tar -xvf vim-6.xxx.tar
cd vim-6.xxx/src
./configure && make
# make install (als Root aufrufen)
Ein Start von Gvim sollte nun folgende schöne Bildschirmoberfläche anzeigen.
vim kommt schon mit einem eigenen kurzen Lernprogramm, dass durch vimtutor gestartet wird. Interaktiv kann man die Tastenkombinationen lesen und sofort ausprobieren. Sehr einfach hat man es, wenn man gvim startet, :help eingibt und dann mit der Maus auf die farbig markierten Einträge klickt.

Abb. 2: vim-Tutorial
vi-Modes
vi kennt drei Modes. In einem piept er und in den beiden anderen nicht. Mittels der Esc-Taste kann man zwischen Kommando- und Einfüge Modus wechseln. Um den Insertmodus wieder zu verlassen, drückt man am Besten zwei Mal auf ESC, bis es piept.
- Visual Mode: Tastendrücke werden
als Kommando interpretiert. Dies ist die Standardbetriebsart von vi.
- Input Mode: Hier wird Text eingegeben.
Während man im klassischen vi hier nur mit der Backspace-Taste die Eingabe korrigieren
konnte, unterstützt vim hier auch Cursor- und Sondertasten. Der Eingabemodus wird
mit der Escape-Taste beendet.
- Ex Mode: Eingabe von Befehlen über die Kommandozeile, meistens für das Suchen
und Ersetzen verwendet. Die Eingaben in der Kommandozeile werden ausgeführt, wenn
Return gedrückt wird, mit Escape werden die Eingaben ignoriert.
Man kann gvim wie einen anderen modernen Texteditor wie etwa Kedit benutzen, aber die Idee ist, die Finger auf der Tastatur zu lassen und auf die Maus oder Funktionen einer erweiterten Tastatur (Cursortasten, ...) zu verzichten, um die maximale Tippgeschwindigkeit zu behalten.
Cursorbewegung
Die klassische Methode, die auch funktioniert, wenn eine defekte Telnet-Emulation keine Cursortasten zulässt, verwendet die Buchstaben
h (links),
l (rechts),
k (oben) und
j (unten). Etwas schneller kommt man zum Ziel, wenn man wortweise (
w vorwärts oder
b rückwärts) springt. vim erlaubt es, abhängig vom Dateityp unterschiedliche Zeichen als Wortbestandteile zu deklarieren, so dass man sich hier auf den Einzelfall eine bequeme Lösung zuschneidern lassen kann. Die Varianten
W und
B dagegen beziehen sich immer auf durch Leerzeichen begrenzte Worte.
Zum schnellen Blättern in einer Datei gibt es einige Möglichkeiten:
1G an den Anfang der Datei
17G zur Zeile 17
G zur letzten Zeile
Strg+F eine Bildschirmseite vorwärts
Strg+B eine Bildschirmseite zurück
Strg+D eine halbe Seite vorwärts
Strg+U eine halbe Seite zurück
Obwohl vi wohl meistens von Programmierern eingesetzt werden dürfte, hat er einige Bewegungsbefehle, die sich besonders beim Bearbeiten von Texten bewähren.
( ein Satz zurück
) ein Satz nach vorne
{ ein Absatz (Leerzeile) zurück
} ein Absatz nach vorne
Sehr praktisch ist auch, dass man vor dem jeweiligen Befehl einen Wiederholungsfaktor eingeben kann:
3w springt drei Worte weiter.
Man kann innerhalb einer Zeile ein bestimmtes Zeichen anspringen, indem man
f oder
t mit dem Zeichen verwendet:
f: bewegt den Cursor auf den nächsten Doppelpunkt in der aktuellen Zeile,
t: positioniert den Cursor vor dem Doppelpunkt. Die Varianten mit
T und
F suchen rückwärts. Mit
, und
; kann man die letzte Buchstabensuche wiederholen, wobei
; die Suchrichtung umkehrt.
Um innerhalb des gesamten Textes zu suchen, verwendet man
/ oder
?. Hier wird am unteren Bildschirmrand ein Suchmuster (reguläre Ausdrücke mit einigen Besonderheiten) eingegeben und nach einem Druck auf die Return-Taste angesprungen. Während
/ vorwärts sucht, bewegt sich
? rückwärts durch die Datei. Mit
n wird die letzte Suche wiederholt, mit
N auch, allerdings in der anderen Richtung.
Speziell für Programmierer interessant dürfte die Taste
% sein, die zur nächsten schließenden Klammer springt. Wenn man allerdings schon auf einer Klammer steht, wechselt der Cursor zur zweiten Klammer des Klammerpaars bzw. piept, wenn keine passende Klammer existiert.
Text bearbeiten
Die beiden wichtigsten Befehle, um aus dem visual Mode in den Eingabemodus zu kommen, sind
i (insert) und
a (append). Damit werden die Eingaben vor bzw. nach der aktuellen Cursorposition platziert. Bequem sind dann noch die weiteren Möglichkeiten:
i vor dem Cursor einfügen (insert)
I am Anfang der Zeile einfügen
a nach dem Cursor einfügen (append)
A am Ende der Zeile einfügen
o neue Zeile unterhalb einfügen (open)
O neue Zeile oberhalb einfügen
s aktuelles Zeichen ersetzen (substitute)
S aktuelle Zeile ersetzen
r einen Buchstaben ersetzen (replace)
R mehrere Buchstaben ersetzen
Der Befehl
r hat insofern eine Sonderstellung, dass hier nach Eingabe des neuen Buchstabens automatisch wieder in den visual Mode geschaltet wird. Dagegen wird
R wieder mit Escape beendet.
Wenn es darum geht, Textteile zu ersetzen oder zu löschen, zeigt sich eine Stärke des vi: man kann an die entsprechenden Befehle eine beliebige Bewegung anschließen, auf die sich dann der Befehl bezieht.
x Zeichen unter dem Cursor löschen
X Zeichen vor dem Cursor löschen
d löschen (delete)
D = d$
dd Zeile löschen
c ersetzen (change)
C = c$
cc = S
Um die nächsten drei Worte zu löschen, kann man entweder
3dw (lösche dreimal ein Wort) oder
d3w (lösche drei Worte) eingeben.
c{ würde den Text von der aktuellen Position bis zum Anfang des Absatzes löschen und in den Eingabemodus wechseln. Besonders praktisch ist es,
d und
c mit Suchanweisungen zu kombinieren.
dt. löscht den Rest des Satzes in der aktuellen Zeile, lässt aber den Punkt stehen.
Gelegentlich kommt es vor, dass man in einem Text eine bestimmte Änderung öfter vornehmen will. Mit dem vi kann man generell die letzte Änderung, die man an einem Text vorgenommen hat, durch einen Druck auf die
.-Taste wiederholen. Wenn man beispielsweise versucht, einen Text auf die neue Rechtschreibung umzustellen, wird man oft
ß durch
ss ersetzen: Mit
1G gehen wir an den Anfang der Datei, dann suchen wir mit
/ß das nächste
ß, ersetzen es mit
sss+
Escape durch ein
ss und können dann mit
n die übrigen
ß aufsuchen und individuell entscheiden, ob wir die Ersetzung mit
. vornehmen wollen.
Buffer
vi verfügt über verschiedene interne Buffer, die gelöschten Text speichern. Da gibt es zunächst einmal die zehn nummerierten Buffer, die automatisch bestückt werden. Der zuletzt gelöschte Text ist im Buffer 0, der vorletzte im Buffer 1 und so weiter bis Nummer 9. Wer den Text lieber manuell unter Kontrolle hat, kann sich der benannten Buffer bedienen:
add löscht die aktuelle Zeile und legt sie im Buffer
a ab. Mit
ap kann der Inhalt (auch mehrfach) wieder eingefügt werden. Der Befehl
p fügt den Inhalt von Buffer 0 an der Cursorposition ein.
Man kann einen Textabschnitt auch in einen Buffer bringen, ohne ihn aus dem Text zu entfernen:
y wie yank übernimmt diese Aufgabe, also werden mit
qy3j insgesamt vier Zeilen in den Buffer kopiert (die aktuelle und dann noch drei drunter). gvim stellt einen speziellen Buffer
* zur Verfügung, der die Zwischenablage verwendet.
Laden und Speichern
Gelegentlich soll es sich schon als nützlich erwiesen haben, eine Datei zu speichern. Im vi funktioniert das über den Befehl
:w, der den Text in die beim Aufruf verwendete Datei schreibt. Alternativ dazu kann auch mit
:w neu.txt eine andere Datei ausgewählt werden. Möchte man im laufenden Betrieb zu einer anderen Datei wechseln, müssen die Änderungen am lokalen Dokument zuerst gespeichert werden, bevor es möglich wird, mit
:e neu.txt eine weitere Datei zu editieren. Mit dem Kürzel
:e# wechselt man zwischen den beiden zuletzt geöffneten Dateien hin und her.
Es kann gelegentlich auch vorkommen, dass eine vi-Sitzung gewaltsam unterbrochen wurde. In diesem Fall gibt es eine Recover-Datei, die in der Regel im gleichen Verzeichnis wie die bearbeitete Datei liegt, und als erstes Zeichen des Namens einen
. hat. Sollte beim Öffnen einer Datei die entsprechende Recovery-Datei schon vorhanden sein, warnt vi und gibt einem die Möglichkeit, den dort zuletzt gespeicherten Zustand wiederherzustellen.
Beim Aufruf von vi können mehrere Dateinamen angegeben werden, die dann der Reihe nach bearbeitet werden können. Mit
:n wie next wechselt man zur nächsten Datei in der Liste, mit
:prev (previous) zur vorherigen,
:rew wie rewind spult die Argumentliste komplett zurück, sodass man wieder mit der ersten beginnt.
Individuelle Konfiguration
Für das Anpassen des vim an den persönlichen Bedarf empfehlen wir, im gvim das Edit-Menü aufzurufen und dort im Settings-Window die Einstellungen interaktiv vorzunehmen und zu testen. Wenn eine Modifikation für gut befunden wurde, kann die im Settings-Window gezeigte Zeile in die vim-Konfigurationsdatei
~/.vimrc übernommen werden.
Ein Beispiel für eine (spartanische)
.vimrc-Datei:
set nocompatible
let color = "true"
so ${VIMRUNTIME}/syntax/syntax.vim
set ruler
set autoindent
set expandtab
set printoptions=syntax:n,number:y
set printfont=courier:h8
set backspace=indent,eol,start
Hier wird angegeben, dass wir bei der Syntax-Färbung bunt werden wollen, unten rechts die aktuelle Zeile und Spalte gezeigt bekommen, dass vim automatisch einrücken soll, wobei Tabs in Leerzeichen konvertiert werden. Die Printoptions legen fest, wie ein (direkt aus vim heraus) gedrucktes Dokument erscheinen soll: ohne Syntaxfärbung aber mit Zeilennummern und in 8-Punkt Courier. Die letzte Einstellung schließlich sorgt dafür, dass sich die Backspace-Taste so verhält, wie wir das in einem normalen Editor erwarten.
vim und Programmieren
vim bietet eine bequeme Möglichkeit, den gerade bearbeiteten Quelltext kompilieren zu lassen:
:make oder
:make datei lässt den im Makefile festgelegten Vorgang ablaufen. Im Tools-Menü des gvim findet man weitere praktische Befehle, die das Arbeiten mit einem Fehlerfenster erläutern.
Interessant ist vor allem, dass vim ab Version 5.7 Support für verschiedene Programmiersprachen anbietet, den wir am Beispiel Ruby kurz vorstellen wollen. Wenn man seinen eigenen vim kompilieren will, muss man bei der Konfiguration die entsprechende Option setzen:
./configure --enable-rubyinterp
make
make install
Hilfe zur Ruby-Anbindung bekommt man mit
:help ruby
Nun hat man die Möglichkeit, einen Ruby-Befehl über
:ruby {cmd}
aufzurufen oder auch ein längeres Skript über
:ruby << {endpattern}
{script}
{endpattern}
zu starten. Wenn kein
{endpattern} angegeben wird, endet das Skript mit einem einzelnen Punkt auf einer Zeile. Natürlich wird man so etwas nicht im laufenden Betrieb eintippen, sondern eher in einer Funktion verpacken, die im
.vimrc-file abgelegt und beim Start automatisch eingebunden wird. Das Beispiel in Listing 1 ist auch in der online-Hilfe zu finden.
Listing 1 function! RedGem()
ruby << EOF
class Garnet
def initialize(s)
@buffer = VIM::Buffer.current
vimputs(s)
end
def vimputs(s)
@buffer.append(@buffer.count,s)
end
end
gem = Garnet.new("pretty")
EOF
endfunction
Listing 2 print "Hello" # zeigt eine Message an
VIM.command(cmd) # fuehrt ein Kommando aus
num = VIM::Window.count # liefert die Anzahl der Fenster
w = VIM::Window[n] # liefert Fenster "n"
cw = VIM::Window.current # liefert das momentane Fenster
num = VIM::Buffer.count # liefert die Anzahl der Buffer
b = VIM::Buffer[n] # liefert Buffer Nr. "n"
cb = VIM::Buffer.current # liefert den momentanen Buffer
w.height = lines # setzt die Fensterhoehe
w.cursor = [row, col] # setzt die Cursorposition
pos = w.cursor # liefert ein Array [Zeile, Spalte]
name = b.name # lieft den Buffernamen
line = b[n] # liefert die Zeile aus dem Buffer
num = b.count # liefert die Anzahl der Zeilen
b[n] = str # Setzt eine Zeile im Buffer
b.delete(n) # loescht eine Zeile
b.append(n, str) # fuegt eine Zeile nach Zeile n hinzu
Mehr Information findet man unter
:help ruby. vim kann so einer erstaunlich flexiblen und produktiven Umgebung werden.
Weitere Goodies
vim kann falten: Man definiert manuell (oder automatisch über Einrückung oder Syntaxregeln) eine hierarchische Struktur und kann die Detailinformation zugunsten der Grobübersicht verbergen (
help: fold).
vim kann mit mehreren Editorbuffern innerhalb der gleichen Sitzung umgehen (
help: buffers).
Man kann sowohl für den Visual Mode als auch für den Einfügemodus Mappings und Abbreviations definieren, was einfachen Makros entspricht:
:ab db Dingsbums sorgt dafür, dass bei der Eingabe von
db als einzelnes Wort automatisch
Dingsbums erscheint.
vim unterstützt erweiterte reguläre Ausdrücke für Suchen und Ersetzen, mit denen man einige sehr nützliche Effekte erzeugen kann.
Was kann vi, was emacs nicht kann?
Nun, vi läuft ohne Schwierigkeiten mit 2MB Speicher und zur Not auch praktisch ohne Bildschirm.
vim kann man nicht entkommen. Selbst emacs-Fanatiker finden vim noch am Strand, wie das Bild von Gregory Gaskill (siehe Abb. 3) beweist.

Abb. 3: vim ist sogar Strand-tauglich.
Literatur und Links
Links:
- [vimHome] The VIM (vi IMproved) Home Page, www.vim.org/
- [vimOptions] www.vim.org/html/options.html
- [Geekshirts] Geekshirts, geekshirts.sourceforge.net/
Bücher:
- [Robins] vi- Editor. Kurz und gut, Arnold Robbins, O'Reilly, 1999
- [Qualline] vi iMproved (VIM), Steve Oualline, New Riders Publishing, 2001
- [Lamb] Learning the vi Editor, Linda Lamb, Arnold Robbins, O'Reilly, 1998