BlogBlog ÜbersichtjailscriptportsoptFreeBSDLinksThermoskanne

vi Makros benutzen

Im vi(1) lassen sich oft gebrauchte vi-Kommandofolgen zu einem Makro zusammenfassen. Makros werden mittels des ex-Befehles map oder map! definiert. Werden Makros mit map erstellt, so kann das Makro aus dem Kommandomodus aufgerufen werden, map! Makros werden aus dem Textmodus aufgerufen. Um die ex-Befehle map/map! ausführen zu können, muss man sich zuerst im Kommandomodus befinden, dies erreicht man indem man im vi die Esc-Taste drückt. Danach kann mittels des Doppelpunktes in den ex-Modus umgeschaltet werden und das Makro definiert werden:

map[!] <Taste> <Kommandofolge>

Um ein Makro zu definieren, welches im Kommandomodus durch die q-Taste aufgerufen wird und an der aktuellen Cursorposition \subsection{ einfügt, danach ans Ende der Zeile springt und dort ein } einfügt, kann folgender Befehl gebraucht werden:

map q i\subsection{^[$a}

Die Kommandofolge wird dabei so eingegeben, wie wenn man das Kommando direkt im vi benutzt:

i Wechselt in den Textmodus
\subsection{ Fügt an der aktuellen Cursorposition \subsection{ ein
^[ Esc-Taste, um in den Kommandomodus zu wechseln. Muss als Ctrl + v Esc eingegeben werden
$ Springt ans Zeilenende
a Wechselt in den Textmodus, das nächste Zeichen wird nach der aktuellen Cursorposition eingefügt
} Fügt eine schliessende, geschweifte Klammer ein

Wie in diesem Beispiel gesehen wurde, müssen Steuerzeichen wie Esc, Return, Backspace mit Ctrl + v in den Makros maskiert werden.

Makros können auch auf die Funktionstasten F1 - F12 gelegt werden. Diese Tasten werden durch eine Raute # und die jeweilige Nummer symbolisiert. Folgendes Makro wird aus dem Kommandomodus mit F1 aufgerufen, fügt eine neue Zeile ein, fügt auf dieser \begin{lstlisting} ein und setzt den Cursor im Textmodus auf eine neue Zeile:

map #1 o\begin{lstlisting}^M
o Fügt eine neue Zeile nach der aktuellen Cursorposition ein und wechselt danach in den Textmodus
\begin{lstlisting} Dieser Text wird auf der neuen Zeile eingefügt
^M Return-Taste. Ein Zeilenumbruch wird vorgenommen. Wird als Ctrl + v Return eingegeben

Dieses Makro kann nur aus dem Kommandomodus aufgerufen werden. Es kann jedoch für die gleiche Taste noch ein anderes Makro definiert werden, das aber aus dem Textmodus aufgerufen wird. So kann zum Beispiel jetzt noch ein Makro auf die F1 Taste gelegt werden, dass im Textmodus aufgerufen wird, welches in den Kommandomodus wechselt und dort F1 aufruft:

map! #1 ^[^[OP
^[ Esc-Taste um in den Kommandomodus zu wechseln. Wird als Ctrl + v Esc eingegeben
^[OP F1-Taste um das Kommandomodus-Makro auf F1 auszuführen. Wird als Ctrl + v F1 eingegeben

So lassen sich natürlich interessante Sachen wie folgende zwei Makros machen:

map #1 i^[OP
map! #1 ^[^[OP

Das erste Makro wechselt durch das Drücken der F1-Taste in den Textmodus und wählt die F1-Taste, welche wiederum durch das zweite Makro in den Kommandomodus wechselt und dort die F1-Taste auswählt... Drückt man nun die F1 Taste, lässt sich dieses Spielchen dann nur noch durch ein kill -9 <vi-PID> beenden.

Eine Kurzreferenz von vi Kommandos findet man hier: http://www.chruetertee.ch/blog/archive/2005/11/26/vi-kurzreferenz.html

Anstatt Makros jedes mal wieder neu einzugeben, lassen sich diese auch in der .exrc dauerhaft speichern. Einfach die Makrozeile in die .exrc des Benutzers einfügen oder in der /etc/vi.exrc definieren, dann stehen die Makros allen Benutzern zur Verfügung.

Related Entries:
Treppeneffekt beim Einfügen von Text im vi verhindern
Rechtschreibprüfung im vi
vi Fenster teilen
Abkürzungen im vi benutzen
vi Kurzreferenz
 Permalink

Comments

No new comments allowed (anymore) on this post.