我进行了自定义语言扩展,并希望启用“转到符号”功能。我已经尝试遵循here准则,但是我仍然有点迷茫。
我想我要做的就是实现一个DocumentSymbolProvider
,但是我不确定如何去实现它。
更新
example language server docs指向已弃用的repo。它被this one代替,它更加复杂。我认为我能找到的最简单的示例是lsp-sample,但它没有使用DocumentSymbolProvider
。
我发现其他确实使用符号提供程序的存储库,但是它们有点让人不知所措。我不知道需要去哪里(例如,我既需要客户端又需要服务器吗?某些软件包似乎只使用了extension.ts
而没有客户端和服务器文件夹)。
我真正想用我的语言做的只是检测以@
开头的行,并在“转到符号” Pane 中显示它们。我希望看到一个简单的教程。
最佳答案
不必要。如language support docs you linked所示,通常有两个选项:“直接实现”和一个使用“语言服务器协议(protocol)”的选项。对于前者,您不需要客户端/服务器体系结构。语言服务器具有与编辑器无关的优点,理论上讲,您可以在实现该协议(protocol)的任何编辑器中使用它们。直接实现仅限于在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"]
}]
}
它在起作用: