【问题标题】:Create new tokens for vs code semantic highlighting为 vs 代码语义高亮创建新标记
【发布时间】:2021-09-29 05:22:26
【问题描述】:

如何为 VS 代码语义高亮创建新的标记图例?

这是当前可用的令牌列表:https://code.visualstudio.com/api/language-extensions/semantic-highlight-guide#standard-token-types-and-modifiers

另外,这是使用的 API:

const tokenTypes = ['class', 'interface', 'enum', 'function', 'variable'];
const tokenModifiers = ['declaration', 'documentation'];
const legend = new vscode.SemanticTokensLegend(tokenTypes, tokenModifiers);

const provider: vscode.DocumentSemanticTokensProvider = {
  provideDocumentSemanticTokens(
    document: vscode.TextDocument
  ): vscode.ProviderResult<vscode.SemanticTokens> {
    // analyze the document and return semantic tokens

    const tokensBuilder = new vscode.SemanticTokensBuilder(legend);
    // on line 1, characters 1-5 are a class declaration
    tokensBuilder.push(
      new vscode.Range(new vscode.Position(1, 1), new vscode.Position(1, 5)),
      'class',
      ['declaration']
    );
    return tokensBuilder.build();
  }
};

const selector = { language: 'java', scheme: 'file' }; // register for all Java documents from the local file system

vscode.languages.registerDocumentSemanticTokensProvider(selector, provider, legend);

【问题讨论】:

    标签: visual-studio-code syntax-highlighting vscode-extensions


    【解决方案1】:

    我在https://github.com/microsoft/language-server-protocol 上向人们询问了这个问题。答案是您不能定义新的类型和修饰符——即使某些编程语言不适合这种分类方案。例如,像 Antlr4 这样的形式解析器生成器语法的语言服务器包含词法分析器和解析器符号。这与“类”、“变量”等,或修饰符“静态”、“只读”等几乎没有任何关系。我试图提出一个任意的分类名称列表,但被拒绝了,因为我认为那里是这些分类器表示的附加功能。因此,您将需要重用客户端支持的内容、初始化时获得的列表以及从服务器返回的子集。对于语义突出显示,它“有效”。我为 my "universal language VSCode extension" 执行此操作,它采用形式语法、类列表和 XPath 分类器来识别输入中的标记以进行语义突出显示。

    【讨论】:

    • 重用是什么意思?您是否必须将 Antlr 语法转换为 textmate 才能使用突出显示?
    • Initialize request 中,客户端将发送支持的令牌类型列表。您必须从此列表中选择要使用的令牌类型,并返回您计划使用的令牌类型列表。您不能只返回任何字符串值的列表,它必须是客户端支持的。语法有“非终结符”和“终结符”。因此,“类”和“变量”对于语法文件来说是没有意义的。但是要进行 sem highl'ng,您必须将“类”(和其他标记类型)重新用于非终端和终端。
    • Textmate 不被使用。该语法用作 LSP 服务器中解析的定义。解析后,在解析树上评估 XPath2 表达式以计算 Semantic Tokens request 的结果。 XPath 表达式标识解析树中的哪些叶节点属于什么语义高亮标记类型。
    • 重新阅读您的问题后,我意识到您使用与我不同的 api 进行语义突出显示。但我认为同样的约束适用:您需要使用编辑器支持的标记类型。在我的 LSP 解决方案中,我没有创建 tmLanguage 文件,因为 LSP 直接查询所有符号以进行突出显示,这是我从解析树提供的。
    • 好的,是的,我将切换到 LSP,而不是在 tm 中指定我的整个语法,因为这将允许我添加验证。另外,您能解释一下您是如何将解析树中的符号提供给 LSP 的吗?我看到你写了一篇关于我之前的问题的博客文章,但我无法理解如何动态发送语法以供 LSP 使用
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-07
    • 1970-01-01
    • 2019-06-13
    • 1970-01-01
    • 2021-09-22
    相关资源
    最近更新 更多