【问题标题】:How to enable "Go to symbol" with a custom language in vscode?如何在 vscode 中使用自定义语言启用“转到符号”?
【发布时间】:2018-02-13 04:12:37
【问题描述】:

我做了一个自定义语言扩展,我想启用“转到符号”功能。我试图遵循here 的指导方针,但我还是有点迷茫。

我认为我需要做的就是实现DocumentSymbolProvider,但我不确定如何去做。

更新

example language server docs 指向已弃用的 repo。它被替换为this one,这要复杂得多。我认为我能找到的最简单的例子是lsp-sample,但它没有使用DocumentSymbolProvider

我发现了其他使用符号提供程序的存储库,但它们有点压倒性。我不知道需要去哪里(例如,我需要客户端和服务器吗?有些包似乎只使用extension.ts,没有客户端和服务器文件夹)。

我真正想做的就是检测以@ 开头的行并将它们显示在“转到符号”窗格中。我很想看一个简单的教程。

【问题讨论】:

标签: visual-studio-code vscode-extensions


【解决方案1】:

我需要客户端和服务器吗?

不一定。正如language support docs you linked 所示,通常有两种选择:一种是“直接实现”,另一种是使用语言服务器协议。对于前者,您不需要客户端/服务器架构。语言服务器具有与编辑器无关的优势,理论上您可以在任何实现该协议的编辑器中使用它们。直接实现仅限于在 VSCode 中使用。

我真正想做的就是检测以@ 开头的行并将它们显示在“转到符号”窗格中。

这里是extension.ts,这是一个非常简单的“直接实现”示例:

'use strict';
import * as vscode from 'vscode';

export function activate(context: vscode.ExtensionContext) {
    context.subscriptions.push(vscode.languages.registerDocumentSymbolProvider(
        {language: "foo"}, new FooDocumentSymbolProvider()
    ));
}

class FooDocumentSymbolProvider implements vscode.DocumentSymbolProvider {
    public provideDocumentSymbols(document: vscode.TextDocument,
            token: vscode.CancellationToken): Thenable<vscode.SymbolInformation[]> {
        return new Promise((resolve, reject) => {
            var symbols = [];

            for (var i = 0; i < document.lineCount; i++) {
                var line = document.lineAt(i);
                if (line.text.startsWith("@")) {
                    symbols.push({
                        name: line.text.substr(1),
                        kind: vscode.SymbolKind.Field,
                        location: new vscode.Location(document.uri, line.range)
                    })
                }
            }

            resolve(symbols);
        });
    }
}

您还需要将此添加到由 VSCode 扩展模板生成的package.json。它注册foo 语言并在打开扩展名为.foo 的文件时激活扩展:

"activationEvents": [
    "onLanguage:foo"
],
"contributes": {
    "languages": [{
        "id": "foo",
        "extensions": [".foo"]
    }]
}

它在行动:

【讨论】:

  • 非常感谢!!!你完全救了我?。只是为了我的启迪,为什么不提供SymbolInformation对象中的containerName可以?
  • 如果您检查构造函数,您会发现它在其中一个中是可选的。事实上,调用构造函数而不是像这样构造对象可能是更好的做法——我更习惯于语言服务器 API。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-05
  • 2022-07-07
  • 1970-01-01
  • 2014-09-04
相关资源
最近更新 更多