2012-12-18 7 views
7

개인 메모 용으로 매우 간단한 Vim 구문 파일이 있습니다. 저는 사람들의 이름을 강조하고 싶습니다. 트위터와 비슷한 구문 @jonathan을 선택했습니다. Vim 구문에서 @로 시작하는 단어를 강조 표시하는 방법은 무엇입니까?

내가 시도 :

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

말하려면 단어 @로 시작하는 적어도 하나의 공백이 아닌 문자를 가지고. 문제는 @이 Vim 정규 표현식의 특수 문자 인 것 같습니다.

저는 \@을 탈출하여 대괄호 [@]으로 묶으려고했으나 작동하지 않았습니다. 나는 (^|\s) (라인 또는 공백의 시작)과 같은 것을 시도 할 수 있습니다. 그러나 그것은 정확히 단어 경계가 해결하려고하는 문제입니다.

강조 표시는 단순화 된 정규 표현식에서 작동하므로 다른 정규 표현식보다 정확한 정규 표현식을 찾는 것이 더 중요합니다. 내가 뭘 놓치고 있니?

+0

왜'\'를'\ S \ +'에서 이스케이프 처리 했습니까? '@'가'vim'에서 특수 문자로 간주되면'@ \ S +'또는'\ @ \ S +'를 사용하십시오. 나는 그것에 대해 모른다. –

+0

@RohitJain vim 구문은 BRE에서 비롯되었으므로 그것은 특별해야만 탈출해야합니다. – ZyX

+0

@ZyX .. 오! 나는 그것을 몰랐다. 감사합니다 :) –

답변

13

@@보다 먼저 패턴에 \v을 삽입하여 "매우 매직"모드를 설정 한 경우에만 특수 문자입니다. 여기에 또 다른 문제가 있습니다 : @ 새 단어가 시작되지 않습니다. \<은 펄/PCRE \b과 같은 "단어 경계"가 아니라 \< 뒤에 키워드 문자를 따라야한다는 것을 의미하는 "왼쪽 단어 단어 경계"(도움말 : "단어 시작")를 의미합니다. @은 일반적으로 키워드 문자 패턴 \<@이 아니기 때문에 일치하지 않습니다 (심지어 \b과 같았을지라도 [email protected]과 같은 구문은 일치하지 않을 것입니다. 이는 내가 전에 설명한 이유와는 분명히 다릅니다).

대신 \k\@<[email protected]\k\S*을 사용해야합니다 \k\@<!@이 키워드 문자가 선행되지 않도록, \k\S* 이름의 첫 번째 문자 키워드 중 하나 (아마 당신은 또한 @\<\S\+를 사용할 수있는) 것을 확인합니다.

다른 솔루션입니다 : 'iskeyword' 옵션에 @을 포함하고있는 그대로 정규식을 떠나 :.

setlocal [email protected]@ 

(내가 여기 @[email protected]를 사용하는 이유를 설명 :h 'isfname'를 참조 'iskeyword' 정확히 동일한 구문을 가지고 있으며, 리디렉션합니다 거기에 설명이 있습니다.)

+0

위대한 작품! 자세한 설명 주셔서 감사합니다. – jpalardy

관련 문제