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

时间:2012-12-18 20:19:19

标签: regex vim syntax

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

我试过了:

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

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

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

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

1 个答案:

答案 0 :(得分:13)

@是一个特殊字符,只有在\v之前将@置于模式中时才启用“非常神奇”模式。您在此处有另一个问题:@无法启动新单词。 \<不仅仅是“字边界”,例如perl / PCRE \b,而是“字边界”(在帮助:“单词的开头”),意味着在{ {1}}必须遵循一些关键字字符。由于\<通常不是关键字字符模式@永远不会匹配(即使像\<@那样它会匹配像\b这样的结构,这绝对不是你想要的:因为我之前解释过。)

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

还有另一种解决方案:将@\<\S\+添加到@选项中并保留正则表达式:

'iskeyword'

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