老实说,raw string literals是C ++语言的一个很好的补充。但是(正如预期的那样)编辑们很难正确地展示这些文字。
我正在使用Vim 7.4和开箱即用的原始字符串文字完全打破了语法高亮。例如在
中char const txt[] = R"(printf(")";
第二个'('在vim中突出显示为红色。
像
这样的东西char const txt2[] = R"( "{{" )";
打破花括号的突出显示和基于语法的自动识别 - 依此类推。
首先,我很乐意让Vim在进行语法突出显示时忽略R"(
和)"
之间的所有内容。
但请注意,原始字符串文字是灵活的 - 在第一个/最后一个双引号/括号对之间允许任意匹配的字符串,例如。
R"abcd()")")abcd"
也是一个有效的原始字符串文字,用于编码
)")"
另请参阅cppreference链接以获取语法的一般定义。
因此,我的问题是如何配置Vim,以便正确识别C ++原始字符串文字。
Vim似乎已经包含了一些正确的synatx工具,突出了嵌入在宿主语言中的语言片段(例如,对于编译器 - 编译器源文件)。也许它们也可以用于原始字符串文字案例?
答案 0 :(得分:7)
添加此
syntax match cString 'R"\([^(]*\)(\_.*)\1"'
到自定义C ++语法文件(通常为~/.vim/syntax/cpp.vim
;如果没有,请创建此文件。)
答案 1 :(得分:5)
只需添加cpp-vim作为插件即可。我在pull-request #14中添加了对较新字符串文字的严格支持。
这是你得到的:http://bl.ocks.org/anonymous/raw/9442865
cpp-vim也增加了对其他C ++ 11内容的支持。
答案 2 :(得分:0)
对上述语法规则的细微调整:
syntax match cString 'R"\([^(]*\)(\_.\{-})\1"'
最初尝试贪婪地选择最长的匹配项;因此,如果文件中有多个原始字符串(使用相同的打开/关闭模式),则会损坏。 这是非贪婪的,应该正确匹配。 不过,非常感谢您的原始照片,对我有很大的帮助!