Mit wenigen Handgriffen wird aus dem vermeintlich kryptischen Editor Vim ein komfortables und flexibles Werkzeug zur Bearbeitung von Texten.
Die grundlegende Bedienung des Vi-Klones Vim haben die meisten Anwender schnell erlernt: Die Taste i führt in den Eingabemodus, mit [Esc] gelangen Sie zurück in den Kommandomodus. Die Tastenkombination :wq speichert die bearbeitete Datei und schließt den Editor, :q! hingegen beendet Vim, ohne Änderungen in die Datei zu schreiben. Damit sind seine Fähigkeiten freilich nicht einmal annähernd ausgereizt. Neben arbeitserleichternden Makro-Befehlen [1] beherrscht Vim Texteinfaltungen, bietet einfache Textformatierung und verfügt über eine eigene Skriptsprache. Alle diese Möglichkeiten stellt dieser Artikel der Reihe nach vor.
Übersichtlichkeit
Zur Arbeit mit umfangreichen Dateien gehören Fenster und Faltungen, die den Gesamttext übersichtlicher machen. Abbildung 1 zeigt, wie Vim Texte in Fenstern darstellt.
Starten Sie den Editor für einen Fenster-Testlauf in der Shell. Nun öffnen Sie mit dem Befehl :new dateiname ein neues Fenster mit der genannten Datei als Inhalt. Durch die Tastenkombination [Strg-w] Pfeiltaste schicken Sie den Cursor in die gewünschte Richtung – in diesem Fall ins untere Fenster. Dort laden Sie mit :e dateiname2 eine zweite Datei und öffnen eine dritte mit :vnew dateiname3. Das Kommando :vnew startet im Gegensatz zu :new ein vertikales und kein horizontales Fenster. Die Kombination [Strg-w] +/- vergrößert oder verkleinert das Fenster, in dem sich der Cursor befindet.
Falls Ihnen die Tipperei zu umständlich ist, können Sie die Fenstergröße und Cursor-Position auch mit der Maus verändern. Dazu müssen Sie die Maus mit :set mouse=a einschalten. Möchten Sie diese Einstellung dauerhaft beibehalten, tragen Sie sie (ohne einleitenden Doppelpunkt) in die Konfigurationsdatei ~/.vimrc ein.
Zum Schluss beendet ein beherztes :qa! die Fenster-Orgie samt Vim. Die umfangreiche Hilfe zu den Fenstern finden Sie mit dem Befehl :h windows.txt.
Ein weiteres nüztliches Hilfsmittel sind Texteinfaltungen. Die Faltung ist eine interne Darstellung des Editors, die mehrere Zeilen oder ganze Abschnitte eines Textes zusammenfasst. Probieren Sie es aus, und öffnen Sie eine längere Datei. Vom Kommandomodus aus gelangen Sie mit V in den visuellen, zeilenweisen Modus. Markieren Sie einige Zeilen und drücken Sie zf. Der markierte Abschnitt ist nun zu einer einzigen, hervorgehobenen Zeile zusammengefaltet (Abb. 2).
Um eine Faltung aufzuheben positionieren Sie den Cursor darauf und geben zo ein. Wollen Sie sie erneut schließen, wählen Sie zc. Die Tastenkombination zi öffnet und schließt abwechselnd alle Faltungen.
Falls Sie die Arbeit mit dem Wechsel in den visuellen Modus nicht mögen, können Sie zf eine Zeilenreichweite von der aktuellen Cursor-Position aus mitgeben: zf5 [Enter]. Im Kommandomodus greift ebenfalls der Befehl :20,25 fold, um beispielsweise die Zeilen zwanzig bis fünfundzwanzig einzufalten. Eine weitere Möglichkeit ist die zusätzliche Angabe ap. Dies ist die Kurzform von “a paragraph” und meint einen Absatz. Der Befehl zfap bezieht das Faltungs-Kommando auf den von Leerzeilen umrahmten Textabsatz, in dem sich der Cursor befindet.
Da Faltungen lediglich eine Darstellung und keine Veränderung des Textes sind, können sie wie der ungefaltete Rest-Text bearbeitet werden. So können Sie im visuellen Modus eine Faltung markieren und den Text mit d löschen oder mit y kopieren und via p an anderer Stelle einfügen.
Dies ist nur eine kleine Auswahl aus dem Anwendungsbereich der Faltungen. In der Vim-Hilfe finden Sie mit :h fold.txt eine detaillierte Anleitung zu diesem Thema, die besonders für Programmierer interessant ist.
Formatierung
Nun wissen Sie, wie Sie Ihren Text strukturiert darstellen können. Auch die Formatierungsmechanismen von Vim sind einen Blick wert. Eine Basiseinstellung dazu liefert die Variable textwidth. Sie definiert die Anzahl der Zeichen, ab der eine Zeile wortweise umbrochen wird. Den momentanen Wert der Variablen erfragen Sie mit dem Befehl set textwidth?. Wenn Sie den Wert festlegen wollen, dann ist :set textwidth=80 das Kommando Ihrer Wahl. In unserem Beispiel wurde eine Zeilenlänge von achtzig Zeichen eingestellt.
Zum Formatieren des Textes auf die voreingestellte Zeilenlänge eignet sich das Kommando gq sehr gut. Ähnlich wie die Anweisungen zum Falten setzen Sie es im visuellen Modus oder mit Angabe einer Reichweite ein: gq8 formatiert acht Zeilen ab der Cursor-Position. Die Absatz-Definition ap dürfen Sie ebenfalls einsetzen: gqap.
Umbrochene Zeilen fügen Sie sehr schnell mit J zusammen. Ohne ein vorheriges Markieren im visuellen Modus verkettet J lediglich die Zeile, die den Cursor enthält, mit der nächsten. Es versteht sich beinahe von selbst, dass auch die Zeilenzusammenführung durch eine Reichweite bestimmt werden kann: 18,22 j.
Am Rande ein kleiner Tipp. In disem Artikel sind Ihnen bisher viele Anweisungen begegnet, die Sie unter Umstaänden “blind” schreiben mussten. Die Variablen-Definition :set sc (Show Command) macht Ihre Eingaben unten in der Status-Anzeige des Editors sichtbar.
Textausrichtung
Wie gestalten Sie einen Text zentriert oder bündig? Da Vim ein Texteditor ist und keine Textverarbeitung im Stil von Open Office sind seine Fähigkeiten auf diesem Gebiet eher bescheiden. Zur Auswahl stehen left, right und center Diese Formate können Sie mit der Angabe einer Reichweite (120,125 center) oder im visuellen Modus (V, markieren, :'<,'>center) anwenden. Gekennzeichnete Bereiche reagieren daneben auf die Bearbeitung durch externe Programme: Die Anweisung :'<,'>!rev stellt den Text (nicht das Schriftbild) spiegelverkehrt dar, und '<,'>!sort sortiert die Zeilen alphabetisch nach ihren Anfangsbuchstaben. Ein :80,86!tac dreht im festgelegten Textbereich die Zeilen um, so dass die sechsundachtzigste Zeile zuoberst und die achtzigste zuunterst ist.
Zur Textausrichtung zählt auch die Einrückung im Text. Wenn sich die Einrückung einer neuen Zeile an der vorherigen orientieren soll, dann setzen Sie die Variable :set autoindent. Diese Einstellung wirkt sich außerdem auf das Formatieren mit gqap aus, indem der gesamte Abschnitt entsprechend der ersten Zeile eingerückt wird.
Eingerückte Zeilen produzieren Sie wie gewohnt im Eingabe-Modus mit Leertaste und Tabulator. Der Editor besitzt allerdings eine weitere, feine Abstufung zur Einrückung, die Variable shiftwidth. Sie legt fest, um wieviele Leerzeichen ein Text mit der Tastenkombination [Strg-d] und [Strg-t] im Einfügemodus aus- beziehungsweise eingerückt wird. :set shiftwidth=2 beispielsweise stellt zwei Leerzeichen ein.
Wortergänzungen
Eine Funktion, die anspruchsvolle Texteditoren auszeichnet, ist das Arbeiten mit Wortergänzungen und Wortlisten. Dem steht Vim in nichts nach. Die Tastenkombinationen [Strg-n] (next) und [Strg-p] (previous) durchsuchen die geöffneten Dateien im Einfügemodus vorwärts und rückwärts, um ein angefangenes Wort zu finden. Nach einem getippten “Ei” zeigt Ihnen [Strg-p] vielleicht “Eis”, “Eimer” oder “Eigenschaft” an, je nachdem, welche Wörter der Editor in Ihrem Text findet, die mit “Ei” beginnen. Das genaue Suchverhalten der Wortergänzung legen Sie mit der Variable :set complete fest. Die Hilfeseite :h complete zeigt Ihnen eine Reihe von Werten, mit der Sie die Variable Ihren Wünschen entsprechend anpassen. In der Voreinstellung set complete=.,w,b,u,t,i durchsucht der Editor beispielsweise alle geöffneten Fenster nach einem Wort.
Umfangreiche Wortlisten, die Sie beim Schreiben verwenden, hinterlegen Sie mit :set dictionary=~/.vim/wordlists/words. In unserem Beispiel liegt die Wortliste words im Pfad ~/.vim/wordlists. Sie dürfen in der Variablen mehrer Wortlisten anführen, müssen diese jedoch durch ein Komma trennen. In jeder Liste steht pro Zeile ein Wort:
[..] Ablass Ablativ Ablativs Ablaufes Ablaufs […]
Eine gute Anlaufstelle für Wortlisten ist übrigens der FTP-Server der FU-Berlin [2]. Um Ihre Listen zu durchsuchen, nutzen Sie die Tastenkombination [Strg-x Strg-l] im Einfügemodus. Mehr zum Thema der Ergänzungen erfahren Sie auf der Hilfeseite :h ins-completion.
Geskriptete Feinarbeit
Neben Autocommands und Mappings, die ein früherer LinuxUser-Artikel behandelt [1], ermöglichen selbstgeschriebene Skripte tiefgreifende Anpassungen des Editors. Über eintausend davon liegen inzwischen auf den Projektseiten des Editors parat, vom einfachen Syntaxhighlightning bis hin zu Erweiterungen, die Vim in ein IRC-Tool im Chatroom verwandeln (Abb. 3).
Einen ersten Endruck davon, was ein Vim-Skript kann, bekommen Sie, wenn Sie sich das Shell-Skript less.sh ansehen. Sie finden es gewöhnlich im Verzeichnis macros, in dem Pfad, den Ihnen der Befehl :echo $VIMRUNTIME im Editor verrät.
Das Shell-Skript less.sh ruft seinerseits Vim mit dem Skript less.vim auf. Es bewirkt, dass sich der Editor wie der Pager less verhält, wenn Sie eine Datei über das Shell-Skript aufrufen. Auf diese Weise setzen Sie Vim als Pager ein, ohne Gefahr zu laufen, eine aufgerufene Datei versehentlich zu editieren. Dabei stehen Ihnen die von less gewohnten Tastenkommandos zur Verfügung. Als Bonus stellt Vim die Datei mit Syntaxhighlightning dar, was less nicht beherrscht.
Im Verzeichnispfad unter $VIMRUNTIME liegen zahlreiche Skripte. Alleine das Verzeichnis syntax beherbergt rund vierhundert Dateien.
Wie Sie auf der Hilfeseite Write a Vim script unter :h usr_41.txt sehen, ist die Skripterei ein recht umfangreiches Geschäft. Dieser Artikel beschränkt sich auf einige einfache Beispiele, die auch ein Anwender mit geringen Programmierkenntnissen versteht. Als erstes Beispiel ist Ihnen schon die Abfrage des Wertes von $VIMRUNTIME begegnet.
Der Editor versteht eine Reihe von Variablen. Dazu zählen Umgebungsvariablen wie $VIMRUNTIME, $USER oder $HOME, interne Vim-Variablen wie v:errmsg (enthält die letzte Fehlermeldung), globale und lokale Variablen sowie Skript-Variablen. Eine ausführliche Liste erhalten Sie mit :h internal-variables
Dass Sie den Wert einer vordefinierten Variable mittels echo erfahren, haben Sie gelesen. Wenn Sie hingegen selber eine Variable setzen wollen, dann tun Sie das mit let. Dieses und die folgenden Beispielen können Sie im Kommandomodus in die Statuszeile des Editors schreiben:
:let alles_ok = "ja" :echo alles_ok ja :unlet alles_ok
Diese Zeilen weisen der Variablen alles_ok den Wert ja zu und geben ihn mittels :echo alles_ok aus. Danach löscht unlet die Variable. Im nächsten Beispiel bekommen zwei Variablen nummerische Werte zugewiesen, die dann addiert werden:
:let hund = 3 :let katze = 27 :echo hund + katze 30
Nehmen wir an, Sie wollen diese Rechenaufgabe zu einer neuen Funktion des Editors machen, die Sie Maus() nennen. Die Zeile function bestimmt den Namen der Funktion. Darunter folgt der Inhalt von Maus(), und endfunction schließt die Funktion syntaktisch ab:
:function Maus() : let hund = 100 : let katze = 35 : echo hund - katze : endfunction
Sobald Sie die Funktion
Maus()
aufrufen, bekommen Sie das Ergebnis der Aufgabe:
:call Maus() 65
Durch das Kommando :delf Maus verschwindet die Funktion auf Nimmerwiedersehen aus dem Speicher. Mit diesem Wissen um Variablen und Funktionen lässt sich bereits ein kleines Beispiel-Skript schreiben (Listing 1).
Listing 1
Vim-Skript beispiel.vim
function VimKonv()
if expand("%:e") ==? "html"
call system("mozilla http://selfhtml.org & ")
elseif expand("%:e") ==? "txt"
call system("ding & ")
else
echo "Weder HTML-Dokument noch TXT-Datei!"
endif
endfunction
nmap <F5> :call VimKonv()
@KE:
Das Vim-Skript in Listing 1 gliedert sich deutlich in zwei Bereiche. Den oberen, der von der Funktion VimKonv() eingenommen wird, und den unteren, der den Aufruf call VimKonv() an die Taste F5 bindet.
Den Körper der Funktion bildet eine if-Abfrage, die mit endif abschließt. Bedingt von den Ergebnissen der Stationen if, elseif und else werden Kommandos ausgeführt, wie die vereinfachte Struktur unseres Beispieles zeigt:
if [Erste Bedingung] [führe … aus] elseif [Zweite Bedingung] [führe … aus] else [ansonsten] [führe … aus] endif
Zunächst zur ersten Bedingung if expand("%:e") ==? "html": Die Funktion expand() ist bereits vordefiniert. Sie erweitert den Ausdruck, den sie in Klammern mit sich führt. Das kann, wie in unserem Fall, das Prozentzeichen % sein, das den derzeitigen Dateinamen darstellt. Weil jedoch dem Prozentzeichen ein :e (für extension) folgt, wird lediglich die Erweiterung des Dateinamens ausgewertet. Erweiterungen sind hier Dateiendungen wie .html, .pdf, .ogg und andere. Die Gleichheitszeichen == der Zeile überprüfen, ob herausgefundene Erweiterung der Zeichenkette html entspricht. Es werden also die Ausdrücke vor und nach den Gleichheitszeichen miteinander verglichen. Das Fragzeichen ? schaltet die Groß- und Kleinschreibung ab. Es ist also gleichgültig, ob der Dateinamen auf .html oder .HTML endet.
Sind die Ausdrücke gleich, entspricht also die Dateiendung der Zeichenkette html, wird eine weitere Vim-Funktion aufgerufen: call system(). Sie ruft wie eine Shell den Browser mozilla mit der freien HTML-Anleitung http://selfhtml.org auf.
Wenn die erste Bedingung (HTML-Dateiendung) nicht erfüllt ist, testet die Abfrage elseif expand("%:e") ==? "txt", ob das Suffix im Dateinamen txt ist. Ist die Bedingung erfüllt, startet in der Zeile darunter die Funktion system() das Wörterbuch ding.
Wird weder der Ausdruck if noch elseif wahr, führt else das Kommando echo "Weder HTML-Dokument noch TXT-Datei!" aus, das die entsprechenden Meldung in der Statuszeile des Editors ausgibt.
Wie Sie sehen startet dieses Beispielskript auf den Tastendruck [F5] je nach Dateiendung einen Browser samt HTML-Anleitung oder ein Wörterbuch. Um das Skript im Editor einzubinden, laden Sie es über das Kommando :so beispiel.vim. Dabei werden Sie feststellen, dass es zwar beim Suffix .html, nicht aber bei der Erweiterung .htm greift. Das ist keine Schwäche von Vim, sondern liegt an der einfachen Gestaltung dieses Beispielskripts. Mit Hilfe reguläerer Ausdrücke lässt sich das Skript geeignet erweitern.
Die Skripte von der Vim-Homepage [3] laden Sie seit Version 6.0 in der Regeln nicht mehr durch :so, sondern Sie legen sie in die Verzeichnisse unter ~/.vim. Abhängig von Typ des Skriptes speichern Sie es in ~/.vim/plugin, ~/.vim/ftplugin oder ~/.vim/colors und an andere Orte wie ~/.vim/syntax oder ~/.vim/doc.
Nach ~/.vim/plugin kommen die Skripte, die generell geladen werden, und in ~/.vim/ftplugin sind Skripte untergebracht, die speziell auf einzelne Datei-Typen reagieren. Die Farbschemata, um vor allem das grafische Frontend gvim ansprechend zu gestalten, stecken Sie ins Verzeichnis ~/.vim/colors. Die Dokumentationen zu einzelnen Plugins werden gewöhnlich in ~/.vim/doc gespeichert (Abb. 4).
Wie Sie sehen lässt sich Vim auf viele Arten anpassen und erweitern. Das macht ihn, neben den Giganten Emacs und XEmacs [4], zu einem der beliebtesten Editoren überhaupt.(mhu)
Infos
[1] Makros, Mappings, Mutationen: http://www.linux-magazin.de/Artikel/ausgabe/2001/11/vim/vim.html
[2] Wortlisten der FU-Berlin: ftp://ftp.fu-berlin.de/misc/dictionaries/unix-format
[3] Vim-Skriptseite: http://www.vim.org/scripts/index.php
[4] LinuxUser-Artikel zu (X)Emacs: Oliver Much, LinuxUser 10/2002, S. 46, “Keine Angst vorm Monster”








