7

我有一个非常简单的 Vim 语法文件用于个人笔记。我想突出显示人们的名字,我选择了类似 Twitter 的语法@jonathan

我试过:

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

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

我试图逃避\@并用方括号括起来[@],这是通常的技巧,但这没有用。我可以尝试类似(^|\s)(行或空格的开头),但这正是 word-boundary 试图解决的问题。

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

4

1 回答 1

13

@仅当您通过\v在该模式之前的某个位置启用“非常神奇”模式时,它才是一个特殊字符@

你这里还有一个问题:@不开始一个新词。\<不仅仅是像 perl/PCRE 那样的“单词边界” \b,而是“<em>left word boundary”(在帮助中:“单词的开头”)意味着\<必须跟一些关键字字符。由于@通常不是关键字字符,因此模式\<@永远不会匹配。(即使它是这样 \b的,它也会匹配这样的结构abc@def,由于上述原因,这绝对不是你想要的。)

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

还有另一种解决方案:包含 @'iskeyword'选项中并保持正则表达式不变:

:setlocal iskeyword+=@-@

请参阅此处使用:help 'isfname'的解释@-@。(该'iskeyword'选项具有完全相同的语法,实际上会将您重定向到那里以获得解释。)

于 2012-12-18T20:43:05.623 回答