我是否需要客戶端和服務器?
不一定。如language support docs you linked所示,通常有兩種選擇:「直接實現」和使用語言服務器協議的選項。對於前者,您不需要客戶端/服務器架構。語言服務器具有編輯無關的優點,理論上可以在任何實現該協議的編輯器中使用它們。直接實現僅限於在VSCode中使用。
我真的想用我的語言來做的就是檢測以@
開頭的行,並在Go to Symbol窗格中顯示它們。
這裏的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"]
}]
}
這是在行動:
![](https://i.imgur.com/rpIarhb.gif)
你能成爲一個更具體一點關於這部分你確切地掙扎?您鏈接的文檔有一個實現示例。我不認爲有必要特別爲「Go to symbol」支持修改'package.json',但是您需要在那裏爲您的自定義語言定義一個ID。 – Gama11
@ Gama11我已經更新它更加精確。 – nachocab