我有一个非常简单的Vim语法文件用于个人笔记。我想强调一下人们的名字,我选择了类似Twitter的语法@jonathan
。
我试过了:
syntax match notesPerson "\<@\S\+"
表示:以@
开头且至少有一个非空白字符的单词。问题是@
似乎是Vim正则表达式中的一个特殊字符。
我试图逃避\@
,并用方括号[@]
括起来,这是常用的技巧,但这不起作用。我可以尝试类似(^|\s)
(行或空白的开头),但这正是字边界试图解决的问题。
突出显示适用于简化的正则表达式,因此这更像是找到正确的正则表达式而不是其他任何东西。我错过了什么?
答案 0 :(得分:13)
@
是一个特殊字符,只有在\v
之前将@
置于模式中时才启用“非常神奇”模式。您在此处有另一个问题:@
无法启动新单词。 \<
不仅仅是“字边界”,例如perl / PCRE \b
,而是“左字边界”(在帮助:“单词的开头”),意味着在{ {1}}必须遵循一些关键字字符。由于\<
通常不是关键字字符模式@
永远不会匹配(即使像\<@
那样它会匹配像\b
这样的结构,这绝对不是你想要的:因为我之前解释过。)
您应该使用abc@def
代替:\k\@<!@\k\S*
确保\k\@<!
前面没有任何关键字字符,@
确保名称的第一个字符是关键字1 (你也可以使用\k\S*
)。
还有另一种解决方案:将@\<\S\+
添加到@
选项中并保留正则表达式:
'iskeyword'
(请参阅setlocal iskeyword+=@-@
了解我在这里使用:h 'isfname'
的原因。@-@
具有完全相同的语法,并会将您重定向到那里进行解释。)