Als leistungsfähige Editoren helfen Vim und seine grafische Variante Gvim, Zeit zu sparen – mit Mappings, Makros, Abkürzungen und automatischen Befehlen.
Wie jeder gute Editor bietet auch Vim [1] viele Möglichkeiten, wiederkehrende Aufgaben schnell zu erledigen. Mappings ermöglichen es, Tasten oder Tastenkombinationen mit neuen Funktionen zu belegen, Folgen von Tastatureingaben in Makros aufzuzeichnen oder über Abkürzungen Tipparbeit bei der Eingabe zu sparen. Autobefehle treten selbsttätig in Aktion, wenn bestimmte Ereignisse eintreten – etwa, wenn Sie eine neue Datei anlegen.
TIPP
Möchten Sie ein Mapping, eine Abkürzung oder einen Autobefehl wiederverwenden, übernehmen Sie die entsprechenden Definitionen in die Konfigurationsdatei .vimrc in Ihrem Home-Verzeichnis.
Mappings
Mappings definieren Sie im Kommandozeilenmodus [2] des Editors (siehe Kasten “Vim-Modi”). Innerhalb des Editors liefert der Befehl :help map.txt Ihnen eine Hilfe zum Thema Mapping.
Vim-Modi
Normalmodus: In diesem befindet sich der Editor nach dem Start. Hier löscht beispielsweise [X] das Zeichen unter dem Cursor.
Auswahlmodus: In diesen gelangen Sie, wenn Sie im Normalmodus die Tasten [V],[Umschalt]+[V] oder [Strg]+[V] drücken. So markieren Sie beispielweise Textbereiche (Abbildung 1). Aus diesem Modus (sowie aus dem Operator- und Einfügemodus) kommen Sie mit [Esc] wieder zurück in den Normalmodus.
Operatormodus: In diesem befindet sich der Editor, wenn Sie einen Befehl im Normalmodus angefangen haben, aber noch die Angabe zur Bewegung fehlt. Ein Beispiel: Geben Sie im Normalmodus [D] ein, wartet Vim auf eine Bewegungsangabe – das Programm läuft im Operatormodus. Beispielsweise mit [W] zum Löschen eines Wortes oder [$] zum Löschen bis zum Zeilenende erhält es die gewünscht Information.
Einfügemodus: In diesen Modus gelangen Sie durch [I] (für “insert”, einfügen) oder [A] (für “append”, anhängen). Die Eingabe von Text ist nun möglich.
Kommandozeilenmodus: Hier landen Sie, sobald Sie im Normalmodus [:] tippen. Dieser Modus kommt üblicherweise für längere Befehle zum Einsatz, deren Aufbau Sie während der Eingabe sehen wollen. Beispiele sind die Definition von Mappings, wie in diesem Artikel, oder zum Speichern einer Datei mit :w Dateiname. Normalerweise führen Sie den eingegebenen Befehl mit [Eingabe] aus. Sie brechen ihn mit [Esc] ab. In beiden Fällen kommen Sie zurück in den Normalmodus.

Strg+V zum Entfernen von Kommentarzeichen.” width=”300″ height=”216″ />
Strg+V zum Entfernen von Kommentarzeichen. Die Syntax für eine Mapping-Definition lautet Mapping-BefehlKurzformLangform. Dabei steht als Mapping-Befehl beispielsweise nmap für ein Mapping, das im Normalmodus arbeitet. Die Kurzform beschreibt, welche Tasten man drücken muss, um die Mapping-Aktion auszulösen. Die Langform beschreibt Tastendrücke (Tabelle “Tastenumschreibungen”), die Sie ohne die Mapping-Definition für die entsprechende Aktion drücken müssten.
In Vim sollten Sie in Mappings und Abkürzungen für Funktions- und Steuertasten Tastenumschreibungen nutzen. Dadurch bleiben die Mappings und Abkürzungen portabel auf ganz verschiedene Plattformen und Terminalemulatoren.
Manche Tasten eignen sich nur bedingt für die Terminalemulation beziehungsweise funktionieren nicht zuverlässig (in extremen Fällen nicht einmal die Tasten, für die in der entsprechenden Tabellenspalte ein “Ja” steht). Bei Gvim sollte das Problem nicht auftreten, wenn der Windowmanager die Tastendrücke nicht abfängt.
Tastenumschreibungen
| Umschreibung | umschriebene Taste | geeignet für Terminal |
|---|---|---|
<Space> |
[Leertaste] | Ja |
<CR> |
[Eingabe] | Ja |
<Tab> |
[Tab] | Ja |
<C-A> |
[Strg]+[A] | Ja |
<Del> |
[Rück] | Meistens |
<Home>, <End> |
[Pos1],[Ende] | Meistens |
<Up>, <Down>, <Left>, <Right> |
Cursortasten | Meistens |
<F1> |
[F1] | Meistens |
<BS> |
[Rück] | Bedingt |
<C-F1> |
[Strg]+[F1] | Bedingt |
<S-F1> |
[Umschalt]+[F1] | Bedingt |
<C-Up> |
[Strg]+[Pfeil oben] | Bedingt |
<S-Up> |
[Umschalt]+[Pfeil oben] | Bedingt |
<PageUp>, <PageDown> |
[Bild auf],[Bild ab] | Bedingt |
<C-PageUp>, <C-PageDown> |
[Strg]+[Bild auf],[Strg]+[Bild ab] | Bedingt |
<S-PageUp>, <S-PageDown> |
[Umschalt]+[Bild auf],[Umschalt]+[Bild ab] | Bedingt |
Die Eingabe von nmap <F2> :w<CR> im Kommandozeilenmodus belegt die Funktionstaste F2 im Normalmodus mit einem Befehl zum Speichern der gerade bearbeiteten Datei. Dabei geben Sie <F2> und <CR> jeweils als vier einzelne Zeichen ein, also [<],[F],[2] und [>] für <F2>. Drücken Sie [Eingabe], um die Definition des Mappings abzuschließen und wieder in den Normalmodus zu gelangen. Ein paar Anmerkungen zum Mapping:
- Die Langform beginnt mit
:, damit Vim in den Kommandomodus wechselt. - Mit
wspeichert das Programm die Datei. Das funktioniert nur mit einer Datei, die bereits einen Namen hat – jedoch nicht mit einer Datei, die Sie in Vim erstellt, aber noch nie abgespeichert haben. - Da Sie beim (simulierten) Drücken der Funktionstaste F2 im Normalmodus sind, sollte der Editor auch wieder dort landen, nachdem er das Mapping ausgeführt hat. Das geschieht mit
<CR>. Achten Sie darauf, dass dahinter keine Leerzeichen stehen, bevor Sie beim Definieren des Mappings [Eingabe] drücken. Leerzeichen interpretiert Vim als Bestandteil der Definition.
Durch Eingabe von nmap <F2> prüfen Sie, ob Vim die Mapping-Eingabe verstanden hat. Sie sollten die folgende Zeile sehen:
n <F2> :w<CR>
Dabei bedeutet n, dass das Mapping vom Normalmodus aus zu aktivieren ist (möglich wären – für die anderen Modi – v, o, i oder c). Bei <F2> und :w<CR> handelt es sich um die Kurz- respektive Langform der Mapping-Definition. In der Ausgabe des obigen Befehls würden Sie sehen, ob Sie bei der Eingabe etwas falsch gemacht haben (abgesehen von zusätzlichem Leerraum am Ende der Langform).
Nach dem Betätigen von [F2] sollten Sie durch eine Meldung, die der nachfolgenden ähnelt, sehen, dass Vim die Datei gespeichert hat:
"testdatei.txt" 1L, 16C written
Nun möchten Sie aber unter Umständen die aktuelle Datei auch dann speichern, wenn der Editor gerade nicht im Normalmodus ist. Dazu definieren Sie weitere Mappings:
vmap <F2> <ESC>:w<CR>gv
Das Mapping eignet sich für den Auswahlmodus. Mit gv markieren Sie wieder den Textbereich, dessen Auswahl Sie vorher mit <ESC> aufgehoben haben. Das nachfolgende Mapping definiert das Speichern für den Operatormodus. Der gerade noch eingegebene Operator, zum Beispiel c für “change”, geht dabei verloren:
omap <F2> <ESC>:w<CR>
Als Definition für den Eingabemodus dient wiederum eine Variante. Dabei verlassen Sie mit <ESC> den Eingabemodus und aktivieren ihn nach dem Speichern mit a wieder:
imap <F2> <ESC>:w<CR>a
Verwenden Sie i statt a, steht der Cursor nach der Rückkehr in den Eingabemodus nicht mehr an der vorherigen Stelle, es sei denn, dies war die erste Spalte. Zu guter Letzt noch das Mapping für den Kommandozeilenmodus:
cmap <F2> <ESC>:w<CR>:
Mit <ESC> löschen Sie den aktuellen Inhalt der Vim-Kommandozeile, kehren danach mit : aber sofort in den Kommandozeilenmodus zurück. Nach dem Schreiben der Datei wechseln Sie mit dem zweiten Doppelpunkt erneut in den Kommandozeilenmodus, der vor dem Druck auf [F2] aktiv war. Wie beim Mapping für den Operatormodus geht der vor dem Drücken von [F2] bereits eingegebene Text verloren.
Aus drei mach eins
Schauen wir uns noch einmal die oben definierten Mappings an:
nmap <F2> :w<CR> vmap <F2> <ESC>:w<CR>gv omap <F2> <ESC>:w<CR> imap <F2> <ESC>:w<CR>a cmap <F2> <ESC>:w<CR>:
Alle enthalten den Teil :w<CR>. Wenn Sie Mappings mit gleicher Funktion für verschiedene Modi definieren, finden Sie dieses Muster für verschiedene Modi immer wieder. Sie vermeiden einen Teil der Redundanz, indem Sie die Definition von [F2] für den Normalmodus in den anderen Mappings wiederverwenden:
nmap <F2> :w<CR> vmap <F2> <ESC><F2>gv omap <F2> <ESC><F2> imap <F2> <ESC><F2>a cmap <F2> <ESC><F2>:
Das simulierte [Esc] in den letzten vier Definitionen aktiviert den Normalmodus, sodass das jeweils folgende <F2> das Mapping für den Normalmodus nutzen kann.
Vim (und auch schon sein Ahn Vi) kennen den Befehl map, der gleichzeitig Mappings für den Normal-, Auswahl- und Operatormodus definiert. Da ein zusätzliches <ESC> für nmap nicht stört, können Sie mit
map <F2> <ESC>:w<CR>
die ersten drei Mappings – fast – ersetzen. Die Markierung im Auswahlmodus geht durch den Druck auf [F2] verloren. Sie können den Text nach dem Speichervorgang über [G],[V] wieder auswählen.
Ebenfalls in Vi und Vim gibt es den Befehl map!, der gleichzeitig Mappings für den Einfüge- und den Kommandozeilenmodus definiert. Das Ausrufezeichen gehört zum Befehl und muss direkt auf das p folgen.
Mappings für mehrere Tastendrücke
Die Kurzform eines Map-Befehls (oben <F2>) kann mehreren Tastendrücken entsprechen. Sie definieren also beispielsweise:
nmap ..s :w<CR>
Allerdings hat der Punkt im Normalmodus noch eine andere Bedeutung: Er wiederholt den letzten Änderungsbefehl (etwa eine Einfügeoperation). Tippen Sie später im Normalmodus einen Punkt, führt Vim diesen eingebauten Befehl noch nicht aus, sondern wartet einen Moment. Schließlich könnte es sein, dass ein zweiter Punkt (und schließlich das s) folgt. Passiert innerhalb der Pause nichts, nimmt Vim an, dass Sie den eingebauten Punkt-Befehl meinen.
Mappings löschen
Wollen Sie ein Mapping wieder loswerden, geht das mit den Befehlen nunmap, vunmap und so fort. Mit unmap und unmap! löschen Sie mehrere Mappings auf einmal.
Makros
Manchmal brauchen Sie eine längere Befehlsfolge, um eine Aufgabe zu erledigen. Stellen Sie sich vor, Sie haben eine Datei mit Vor- und Nachnamen:
Willibald Stefan Hugo Schmittchen Wusel Schwarzer Hampel Schleicher
und wollen die Vornamen folgendermaßen hinter die Nachnamen hängen:
Wusel, Willibald Schwarzer, Stefan Hampel, Hugo Schleicher, Schmittchen
Falls die Liste nicht vier, sondern tausend Namen umfasst, haben Sie einiges an Arbeit vor sich. Mit einem Makro (siehe dazu :help recording) haben Sie es einfacher.
Setzen Sie den Cursor an den Anfang der Datei und tippen Sie im Normalmodus die Taste [Q] und eine weitere Buchstabentaste. (Besonders einfach ist es, [Q] ein zweites Mal zu drücken.) Vim zeigt daraufhin unten im Kommandobereich recording an. Geben Sie nun die Befehle ein, um einen der Vornamen hinter den zugehörigen Nachnamen zu hängen. Zum Beispiel drücken Sie dabei nacheinander folgende Tasten:
- [d][d] – den Vornamen löschen,
- [1][0][0][0][j] – 1000 Zeilen nach unten gehen (das muss die genaue Anzahl der Namenskombinationen sein. Sie finden sie leicht heraus, indem Sie mit
:set numberdie Zeilennummern anzeigen), - [p][k] – Vornamen unter dem Nachnamen einfügen und eine Zeile nach oben gehen (auf den Nachnamen),
- [Umschalt]+[A][,][Esc] – hinter dem Nachnamen ein Komma einfügen und den Einfügemodus verlassen,
- [Umschalt]+[J] – den Vornamen hinter den Nachnamen bewegen,
- [g][g] – an den Anfang der Datei springen, also auf den ersten Namen der Vornamenliste.
Insgesamt lautet das Makro also dd1000jpkA,[ESC]Jgg, wobei 1000 der Anzahl der Namenskombinationen entspricht.
Drücken Sie nun wieder [Q]. Damit haben Sie ein Tastaturmakro im Register “q” (die Buchstabentaste nach dem einleitenden [Q]) aufgezeichnet. Sie können das Makro nun ausführen, indem Sie [@][Q] drücken, wobei “q” das Register bezeichnet, das das Makro enthält. Vim arbeitet jetzt Ihr Makro ab, dass heißt, es verbindet die nächsten Vor- und Nachnamen und springt zurück an den Anfang der gekürzten Vornamenliste.
TIPP
Als Bezeichner für Register lassen sich Ziffern sowie Klein- und Großbuchstaben verwenden, jedoch nicht die Umlaute und das “ß”.
Sie haben keine Lust, für die 999 restlichen Namen 999 mal [@][Q] zu drücken? Glücklicherweise können Sie Makros durch eine vorangestellte Zahl mehrfach ausführen (aber nur in einer Datei, sofern das Makro keine Befehle zum Wechseln der Datei enthält). Genau so, wie Sie mit [3][X] drei Zeichen löschen, führen Sie mit [9][9][9][@][Q] 999 mal das Makro im Register “q” aus.
Tipp: Makros nachträglich bearbeiten
Vim erlaubt es, ein Makro nachzubearbeiten, nachdem Sie es aufgezeichnet haben. Dieser Trick funktioniert, da das Programm Makros in den gleichen Registern speichert, die auch dem Kopieren von Textstücken zum Einsatz kommen.
Angenommen, Sie haben ein Makro im Register “a” aufgezeichnet. Gehen Sie an eine übersichtliche Stelle eines Dokuments und tippen Sie im Normalmodus [“][A][P]. Die Tastendrücke für das Makro erscheinen im Text.
Editieren Sie nun den Text, der den zu drückenden Tasten entspricht, nach Ihren Wünschen. Verwenden Sie hier keine Tastenumschreibungen – geben Sie vielmehr Steuerzeichen wie [Strg]+[R] mit Hilfe eines vorangestellten [Strg]+[V] im Eingabemodus ein, tippen Sie also [Strg]+[V][Strg]+[R]. Wenn Sie mit den Änderungen fertig sind, markieren Sie den neuen Makro-Text mit [V] und Cursorbewegungen. Drücken Sie [“][A][Y], um das geänderte Makro zu speichern, und [@][A], um es auszuführen.
Abkürzungen
Abkürzungen (siehe dazu: :help abbreviations) funktionieren ähnlich wie Mappings. Sie lassen sich aber nur im Einfüge- oder Kommandozeilenmodus anwenden. Mit der Syntax AbkürzungsbefehlKurzformLangform definieren Sie ein entsprechendes Kommando.
Der Abkürzungsbefehl beginnt dabei wieder mit einem Buchstaben, der anzeigt, für welchen Modus die Definition gilt. So kennzeichnet iabbrev solche, die nur im Einfügemodus gelten, cabbrev definiert Abkürzungen für den Kommandozeilenmodus und abbrev für beide Modi. Um noch mal Tipparbeit zu sparen, dürfen Sie den Teil abbrev auch jeweils mit ab abkürzen. Es genügt also, iab statt iabbrev zu schreiben.
Wie bei den Mappings handelt es sich bei der Kurzform um das, was Sie tippen, um das Ersetzen auszulösen. Die Langform beinhaltet, was Vim für die Kurzform einsetzt. Ein Beispiel macht dies deutlich. Geben Sie wie gewohnt im Kommandozeilenmodus den folgenden Befehl ein:
iabbrev mfg Mit freundlichen Grü? ßen<CR>Willibald Wusel
Geben Sie nun im Einfügemodus mfg ein, erscheint die definierte Schlussformel. Das funktioniert aber nur, wenn Vim die Zeichenkette mfg als eigenständiges Wort erkennt. Dass heißt, direkt davor und danach darf kein anderes alphanumerisches Zeichen stehen: Die Langform wird erst eingesetzt, wenn Sie die Kurzform durch [Esc], Leerraum (zum Beispiel [Eingabe]) oder ein nicht-alphanumerisches Zeichen abschließen.
Ein beliebtes Einsatzgebiet von Abkürzungen besteht darin, häufig gemachte Schreibfehler während der Eingabe zu korrigieren, wie im Beispiel iab hervoragend hervorragend zum Verdoppeln des Buchstaben “r”. Nett sind auch Vereinfachungen fürs Programmieren. So hilft iab def def():<Left><Left><Left> beim Python-Programmieren.
Tippen Sie nun def , erscheint def (): und die Einfügemarke steht vor der öffnenden Klammer – eine nützliche Abkürzung, um eine Funktions- oder Methodendefinition in Python-Code einzufügen. Nicht mehr gewünschte Abkürzungen entsorgen Sie mit iunabbrev Kurzform aus dem Speicher. Für das letztgenannte Beispiel erledigt iunabbrev def diese Aufgabe.
Abkürzungen für den Kommandozeilenmodus entfernen Sie mit cunabbrev. Die gerade gültigen Abkürzungen lassen Sie sich anzeigen, indem Sie den Abkürzungsbefehl ohne weitere Zusätze eingeben. So listet die Angabe von iab im Kommandozeilenmodus alle Abkürzungen für den Eingabemodus. Der Befehl beginnt ja mit einem “i”.
Autobefehle
Noch schöner als Mappings, Makros oder Abkürzungen per Tastaturabruf zu nutzen, wäre es doch, eine Aktion automatisch auszuführen. Das geht, wenn in Vim bestimmte Ereignisse eintreten. Das entsprechende Mittel sind Autobefehle (siehe dazu :help autocmd.txt). Das Programm selbst nutzt diese ausgiebig, um je nach Dateityp ein unterschiedliches Syntax-Highlighting zu aktivieren oder um mit Gzip komprimierte Dateien beim Laden automatisch zu entpacken und beim Speichern wieder zu komprimieren.
Die Syntax zur Definition von Autobefehlen lautet
autocmd Gruppe Ereignisse Muster?Befehl
Der Teil Gruppe dient dabei dem Gruppieren verwandter Autobefehle. Diese bekommen den selben Gruppennamen, der normalerweise aus Buchstaben besteht. Der Definitionsteil darf fehlen; in diesem Fall kommt direkt nach autocmd die Angabe eines oder mehrerer Ereignisse.
Mit dem Teil Ereignisse legen Sie ein oder eine durch Kommas getrennte Liste von Ereignissen, bei denen Vim den Befehl ausgeführt. Vim kennt zahlreiche solcher Ereignisse, zum Beispiel BufNewFile, wenn Sie einen neuen Editierpuffer anlegen, oder BufWinEnter, wenn Sie in ein Editierfenster umgeschalten.
Durch Muster kennzeichnen Sie einen oder mehrere, durch Kommas getrennte Muster für den Namen einer Datei oder Editierpuffers. Die Muster verwenden in etwa die Syntax, die Sie für Dateinamen in der Shell kennen, beispielsweise *.html für HTML-Dateien oder *.[ch] für alle C-Dateien und Header-Files.
Der Teil Befehl legt den Befehl fest, der auszuführen ist, wenn eines der Ereignisse eintritt und der Name des Puffers einem der Muster entspricht. Im Gegensatz zu Mappings und Abkürzungen geht Vim hier von Befehlen für die Vim-Kommandozeile aus (beispielsweise setfiletype c) – nicht von Tastensymbolen, wie Sie sie für die Langform von Mappings nutzen.
Nach der trockenen Theorie nun ein Beispiel. Der folgende Autobefehl kommt immer dann zum Einsatz, wenn Sie eine neue Datei (Ereignis BufNewFile) im Verzeichnis ~/devel (Muster ~/devel/*) anlegen:
autocmd BufNewFile ~/devel/* ? -1 read ~/devel/LICENSE | $
Bei -1 read ~/devel/LICENSE | $ handelt es sich um einen zusammengesetzten Befehl. Dabei liest -1 read ~/devel/LICENSE eine Lizenzdatei und fügt diese in den neuen Editierpuffer ein. Die -1 sorgt dafür, dass die geladene Datei nicht nach der obersten Zeile erscheint, sondern direkt am Anfang der Datei.
Der Befehl $, ebenfalls im Kommandozeilenmodus ausgeführt, springt zum Ende der Datei, so dass Sie mit [O] direkt unterhalb der Lizenzinformation zu schreiben beginnen. Wollen Sie Autobefehle löschen, erledigen Sie das im Kommandozeilenmodus mit
autocmd! Gruppe Ereignisse Muste?r
Dabei handelt es sich bei Gruppe, Ereignisse und Muster um die selben Daten, die Sie zur Definition dienten. Haben Sie bei der Definition keinen Gruppennamen angegeben, dürfen Sie ihn auch beim Aufheben auslassen.
Vim zeigt die Autobefehle an, wenn Sie die obige Syntax ohne das Ausrufezeichen verwenden. Die Auswahl erweitert sich, wenn Sie von rechts beginnend Angaben weglassen. Der letzte Befehl im folgenden Beispiel zeigt alle Autobefehle an.
:autocmd Gruppe Ereignisse :autocmd Gruppe :autocmd
Fazit
Geschickte Mappings, Makros, Abkürzungen und Autobefehle erleichtern die Arbeit mit Vim sehr. Mappings empfehlen sich für kurze Befehlsfolgen, die in verschiedenen Modi zum Einsatz kommen. Makros vereinfacheb das Erstellen und Ausführen komplexer Befehlsfolgen.
Abkürzungen sind vor allem für Textersetzungen im Einfügemodus nützlich. Autobefehle verwenden Sie, wenn um bestimmte Aktionen automatisch beim Eintreten bestimmter Ereignisse auszuführen.
Viele nützliche Hinweise zum Schreiben eigener Erweiterungen finden sich im Internet auf der Vim-Homepage. Dort sammeln die Maintainer in einer großen Datenbank [3] die gut aufbereiteten Kochrezepte, die sich auch durchsuchen lassen.
Infos
[1] Vim: http://www.vim.org
[2] Vim-Einführung: Heike Jurzik, “Simsala Vim!”, LinuxUser 09/2006
[3] Vim-Kochrezepte: http://www.vim.org/tips/index.php




