Home / LinuxUser / 2006 / 11 / Aufgaben automatisieren in Vim

Newsletter abonnieren

Lies uns auf...

Folge LinuxCommunity auf Twitter

Top-Beiträge

Mandriva gibt Distribution in die Hände der Community
(268 Punkte bei 24 Stimmen)
Neues vom Systemd
(161 Punkte bei 4 Stimmen)
Mandriva in Nöten
(161 Punkte bei 4 Stimmen)

Heftarchiv

LinuxUser Heftarchiv

EasyLinux Heftarchiv

Ubuntu User Heftarchiv

Ubuntu User Heftarchiv

Partner-Links:

Shopping
Topsuche
 
Yatego Deutschlands größte Shoppingmall. 10000 Shops,
3.5 Mio Artikel. Alle Bestseller, Servertechnik und Technik Themenwelten.

Notebooks und Netzwerkhardware bei Mercateo günstig kaufen.
Internet Telefonie mit VoIP Telefonen von Gigaset
Das B2B Portal www.Linx.de informiert über Produkte und Dienstleistungen.
Günstige Digitalkameras finden Sie im Preisvergleich.

Kleine Helfer

Aufgaben automatisieren in Vim

01.11.2006 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.

Abbildung 1: Markierung eines Rechteckblocks in Vim mit [Strg]+[V] zum Entfernen von Kommentarzeichen.

Die Syntax für eine Mapping-Definition lautet Mapping-Befehl Kurzform Langform . 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 w speichert 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.

Einem Freund empfehlen    Druckansicht Bookmark and Share
Kommentare

2627 Hits
Wertung: 0 Punkte (0 Stimmen)

Schlecht Gut

Infos zur Publikation

Infos zur Publikation

LinuxUser 06/2012

Aktuelle Ausgabe kaufen:

Heft bestellen Heft als PDF kaufen

LinuxUser erscheint monatlich und kostet in der Nomedia-Ausgabe EUR 5,50 und mit DVD EUR 8,50. Weitere Informationen zum Heft finden Sie auf der LinuxUser-Homepage.

Im LinuxUser-Probeabo erhalten Sie drei Ausgaben für 3 Euro. Das Jahresabo (ab EUR 56,10) können Sie im LNM-Shop bestellen.

Tipp der Woche

Adobe AIR
Adobe-AIR-Programme installieren und (manuell) starten
Tim Schürmann, 14.05.2012 13:09, 0 Kommentare

Es gibt sie noch: neue Anwendungen, die Adobes Integrated Runtime voraussetzen. Aktuellstes und vermutlich auch größtes Beispiel ist das Adventure Botanicula

Aktuelle Fragen

gibt es ein Kommandozeilen Tool, um ein X11-Fenster in ein Anderes einzubetten?
GoaSkin , 21.05.2012 16:44, 0 Antworten
Das XEmbed-Protokoll ist u.A. dazu gedacht, dass man eine X11-Anwendung in eine andere wie ein Wi...
Apache2, Options -Indexes geht nicht
no no, 12.05.2012 19:01, 8 Antworten
Habe in apache2.conf folgendes stehen: Options -Indexes ...
LInux auf Dell LS H500
Andreas Endresl, 09.05.2012 08:54, 2 Antworten
Habe einen alten Dell Latitude LS H500 nur mit ext. Floppy und CD es geht nur immer eines von den...
Datenwiederherstellung unter Ubuntu 12.04 mit "Simple Backup" nach Umzug von Linux Mint
Christian Lottmann, 07.05.2012 13:33, 0 Antworten
Vor dem Umzug auf Ubuntu 12.04 habe ich unter Linux MInt mit "Simple Backup" voll (15.4.2012) und...
DKMS für den propritären NVIDIA-Treiber
Commander Data, 26.04.2012 22:02, 2 Antworten
Hallo an die Gemeinde. Ich habe hier ein interessantes Stück openSuSE gefunden. http://forums.op...