将自定义语法添加到Javascript语言(VSCode)

时间:2018-01-15 12:01:43

标签: visual-studio-code vscode-extensions vscode-settings

我使用自定义环境,我们的构建系统使用特定的宏来更改输出的JS文件。 当我使用VSCode时,它似乎并不喜欢这种语法,并且这使得它的编码真的很烦人,因为在大多数情况下它还会打破进一步的语法高亮。

自定义语法为{{custom}}custom可以是几件事,起初我喜欢vscode只是将整个宏语法识别为一个字符串,所以它不会搞砸任何东西。最后,我想自定义宏的内部,所以我可以突出显示它。

我已经尝试在网上搜索解决方案,然后扩展以获得解决方案,但是没有成功,目前我最接近的是,直接编辑javascript tmLanguange文件并在语句中添加以下内容:

"mystring-double": {
    "name": "string.template.js",
        "begin": "([_$[:alpha:]][_$[:alnum:]]*)?({{)",
            "beginCaptures": {
        "1": {
            "name": "entity.name.function.tagged-template.js"
        },
        "2": {
            "name": "punctuation.definition.string.template.begin.js"
        }
    },
    "end": "}}",
        "endCaptures": {
        "0": {
            "name": "punctuation.definition.string.template.end.js"
        }
    },
    "patterns": [
        {
            "include": "#string-character-escape"
        }
    ]
}

并将字符串语句更改为以下内容:

"string": {
    "patterns": [
        {
            "include": "#qstring-single"
        },
        {
            "include": "#qstring-double"
        },
        {
            "include": "#mystring-double"
        }
    ]
},

这非常hacky,但仍然很难实现我想做的事情。 目前代码看起来像我的更改:

vscode screenshot

从截图中看起来它根本不起作用,但实际上它确实在某些情况下,在其他一些中断语法突出显示,我总是在宏上看到错误。

任何关于我如何进行扩展以做我想做的事情的帮助都会非常感激!

1 个答案:

答案 0 :(得分:2)

您应该可以使用grammar injection来实现此目的。例如,看看lit-html extension如何注入对字符串的支持,如:

const myHtml = html`<br>`

编写注入语法需要两个文件:the grammar itselfpackage.json contribution

我相信你可能需要两次注射,一次用于像a === {{bla}}这样的表达式,另一次用于像"{{bla}}"这样的字符串内的表达式。第一种情况与lit-html的情况非常相似,而对于第二种情况,您的注射选择器将类似于"injectionSelector": "L:source.string"