如何在Vim语法中突出以@开头的单词?

jpa*_*rdy 7 regex syntax vim

我有一个非常简单的Vim语法文件用于个人笔记.我想强调一下人们的名字,我选择了类似Twitter的语法@jonathan.

我试过了:

syntax match notesPerson "\<@\S\+"
Run Code Online (Sandbox Code Playgroud)

意思是:@以至少一个非空白字符开头并具有至少一个非空白字符的单词.问题是@在Vim正则表达式中似乎是一个特殊字符.

我试图逃避\@并用方括号括起来[@],通常的技巧,但这不起作用.我可以尝试类似(^|\s)(行或空白的开头),但这正是字边界试图解决的问题.

突出显示适用于简化的正则表达式,因此这更像是找到正确的正则表达式而不是其他任何东西的问题.我错过了什么?

ZyX*_*ZyX 13

@只有通过放置\v在之前的模式中启用"非常神奇"模式,才是特殊字符@.你在这里有另一个问题:@没有开始一个新词.\<不仅仅是像perl/PCRE那样的"单词边界" \b,而是" 左边界 "(在帮助中:"单词的开头")意味着\<必须遵循一些关键字字符.由于@通常不是一个关键字字符图案\<@永远不会匹配(即使是像\b它会匹配结构,如abc@def这绝对不是你想要的东西:对于原因,我之前解释).

您应该使用\k\@<!@\k\S*:\k\@<!确保@前面没有任何关键字字符,\k\S*确保名称的第一个字符是关键字1(您可能也可以使用@\<\S\+).

还有另一个解决方案:include @into 'iskeyword'选项并保留正则表达式:

setlocal iskeyword+=@-@
Run Code Online (Sandbox Code Playgroud)

(请参阅:h 'isfname'解释我@-@在这里使用的原因.'iskeyword'具有完全相同的语法,并将重定向到那里进行解释.)