Aaron Fischer Ingenieur, Vater, Heimwerker, Problemlöser

15 September, 2009

Void Match

TL;DR:

Syntax Highlighting ist schon ziemlich wichtig, wenn man sich in Code oder anderem strukturiertem Text schnell zurechtfinden will. Doch manchmal hätte man gerne bestimmte Pattern farblich hervorgehoben, sei es zur besseren Übersicht oder als Editierhilfe.

Um etwas einzufärben, müssen zuerst Farbschemas definiert werden. Es existieren schon vorgefertigte, die man sich mit dem Befehl :hi[ghlight] anzeigen lassen kann. Wie man sieht, gibt es mehrere Einstellungen für das Farbschema. cterm[gf|bg] stellt die Hinter- und Vordergrundfarbe für die Console ein, für gVim setzt man gui[bg|fg]. Farben können entweder als Text (Blue, black, GREEN, ...) oder als Nummer (0..255) angegeben werden. Die GUI-Einstellungen unterstützen auch RGB-Werte.

Um nun die Farbschemas einzusetzen, gibt es den Befehl :mat[ch], der wie folgt aufgebaut ist:

:mat[ch] {name} /{pattern}/

Diese Definition lässt sich auch mit :help match in der Hilfe nachschlagen. Mit {name} Ist das zuvor definierte Farbschema gemeint, mit {pattern} ein Muster, mit dem definiert werden kann, welche Stellen im Text mit dem Farbschema ausgestattet werden soll. Machen wir ein paar Beispiele:

:highlight EOLWhitespace ctermbg=red
:match EOLWhitespace /[  |\\t]\\+$/

Wir definieren EOLWhitespace, das auf der Console den Hintergrund rot einfärbt. Danach wenden wir dieses Farbschema auf den Ausdruck [ |\\t]\\+$ an. Dieser markiert alle Tabs (\t) und/oder Leerzeichen auf die nur ein Zeilenumbruch ($) folgt. Also alle unnötigen Whitespaces am Ende einer Zeile.

Ein etwas interessanteres Beispiel markiert alle Zeichen in einer Zeile, die die 80 Zeichen Marke übersteigen. So kann der Editor signalisieren, dass die eingegebene Zeile zu lang ist wenn sie 80 Zeichen übersteigt.

:highlight needLineBreak ctermbg=gray
:match needLineBreak /.\\%>80v/

Das Pattern \\%>>80v ist nicht gerade intuitiv. Vim stellt einige Spezialformen bereit um auf Dinge wie Zeilenlänge, Cursorposition etc. zuzugreifen. Eine Übersicht findet man mit :help pattern-overview. Das obige Pattern steht für Matches after a specific column..

Auch komplexere Dinge sind möglich. Um im Code jeweils den Autor hervorzuheben, kann man das Pattern \\@<= verwenden, um so etwas wie (?<=pattern) zu erreichen. Der unten abgebildete Ausdruck sucht nach dem Vorkommen von @author: oder @Autor: und macht dann aber alle Nachfolgende.

:highlight author ctermbg=black ctermfg=blue
:match author /\\(@[aA]uth\\?or: \\?\\)\\@<=[^ ].\\+/

Will man alles wieder deaktivieren, gibt man :match none ein. Mit diesen beiden Befehlen lässt sich so einiges erreichen, Anwendungsmöglichkeiten gibt es viele.

Notiz auf dem CheatSheet: