【问题标题】:Extending VSCode Markdown syntax highlighting to match nested Javascript code扩展 VSCode Markdown 语法高亮以匹配嵌套的 Javascript 代码
【发布时间】:2022-01-25 14:37:56
【问题描述】:

我正在尝试扩展 VSCode 的 Markdown 语法高亮器,以高亮一些包含在自定义语法中的嵌套 Javascript。比如下面的 Markdown 文件

# Example

@@$ var value = 10;

The result is @@{value}.

将转换为

# Example

The result is 10.

我希望在 VSCode 中将以下内容突出显示为 Javascript,就好像它们被包装在一个受保护的代码块中一样:

  • @@$开头的行的内容。

  • 包裹在@@{}之间的内容。

我尝试修改markdown.tmLanguage.json 以添加这些:

"fenced_code_block_majsdown2": {
    "begin": "(^|\\G)(@@$)",
    "name": "markup.fenced_code.block.markdown",
    "end": "(^|\\G)(\\r\\n|\\r|\\n)\\s*$",
    "patterns": [{ "include": "source.js" }]
},
"fenced_code_block_majsdown": {
    "begin": "(^|\\G)(@@{)",
    "name": "markup.fenced_code.block.markdown",
    "end": "(^|\\G)(})\\s*$",
    "patterns": [{ "include": "source.js" }]
},

代码被正确突出显示,但似乎"end" 位被忽略了,我不明白为什么——从@@$@@{ 开始,整个文档被突出显示为Javascript。我尝试了几种正则表达式组合,并尝试删除初始部分 ((^|\\G)),但我无法弄清楚为什么荧光笔如此贪婪。

我怎样才能达到我想要的目标?

【问题讨论】:

  • 模式中与$字符匹配的$必须被转义,(^|\\G)(@@\\$)

标签: javascript regex visual-studio-code vscode-extensions textmate


【解决方案1】:

我最终以这种方式解决了问题:

{
    "$schema": "https://raw.githubusercontent.com/martinring/tmlanguage/master/tmlanguage.json",
    "name": "Majsdown",
    "patterns": [
        {
            "include": "#majsdown_inject_expression"
        },
        {
            "include": "#majsdown_execute_statement"
        },
        {
            "include": "text.html.markdown"
        }
    ],
    "repository": {
        "majsdown_inject_expression": {
            "begin": "(.*?)(@@\\{)",
            "name": "test",
            "end": "(\\})",
            "beginCaptures": {
                "2": {
                    "name": "keyword.control.majsdown"
                }
            },
            "endCaptures": {
                "1": {
                    "name": "keyword.control.majsdown"
                }
            },
            "patterns": [
                {
                    "include": "source.js"
                }
            ]
        },
        "majsdown_execute_statement": {
            "begin": "(.*?)(@@\\$)",
            "name": "test",
            "end": "(\\r\\n|\\r|\\n)",
            "beginCaptures": {
                "2": {
                    "name": "keyword.control.majsdown"
                }
            },
            "patterns": [
                {
                    "include": "source.js"
                }
            ]
        }
    },
    "scopeName": "source.majsdown"
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-14
    • 1970-01-01
    相关资源
    最近更新 更多