如何在Vim中从语法高亮显示中排除c++原始字符串文字



老实说,原始字符串文字对c++语言来说是一个很好的补充。但是(正如预期的那样)编辑器很难正确显示这些文字。

我使用Vim 7.4和开箱即用的原始字符串文字完全打破了语法高亮显示。例如

char const txt[] = R"(printf(")";

第二个'('在vim中以红色突出显示。

之类的
char const txt2[] = R"(  "{{"  )";

打破了花括号的高亮显示和基于自动识别的语法,等等。

首先,我很高兴Vim在做语法高亮时忽略R"()"之间的所有内容。

但是请注意,原始字符串文字是灵活的-允许在第一个/最后一个双引号/大括号对之间任意匹配字符串,例如

R"abcd()")")abcd"

也是对

进行编码的有效原始字符串字面值。<>之前)")" 之前

另见cppreference链接以获得语法的一般定义。

因此,我的问题是如何配置Vim,使c++原始字符串文字被正确识别。

Vim似乎已经包含了一些工具来正确地语法高亮嵌入在宿主语言中的语言片段(例如,用于编译器-编译器源文件)。也许它们也可以用于原始字符串文本的情况?

添加

syntax match cString 'R"([^(]*)(_.*)1"'

到你的自定义c++语法文件(通常是~/.vim/syntax/cpp.vim;

只需添加cpp-vim作为插件。我已经在pull-request #14中增加了对较新的字符串字面值的严格支持。

结果如下:http://bl.ocks.org/anonymous/raw/9442865

cpp-vim也增加了对其他c++ 11功能的支持

对上面的语法规则做一个小小的调整:

syntax match cString 'R"([^(]*)(_.{-})1"'

原始尝试贪婪地选择最长匹配;因此,如果您在一个文件中有多个原始字符串(使用相同的打开/关闭模式),则会中断。这一个是非贪婪的,应该正确匹配。非常感谢你的原创,这对我有很大的帮助!

最新更新