7

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

我正在使用 Vim 7.4 和开箱即用的原始字符串文字完全破坏了语法突出显示。例如在

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

第二个 '(' 在 vi​​m 中以红色突出显示。

就像是

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

打破了花括号的突出显示和基于语法的自动识别 - 等等。

首先,我很乐意让 Vim在语法高亮之间R"(和期间忽略所有内容。)"

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

R"abcd()")")abcd"

也是一个有效的原始字符串文字,它编码

)")"

有关语法的一般定义,另请参见 cppreference 链接。

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

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

4

3 回答 3

7

添加这个

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

到您的自定义 C++ 语法文件(通常~/.vim/syntax/cpp.vim;如果没有,请创建此文件)。

于 2014-03-26T23:09:59.563 回答
5

只需将cpp-vim添加为插件即可。我在pull-request #14中添加了对较新字符串文字的严格支持。

这就是你得到的:http: //bl.ocks.org/anonymous/raw/9442865

cpp-vim 也增加了对其他 C++11 的支持。

于 2014-03-27T07:14:27.013 回答
0

对上述语法规则的微小调整:

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

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

于 2019-04-28T02:05:34.060 回答