我正在尝试扩展Monaco Editor,以允许用户在同一文件中使用分隔符将JavaScript和另一种语言混合编写,类似于Markdown使用围栏代码块编写多种语言的方式。
区别在于我希望保留 Monaco 为 JavaScript 内建的所有 IDE 功能,例如通过 诊断 进行的 linting、智能自动完成、跳转到定义、自动格式化助手,以及与 Monaco 自带的 JavaScript 模式相伴随的所有其他 IDE 功能。我希望这些功能仍然能够在 Monaco 编辑的 JavaScript 部分内正常工作,并且在子语言部分禁用。
我的第一次尝试是调用setMonarchTokensProvider,传入一个修改过的TypeScript的令牌化规则版本。具体来说,我能够将起始栅栏分隔符添加到根规则中,并以同样的方式为子语言创建一个新规则,就像Monarch (Monaco's syntax highligher)文档描述的那样,使用@nextEmbedded。(出于测试目的,我一直在硬编码CSS作为嵌入式语言。)
当我像这样为语言"javascript"调用setMonarchTokensProvider时,它完全忽略了此语法突出显示的分词器,并将CSS的代码栅栏颜色设置为无效的JavaScript,表明您不能以这种方式覆盖内置的JavaScript模式。
当我使用新语言(例如“mylang”)调用setMonarchTokensProvider并将编辑器设置为使用该语言时,它提供了正确的语法突出显示(!)用于此CSS-in-JS混合语言。但是,在JavaScript模式中找到的所有其他高级功能都不再存在。编辑器没有任何智能自动完成方法,用于在同一文件中定义的类或任何无效语法的编辑器错误报告,也没有其标志性的JavaScript IDE功能。
我的下一步尝试是修改预先捆绑的 Monaco 代码的 TypeScript 定义,以包括我的自定义语法高亮规则。当将语言设置为“typescript”时,这样可以完全正确地突出显示我的 CSS-in-JS 代码(!),并保留所有其他功能(!),包括诊断报告(实时验证和错误下划线)、自动完成等等。 (我没有尝试过“javascript”,但可以安全地假设它可能有效或者很容易使其有效,因为JavaScript 实际上是 Monaco 中 TypeScript 模式的变体配置。)不幸的是,它也认为其中的整个 CSS 部分(包括周围的栅栏)是无效的 JavaScript 代码。 我知道这在理论上是可行的,因为在HTML模式下,您可以嵌入CSS或JS,并且完全支持正确验证、自动完成和其他IDE功能;基本上,HTML文件中的每个子语言都像它在自己的文件中一样工作:HTML特性位于文件根目录中,CSS特性位于style标签中,JS特性位于script标签中。
但是,深入研究Monaco中的TypeScript插件实现时,无论是作为Monaco库的用户还是通过分叉并在必要时修补它,都不清楚从哪里开始编辑。我试图修改DiagnostcsAdapter [sic]并跟踪其实际实现位置,但我卡在两个函数调用深度处,似乎它推送了一个promise of syntax validation,返回稍后使用的值,但是getSyntacticDiagnostics的实现只是将工作分配给一些其他实现,我找不到任何其他地方的回购,也没有在monaco-languages repo或vscode repo中找到。
区别在于我希望保留 Monaco 为 JavaScript 内建的所有 IDE 功能,例如通过 诊断 进行的 linting、智能自动完成、跳转到定义、自动格式化助手,以及与 Monaco 自带的 JavaScript 模式相伴随的所有其他 IDE 功能。我希望这些功能仍然能够在 Monaco 编辑的 JavaScript 部分内正常工作,并且在子语言部分禁用。
我的第一次尝试是调用setMonarchTokensProvider,传入一个修改过的TypeScript的令牌化规则版本。具体来说,我能够将起始栅栏分隔符添加到根规则中,并以同样的方式为子语言创建一个新规则,就像Monarch (Monaco's syntax highligher)文档描述的那样,使用@nextEmbedded。(出于测试目的,我一直在硬编码CSS作为嵌入式语言。)
当我像这样为语言"javascript"调用setMonarchTokensProvider时,它完全忽略了此语法突出显示的分词器,并将CSS的代码栅栏颜色设置为无效的JavaScript,表明您不能以这种方式覆盖内置的JavaScript模式。
当我使用新语言(例如“mylang”)调用setMonarchTokensProvider并将编辑器设置为使用该语言时,它提供了正确的语法突出显示(!)用于此CSS-in-JS混合语言。但是,在JavaScript模式中找到的所有其他高级功能都不再存在。编辑器没有任何智能自动完成方法,用于在同一文件中定义的类或任何无效语法的编辑器错误报告,也没有其标志性的JavaScript IDE功能。
我的下一步尝试是修改预先捆绑的 Monaco 代码的 TypeScript 定义,以包括我的自定义语法高亮规则。当将语言设置为“typescript”时,这样可以完全正确地突出显示我的 CSS-in-JS 代码(!),并保留所有其他功能(!),包括诊断报告(实时验证和错误下划线)、自动完成等等。 (我没有尝试过“javascript”,但可以安全地假设它可能有效或者很容易使其有效,因为JavaScript 实际上是 Monaco 中 TypeScript 模式的变体配置。)不幸的是,它也认为其中的整个 CSS 部分(包括周围的栅栏)是无效的 JavaScript 代码。 我知道这在理论上是可行的,因为在HTML模式下,您可以嵌入CSS或JS,并且完全支持正确验证、自动完成和其他IDE功能;基本上,HTML文件中的每个子语言都像它在自己的文件中一样工作:HTML特性位于文件根目录中,CSS特性位于style标签中,JS特性位于script标签中。
但是,深入研究Monaco中的TypeScript插件实现时,无论是作为Monaco库的用户还是通过分叉并在必要时修补它,都不清楚从哪里开始编辑。我试图修改DiagnostcsAdapter [sic]并跟踪其实际实现位置,但我卡在两个函数调用深度处,似乎它推送了一个promise of syntax validation,返回稍后使用的值,但是getSyntacticDiagnostics的实现只是将工作分配给一些其他实现,我找不到任何其他地方的回购,也没有在monaco-languages repo或vscode repo中找到。