【问题标题】:How do TextMate grammars and themes work with VSCode?TextMate 语法和主题如何与 VSCode 一起使用?
【发布时间】:2019-05-22 09:57:30
【问题描述】:

VSCode 建立在 MonacoEditor 之上,不支持 Textmate 语法和主题。但不知何故,VSCode 使之成为可能。我很好奇 VSCode 是如何做到这一点的。

我之所以问,是因为我正在制作一个带有 TextMate 语法和主题支持的代码编辑器(基于 Monaco)。但我无法理解如何实现它。

虽然有像 monaco-textmate 这样的包可以让 TextMate 语法与 Monaco 一起使用,但语法高亮是 still not working properly

【问题讨论】:

    标签: visual-studio-code monaco-editor tmlanguage


    【解决方案1】:

    TextMate 语法依赖于名为Oniguruma 的特定正则表达式实现/库,它是用 C 语言实现的。然而,Monaco 设计为在浏览器中运行,并且那里可用的 JavaScript 正则表达式引擎与 Oniguruma 不兼容。所有这些都在Monaco's FAQ“为什么编辑器不支持 TextMate 语法?”部分中详细解释。它还提到了可能最终将 Oniguruma 编译为 WebAssembly 以解决此问题。

    VSCode 本身使用 vscode-textmate 进行其 TMLanguage 处理,它具有 Oniguruma 库作为 native 依赖项。 VSCode 可以有原生依赖,因为它不在浏览器环境中运行。

    根据monaco-textmate's readme,其实是大量基于vscode-textmate:

    此存储库中 99% 的代码直接提取自 vscode-textmate

    而且它确实使用了前面提到的 WASM 方法:

    monaco-textmate 依赖于onigasm 包在浏览器中提供oniguruma 正则表达式引擎。 onigasm 本身依赖于WebAssembly

    至于为什么语法高亮并不总是像 monaco-textmate 预期的那样工作......我不知道,我希望这只是实现中的一个错误。也许等待维护者的回复,您链接的问题是相当新的。

    至少从概念上讲,它不能实现与 VSCode 相同的语法高亮显示不应该是有原因的,因为它使用相同的正则表达式风格。

    【讨论】:

    • 感谢您的回答。但我明白为什么 tmgrammers 不与摩纳哥合作。至于我知道 tmgrammer 为令牌生成多个范围,但 monaco 不支持多个范围。因此,包作者最终选择了最后一个范围。我认为这可能是突出显示无法正常工作的原因。但不知何故vscode能够解决它。我想知道vscode是怎么做到的。
    • 我的意思是,归根结底,VSCode 也只使用其中一个范围来突出显示,毕竟一个标记只能有一种颜色。我认为它只是使用了最具体的范围。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多