2012-12-18 12 views
7

Mam bardzo prosty plik składni Vima do notatek osobistych. Chciałbym podkreślić imię i nazwisko osób, a wybrałem składnię podobną do Twittera: @jonathan.Jak wyróżnić słowa rozpoczynające się od @ w składni Vima?

Próbowałem:

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

oznaczać: słowa zaczynające się @ i mający co najmniej jeden inny niż biały znak. Problem polega na tym, że @ wydaje się być specjalną postacią w wyrażeń regularnych Vima.

Próbowałem uciec \@ i zawrzeć w nawiasach [@], zwykłe sztuczki, ale to nie zadziałało. Mógłbym wypróbować coś takiego jak (^|\s) (początek linii lub białych znaków), ale to jest właśnie problem, który próbuje rozwiązać słowo-granica.

Podkreślanie działa na uproszczonych wyrażeń regularnych, więc jest to bardziej kwestia znalezienia właściwego wyrażenia regularnego niż cokolwiek innego. czego mi brakuje?

+0

Dlaczego uciekłeś z '+' w '\ S \ +'? Spróbuj '@ \ S +' lub '\ @ \ S +', jeśli '@' jest uważany za znak specjalny w 'vim'. Nie wiem o tym. –

+0

@RohitJain Ponieważ składnia vim pochodzi z BRE. To musi być uniknięte, aby być wyjątkowym. – ZyX

+0

@ZyX .. Oh! Nie wiedziałem o tym. Dzięki :) –

Odpowiedz

13

@ to znak specjalny, tylko jeśli włączyłeś tryb "bardzo magiczny", umieszczając \v we wzorze przed @. Masz tu inny problem: @ nie uruchamia nowego słowa. \< to nie tylko "granica słowa" jak perl/PCRE \b, ale "opuścił granicę słowa" (w pomocy: "początek słowa"), co oznacza, że ​​po \< musi nastąpić jakiś znak słowa kluczowego. Ponieważ @ nie jest zwykle wzorcem znaków słowa kluczowego \<@ nigdy nie będzie zgodny (a nawet gdyby był taki jak \b, to pasowałby do konstrukcji takich jak [email protected], co zdecydowanie nie jest tym, czego potrzebujesz: z tego powodu, o którym wcześniej mówiłem).

Należy użyć \k\@<[email protected]\k\S* zamiast: \k\@<! zapewnia @ nie jest poprzedzony dowolnym charakterze kluczowym, \k\S* zapewnia, że ​​pierwszy znak nazwy jest słowem kluczowym jeden (prawdopodobnie można również użyć @\<\S\+).

Nie

jest inne rozwiązanie: include @ do 'iskeyword' opcji i zostawić regex jak jest.

setlocal [email protected]@ 

(patrz :h 'isfname' za wyjaśnienie, dlaczego używam @[email protected] tutaj 'iskeyword' ma dokładnie taką samą składnię i przekieruje tam dla wyjaśnienia.)

+0

Działa świetnie! Dzięki za szczegółowe wyjaśnienie. – jpalardy

Powiązane problemy