如何在vscode中使用自定义语言启用“转到符号”?

nac*_*cab 6 visual-studio-code vscode-extensions

我进行了自定义语言扩展,并希望启用“转到符号”功能。我试图按照这里的指导方针进行操作,但仍然有些失落。

我认为我所要做的只是实现一个DocumentSymbolProvider,但我不确定该如何做。

更新

示例语言服务器文档指向一个回购协议被否决。它被替换为这一个,这是更为复杂的。我认为我能找到的最简单的示例是lsp-sample,但它没有使用DocumentSymbolProvider

我发现其他确实使用符号提供程序的存储库,但是它们有点让人不知所措。我无法弄清楚需要去哪里(例如,我需要客户端和服务器吗?某些软件包似乎只使用了extension.ts没有客户端和服务器文件夹的)。

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

Gam*_*a11 7

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

不必要。如您链接语言支持文档所示,通常有两个选项:“直接实现”和一个使用“语言服务器协议”的选项。对于前者,您不需要客户端/服务器体系结构。语言服务器具有与编辑器无关的优势,理论上您可以在实现该协议的任何编辑器中使用它们。直接实现仅限于在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);
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

您还需要将其添加到package.jsonVSCode扩展模板生成的文件中。打开foo具有.foo扩展名的文件时,它将注册语言并激活扩展名:

"activationEvents": [
    "onLanguage:foo"
],
"contributes": {
    "languages": [{
        "id": "foo",
        "extensions": [".foo"]
    }]
}
Run Code Online (Sandbox Code Playgroud)

它在起作用: