*usr_40.txt* Für Vim version 7.3. Letzte Änderung: 2006-Jun-21 VIM-BENUTZERHANDBUCH - von Bram Moolenaar Neue Befehle machen Vim ist ein erweiterbarer Editor. Sie können eine Folge von Befehlen nehmen, die Sie oft benutzen, und aus ihnen einen neuen Befehl machen. Oder einen bestehenden Befehl neu definieren. Automatische Befehle machen es möglich, Befehle automatisch auszuführen. |40.1| Tasten belegen |40.2| Befehlszeilen-Befehle definieren |40.3| Automatische Befehle Nächstes Kapitel: |usr_41.txt| Ein Vim-Skript schreiben Voriges Kapitel: |usr_32.txt| Der Undo-Baum Inhaltsübersicht: |usr_toc.txt| ============================================================================== *40.1* Tasten belegen Eine einfache Belegung wurde in Abschnitt |05.3| erklärt. Das Prinzip ist, dass eine Folge von Tastendrücken in eine andere Folge von Tastendrücken übersetzt wird. Dies ist ein einfacher, jedoch mächtiger Mechanismus. Die einfachste Form ist, dass eine Taste mit einer Folge von Tasten belegt wird. Weil die Funktionstasten, außer , keine vordefinierte Bedeutung in Vim haben, sind diese eine gute Wahl zur Belegung. Beispiel: > :map GoDate: :read !datekJ Dies zeigt, wie drei Modi benutzt werden. Nachdem mit »G« in die letzte Zeile gegangen wird, öffnet der Befehl »o« eine neue Zeile und geht in den Einfügemodus. Der Text »Date: « wird eingefügt und bringt uns aus dem Einfügemodus. Beachten Sie den Gebrauch von Sondertasten in <>. Dies nennt sich Notation mit spitzen Klammern. Sie tippen diese als getrennte Zeichen, nicht, indem Sie die Taste selbst drücken. Dadurch wird die Belegung besser lesbar, und Sie können den Text ohne Probleme kopieren und einfügen. Das Zeichen »:« bringt Vim in die Befehlszeile. Der Befehl »:read !date« liest die Ausgabe des Befehls »date« und hängt sie unter der aktuellen Zeile an. Das wird benötigt, um den Befehl »:read« auszuführen. An dieser Stelle der Ausführung sieht der Text so aus: Date: ~ Fri Jun 15 12:54:34 CEST 2001 ~ Jetzt bewegt »kJ« den Cursor nach oben und fügt die Zeilen zusammen. Um zu entscheiden, welche Taste oder Tasten Sie zum Belegen verwenden, siehe |map-which-keys|. BELEGUNGEN UND MODI Der Befehl »:map« definiert Neubelegungen für Tasten im normalen Modus. Sie können auch Belegungen für andere Modi definieren. »:imap« zum Beispiel ist für den Einfügemodus zuständig. Sie können ihn benutzen, um ein Datum unter dem Cursor einzufügen: > :imap Date: :read !datekJ Sie sieht sehr wie die Belegung für im normalen Modus aus, nur der Beginn ist verschieden. Die Belegung von im normalen Modus ist noch da. Also können Sie dieselbe Taste für jeden Modus unterschiedlich belegen. Beachten Sie, dass, obwohl diese Belegung im Einfügemodus beginnt, sie im normalen Modus endet. Falls Sie im Einfügemodus fortfahren wollen, hängen Sie der Belegung ein »a« an. Hier ist eine Übersicht der Belegungsbefehle und in welchem Modus sie arbeiten: :map normal, visuell und Operator-hängend :vmap visuell :nmap normal :omap Operator-hängend :map! Einfügen und Befehlszeile :imap Einfügen :cmap Befehlszeile Der Operator-hängende Modus ist, wenn Sie ein Operator-Zeichen, so wie »d« oder »y«, getippt haben, und Vim auf einen Bewegungsbefehl oder ein Textobjekt wartet. Wenn Sie also »dw« tippen, wird das »w« im Operator-hängenden Modus eingegeben. Angenommen, Sie wollen so definieren, dass der Befehl »d« einen C-Programm-Block löscht (in geschwungene Klammern, {}, eingeschlossener Text). Analog würde »y« den Programm-Block in das unbenannte Register kopieren. Was Sie demnach tun müssen, ist es, so zu definieren, dass sie den aktuellen Programm-Block auswählt. Sie können dies mit dem folgenden Befehl tun: > :omap a{ Dies lässt eine Blockauswahl »a{« im Operator-hängenden Modus ausführen, genau als hätten Sie es getippt. Diese Belegung ist nützlich, falls das Tippen von { auf Ihrer Tastatur schwierig ist. BELEGUNGEN AUFLISTEN Um die aktuell definierten Belegungen zu sehen, benutzen Sie »:map« ohne Argumente. Oder eine der Varianten, die den Modus beinhalten, in dem sie arbeiten. Die Ausgabe könnte so aussehen: _g :call MyGrep(1) ~ v :s/^/> /:noh`` ~ n :.,$s/^/> /:noh`` ~ Die erste Spalte der Liste gibt an, in welchem Modus die Belegung funktioniert. Dies ist »n« für den normalen Modus, »i« für den Einfügemodus usw. Ein Leerzeichen wird für eine mit »:map« definierte Belegung verwandt, also effektiv im normalen und visuellen Modus. Ein nützlicher Aspekt, die Belegungen zu listen, ist zu prüfen, ob Sondertasten in <>-Form erkannt wurden (dies funktioniert nur, wenn Farbe unterstützt wird). Wenn zum Beispiel farbig dargestellt wird, steht es für die Escape-Taste. Wenn es dieselbe Farbe wie der andere Text hat, sind es nur fünf Zeichen. NEUBELEGEN Das Ergebnis einer Belegung wird nach anderen Belegungen in ihr inspiziert. Zum Beispiel könnten die Belegungen für oben folgendermaßen abgekürzt werden: > :map G :imap :map oDate: :read !datekJ Für den normalen Modus wird so belegt, dass in die letzte Zeile gegangen wird, und dann so getan wird, als ob gedrückt wurde. Im Einfügemodus beendet den Einfügemodus mit und benutzt dann ebenfalls . Dann wird so belegt, dass sie die tatsächliche Arbeit macht. Angenommen, Sie benutzen kaum den Ex-Modus, und wollen den Befehl »Q« dazu verwenden, Text zu formatieren (so war es in alten Vim-Versionen). Die folgende Belegung macht es: > :map Q gq Aber in seltenen Fällen brauchen Sie dennoch den Ex-Modus. Lassen Sie uns »gQ« mit Q belegen, so dass Sie immer noch in den Ex-Modus gehen können: > :map gQ Q Was nun geschieht: Sie tippen »gQ« und es ist mit »Q« belegt. So weit, so gut. Aber dann ist »Q« mit »gq« belegt, also resultiert das Tippen von »gQ« in »gq«, und Sie kommen gar nicht in den Ex-Modus. Um zu vermeiden, dass Tasten wieder belegt werden, benutzen Sie den Befehl »:noremap«: > :noremap gQ Q Nun weiß Vim, dass »Q« nicht nach weiteren Belegungen, die für es gelten, inspiziert werden soll. Analoge Befehle gibt es für jeden Modus: :noremap normal, visuell und Operator-hängend :vnoremap visuell :nnoremap normal :onoremap Operator-hängend :noremap! Einfügen und Befehlszeile :inoremap Einfügen :cnoremap Befehlszeile DIE REKURSIVE BELEGUNG Wenn eine Belegung sich selbst auslöst, läuft sie für immer. Dies kann benutzt werden, um eine Aktion eine unbegrenzte Anzahl von Malen zu wiederholen. Sie haben zum Beispiel eine Liste von Dateien, die eine Versionsnummer in der ersten Zeile enthalten. Sie editieren diese mit »vim *.txt«. Sie editieren nun die erste Datei. Definieren Sie diese Belegung: > :map ,, :s/5.1/5.2/:wnext,, Nun tippen Sie »,,«. Dies löst die Belegung aus. Sie ersetzt in der ersten Zeile »5.1« durch »5.2«. Dann macht sie »:wnext« um die Datei zu sichern und die nächste zu editieren. Die Belegung endet mit »,,«. Die löst dieselbe Belegung wieder aus, also die Ersetzung machen usw. Dies geht so weiter bis es einen Fehler gibt. In diesem Falle könnte es eine Datei sein, wo der Befehl »:substitute« keine Übereinstimmung für »5.1« findet. Sie können dann »5.1« einfügen und fortfahren, indem Sie »,,« erneut tippen. Oder »:wnext« scheitert, weil Sie in der letzten Datei der Liste sind. Wenn eine Belegung auf halben Wege in einen Fehler läuft, wird der Rest der Belegung nicht mehr beachtet. CTRL-C unterbricht die Belegung (unter MS-Windows CTRL-Untbr). EINE BELEGUNG LÖSCHEN Um eine Belegung zu entfernen, benutzen Sie den Befehl »:unmap«. Und wieder entspricht der Modus, für den die Belegung entfernt wird, dem benutzten Befehl: :unmap normal, visuell und Operator-hängend :vunmap visuell :nunmap normal :ounmap Operator-hängend :unmap! Einfügen und Befehlszeile :iunmap Einfügen :cunmap Befehlszeile Es gibt einen Trick, eine Belegung zu definieren, die im normalen und Operator-hängenden Modus funktioniert, aber nicht im visuellen. Zuerst definiere man sie für alle drei Modi, dann lösche man sie im visuellen Modus: > :map /---> :vunmap Beachten Sie, dass die fünf Zeichen »« für die Tastenkombination CTRL-A stehen. Um alle Belegungen zu entfernen, benutzen Sie den Befehl |:mapclear|. Sie können die Variationen für verschiedene Modi nun raten. Seien Sie vorsichtig mit diesem Befehl, er kann nicht rückgängig gemacht werden. SONDERZEICHEN Dem Befehl »:map« kann ein weiterer Befehl folgen. Das Zeichen »|« trennt die beiden Befehle. Dies bedeutet auch, dass das Zeichen »|« nicht in einem Belegungsbefehl verwandt werden kann. Um eins einzubeziehen, benutzen Sie (fünf Zeichen). Beispiel: > :map :write !checkin % Dasselbe Problem trifft auf den Befehl »:unmap« zu, und zusätzlich müssen Sie auf nachfolgende Leerzeichen achten. Diese zwei Befehle sind verschieden: > :unmap a | unmap b :unmap a| unmap b Der erste Befehl versucht »a « freizugeben, mit einem nachfolgen Leerzeichen. Wenn Sie ein Leerzeichen in einer Belegung verwenden, benutzen Sie (sieben Zeichen): > :map W Dies lässt die Leertaste ein Leerzeichen-getrenntes Wort vorwärts bewegen. Es ist nicht möglich, einen Kommentar direkt nach eine Belegung zu setzen, weil das Zeichen »"« als Teil der Belegung angenommen wird. Sie können »|"« verwenden, dies beginnt einen neuen, leeren Befehl mit einem Kommentar. Beispiel: > :map W| " Benutze Leertaste, um ein Wort vorwärts zu gehen BELEGUNGEN UND ABKÜRZUNGEN Abkürzungen verhalten sich sehr wie Belegungen für den Einfügemodus. Die Argumente werden auf dieselbe Art behandelt. Der Hauptunterschied ist die Art, wie sie ausgelöst werden. Eine Abkürzung wird ausgelöst, indem man ein nicht-Wort-Zeichen nach dem Wort tippt. Eine Belegung wird ausgelöst, wenn das letzte Zeichen getippt wird. Ein weiterer Unterschied ist, dass die Zeichen, die Sie für eine Abkürzung tippen, in den Text eingefügt werden, während Sie sie tippen. Wenn die Abkürzung ausgelöst wird, werden diese Zeichen gelöscht und durch das ersetzt, was die Abkürzung produziert. Beim Tippen der Zeichen für eine Belegung wird nichts eingefügt, bis Sie das letzte Zeichen tippen, das sie auslöst. Falls die Option 'showcmd' gesetzt ist, werden die getippten Zeichen in der letzten Zeile des Vim-Fensters angezeigt. Eine Ausnahme ist, wenn eine Belegung mehrdeutig ist. Angenommen, Sie haben zwei Belegungen gemacht: > :imap aa foo :imap aaa bar Wenn Sie nun »aa« tippen, weiß Vim nicht, ob er die erste oder das zweite Belegung anwenden soll. Er wartet, ob ein weiteres Zeichen getippt wird. Falls es ein »a« ist, wird die zwete Belegung angewandt und resultiert in »bar«. Falls es zum Beispiel ein Leerzeichen ist, wird die erste Belegung angewandt, resultierend in »foo«, und dann wird das Leerzeichen einfügt. DARÜBERHINAUS... Das Schlüsselwort