2012-12-18 14 views
7

Ich habe eine sehr einfache Vim-Syntax-Datei für persönliche Notizen. Ich möchte den Namen der Leute hervorheben, und ich wählte eine Twitter-ähnliche Syntax .Wie markieren Sie Wörter, die mit @ in Vim-Syntax beginnen?

Ich habe versucht:

syntax match notesPerson "\<@\S\+" 

Mittelwert: Wörter mit @ beginnen und mindestens ein Nicht-Leerzeichen mit. Das Problem ist, dass @ ein Sonderzeichen in Vim regulären Ausdrücken zu sein scheint.

Ich habe versucht, \@ zu entkommen und in Klammern [@], die üblichen Tricks, aber das hat nicht funktioniert. Ich könnte etwas wie (^|\s) (Anfang der Zeile oder Leerzeichen) versuchen, aber das ist genau das Problem, das Wortgrenze versucht zu lösen.

Die Hervorhebung funktioniert bei vereinfachten regulären Ausdrücken. Es handelt sich also eher darum, die richtige Regex zu finden als alles andere. Was vermisse ich?

+0

Warum haben Sie Ihr '+' in '\ S \ +' entkommen? Versuchen Sie '@ \ S +' oder '\ @ \ S +', wenn '@' in 'vim' als Sonderzeichen betrachtet wird. Ich weiß es nicht. –

+0

@RohitJain Weil die vim-Syntax von BRE stammt. Es muss entkommen sein, um etwas Besonderes zu sein. – ZyX

+0

@ZyX .. Oh! Das wusste ich nicht. Danke :) –

Antwort

13

@ ist nur dann ein Sonderzeichen, wenn Sie den Modus "sehr magisch" aktiviert haben, indem Sie \v im Muster vor @ platzieren. Sie haben hier ein anderes Problem: @ startet kein neues Wort. \< ist nicht nur „Wortgrenze“ wie Perl/PCRE \b, aber „links Wortgrenze“ (in-Hilfe: „Anfang des Wortes“), was bedeutet, dass nach \< muss einige Keyword-Zeichen folgen. Als @ ist normalerweise kein Schlüsselwortmuster \<@ wird nie übereinstimmen (und selbst wenn es wie \b wäre, würde es Konstrukte wie [email protected] entsprechen, was definitiv nicht das ist, was Sie wollen: aus dem Grund, den ich vorher erklärte).

Sie \k\@<[email protected]\k\S* stattdessen verwenden sollten: \k\@<! sorgt dafür, dass @ nicht von einem Schlüsselwort Zeichen vorangestellt ist, macht \k\S* sicher, dass erste Zeichen des Namens ein Schlüsselwort ein (man könnte wahrscheinlich auch @\<\S\+ verwenden).

Es gibt eine andere Lösung: @ in 'iskeyword' Option enthalten und die Regex lassen, wie sie ist.

setlocal [email protected]@ 

(:h 'isfname' für die Erklärung, warum ich @[email protected] hier verwenden 'iskeyword' hat genau die gleiche Syntax und umleiten Sie dort für die Erklärung.)

+0

Funktioniert gut! Danke für die ausführliche Erklärung. – jpalardy

Verwandte Themen