2010-06-21 14 views
8

Immer wenn ich auf reguläre Ausdrücke beliebiger Komplexität schaue, beginnen meine Augen zu tränen. Gibt es eine vorhandene Lösung, um den verschiedenen Arten von Symbolen in einem Regex-Ausdruck unterschiedliche Farben zu geben?Syntaxhervorhebung für reguläre Ausdrücke in Vim

Idealerweise hätte ich gerne eine andere Hervorhebung für Literalzeichen, Escape-Sequenzen, Klassencodes, Anker, Modifikatoren, Lookaheads usw. Offensichtlich ändert sich die Syntax leicht in den verschiedenen Sprachen, aber das ist eine Falte, die später behandelt wird.

Bonuspunkte, wenn dies irgendwie mit der Syntaxhervorhebung koexistieren kann, die Vim für jede Sprache verwendet, die die Regex verwendet.

Gibt es das irgendwo, oder sollte ich da draußen sein?

Antwort

6

Reguläre Ausdrücke sind möglicherweise nicht syntax-hervorgehoben, aber Sie können prüfen, ob sie auf andere Weise besser lesbar sind.

In einigen Sprachen können Sie reguläre Ausdrücke über mehrere Zeilen (Perl, C#, Javascript) aufteilen. Sobald Sie dies tun, können Sie es formatieren, damit es für gewöhnliche Augen besser lesbar ist. Here's an example of what I mean.

Sie können auch die advanced (?x) syntax explained here in einigen Sprachen verwenden. Hier ein Beispiel:

(?x:   # Find word-looking things without vowels, if they contain an "s" 
    \b      # word boundary 
    [^b-df-hj-np-tv-z]*  # nonvowels only (zero or more) 
    s      # there must be an "s" 
    [^b-df-hj-np-tv-z]*  # nonvowels only (zero or more) 
    \b      # word boundary 
) 

EDIT:

Wie Al wies darauf hin, können Sie auch die String-Verkettung verwenden, wenn alles andere fehlschlägt. Hier ein Beispiel:

regex = ""   # Find word-looking things without vowels, if they contain an "s" 
    + "\b"      # word boundary 
    + "[^b-df-hj-np-tv-z]*"  # nonvowels only (zero or more) 
    + "s"      # there must be an "s" 
    + "[^b-df-hj-np-tv-z]*"  # nonvowels only (zero or more) 
    + "\b";      # word boundary 
+2

+1: Dies ist ein guter Weg, es zu tun. Wenn Sie Funktionen in nativem Vim schreiben, gibt es keine Unterstützung für ausführliche REs. Wenn Sie dies jedoch tun möchten, können Sie die String-Verkettung verwenden, um dasselbe zu erreichen. – DrAl

2

Vim verfügt bereits über eine Syntaxhervorhebung für reguläre Perl-Ausdrücke. Selbst wenn Sie Perl nicht selbst kennen, können Sie Ihre Regex trotzdem in Perl schreiben (einen neuen Puffer öffnen, den Dateityp auf perl setzen und '/regex/' einfügen) und der Regex funktioniert in vielen anderen Sprachen wie PHP, Javascript oder Python, wo sie die PCRE-Bibliothek verwendet oder die Perl-Syntax kopiert haben.

In einer vimscript-Datei können Sie die folgende Codezeile einfügen Syntax für regex Hervorhebung zu erhalten:

let testvar =~ "\(foo\|bar\)" 

Sie mit dem regulären Ausdruck in doppelten Anführungszeichen rumspielen kann, bis Sie daran zu arbeiten haben.

Es ist sehr schwierig, Syntax-Highlighting für Regex in einigen Sprachen zu schreiben, da die Regex in Anführungszeichen geschrieben sind (im Gegensatz zu Perl und Javascript, wo sie Teil der Syntax sind). Um Ihnen eine Idee zu geben, hebt diese syntax script for PHP Regex innerhalb Strings doppelt und single-quoted, aber der Code zu markieren nur die Regex ist länger als die meisten Sprachen der gesamten Syntax-Skripte.