【问题标题】:Monaco editor custom token provider behaviourMonaco 编辑器自定义令牌提供者行为
【发布时间】:2021-02-03 10:21:26
【问题描述】:

我正在尝试实现具有非常特定行为的标记器,例如,在以下情况下:

1:   Line 1
2:   Line 2
3:
4:   Line 4 
5:   Line 5
6:   Line 6
7:
8:
9:   Line 9

第 1 行的更改将导致第 1-3 行的重新标记化,第 5 行的更改将导致第 3-8 行的重新标记化,第 9 行的更改将导致第 7-9 行的重新标记化,等等.... 这是因为给定行的标记化可能会根据在下一个空行之前发生的情况而有所不同。

所以基本上,我希望通过用空行分隔的块来标记文本。

我有一个使用装饰的模糊原型,但对于我的用例来说,没有办法使用装饰或语义标记,主要是出于性能原因。然而,摩纳哥的setTokensProvider 似乎只能逐行工作:编辑文档中的一行将导致每个后续行都被重新标记,无法停止,也无法重新标记之前的行.

目前是否有任何现实的方法可以做到这一点,即使它是 hacky 和/或涉及摆弄一些未公开的 API? vscode 的 textmate 语法能够指定跨越多行的标记,所以我觉得我错过了一些东西:/

【问题讨论】:

  • 摩纳哥分词器逐行工作,而是使用正则表达式来匹配文本部分(声明性分词器)。例如,更改多行注释分隔符也会影响许多(如果不是全部)输入行。与您想要达到的目标相同。
  • @MikeLischke 不是只有 Monarch 的吗?我说的是“手动”标记器实现,使用setTokensProvider,它只接受TokensProvider,并且似乎只能逐行浏览文本?
  • 是的,你是对的。我什至没有注意到还有另一个标记器界面。我一直只使用 Monarch 标记器并实现了一个非常有效的语法突出显示功能,它甚至将 2 种语言合二为一。

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


【解决方案1】:

听起来您正在寻找DocumentSemanticTokensProvider。看看this blog post

顾名思义,摩纳哥的 DocumentSemanticTokensProvider 处理为整个输入文档提供语义。不像 令牌提供者,而不是提供一组正则表达式 标记文档,一个 DocumentSemanticTokensProvider 实现是一个回调函数:调用时,该函数是 提供包含由输入的代码的整体模型 用户,并且执行者有责任返回 必要的语义信息,需要完整的解析。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-18
  • 1970-01-01
  • 2021-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多