如何在tmLanguage中保留关键字高亮并识别其包裹的多行字符串
语法高亮配置问题
我正在为以下文本开发语法高亮:
PAGE_TEXT_PARAGRAPH_START (HN 10 JUSTIFIED 0.0 4.0) Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed sagittis varius nulla, nec rhoncus erat vehicula eget. Sed suscipit efficitur hendrerit. Morbi sed interdum nunc. Mauris id purus nisi. Nunc elementum sem id dolor consequat maximus. Phasellus vitae lacus et orci luctus condimentum. PAGE_TEXT_PARAGRAPH_END
已在tmLanguage.json中将PAGE_TEXT_PARAGRAPH_START和PAGE_TEXT_PARAGRAPH_END定义为关键字,配置如下,这部分可正常高亮:
"keywords": { "patterns": [{ "name": "keyword.control.myprecious", "match": "(?i)\\bPAGE_PARAGRAPH_(START|END)\\b" }] }
现在需要将两个关键字之间的文本识别为字符串,添加了如下配置:
"strings": { "patterns": [{ "name": "string.quoted.double.myprecious", "begin": "\"", "end": "\"", "patterns": [{ "name": "constant.character.escape.myprecious", "match": "\\\\." }] }, { "name": "string.quoted.double.myprecious", "begin": "PAGE_TEXT_PARAGRAPH_START\\s*\\([^)]\\)\\s*", "beginCaptures": { "0": { "name": "punctuation.definition.string.begin.myprecious" } }, "end": "PAGE_TEXT_PARAGRAPH_END", "endCaptures": { "0": { "name": "punctuation.definition.string.end.myprecious" } }, "patterns": [{ "name": "constant.character.escape.myprecious", "match": "\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4}|u\\{[0-9A-Fa-f]+\\}|[0-2][0-7]{0,2}|3[0-6][0-7]?|37[0-7]?|[4-7][0-7]?|.|$)" }] } ] }
但该配置无效:关键字仍保持关键字高亮(符合预期),但中间文本未被识别为字符串。通过VS Code的「Inspect Editor Tokens and Scopes」工具查看,关键字未被标记为punctuation.definition.string.begin/end.myprecious,中间多行文本也无正确高亮。
仅当文本在双引号中时,字符串高亮正常。若将begin改为"PAGE_TEXT_PARAGRAPH_START",关键字会变成字符串样式,但中间文本可正确高亮。
需求:保留关键字的「关键字」样式高亮,同时让中间文本以「字符串」样式高亮,希望避免编写语言服务器,寻求简易解决方案。
内容的提问来源于stack exchange,提问作者Alessandro Perucchi
相关产品推荐
相关产品推荐

