介绍
LSP
是Language Server Protocol 的缩写,它定义了一种标准化的协议,用于编辑器和语言工具之间的通信。这个协议定义了编辑器可以向语言工具查询的功能,同时还定义了语言工具可以向编辑器发送的信息。开发人员可以在多个编辑器中使用同一种语言工具,无需了解编辑器的具体实现细节。
LSP
可以提供多种功能,例如语法分析、代码高亮、错误检查、代码重构以及文档导航等。通过使用 LSP
,我们可以在不同的编辑器和语言工具之间共享这些功能,让开发变得更加高效和一致。
常见协议
- LSP: Language Server Protocol,由Microsoft推出的一个开放协议。
- JSON-RPC:JSON Remote Procedure Call,一种轻量级的远程过程调用协议。
- XML-RPC:XML Remote Procedure Call,使用XML格式进行数据交换的远程过程调用协议。
代码演示
-
创建一个新文件夹,并在Visual Studio Code中打开它。
-
添加一个名为
package.json
的新文件,并填写以下细节:
{
“name”: “lsp-demo”,
“version”: “0.0.1”,
“dependencies”: {
“vscode”: “^1.32.0”
}
}
这个文件告诉npm
(Node.js
包管理器)你的项目依赖于VSCode
扩展API
。 -
创建一个名为
src
的新文件夹,并添加一个名为server.ts
的文件。 -
在
server.ts
中,添加下面的代码:
import * as vscode from 'vscode';
import { LanguageClient, LanguageClientOptions, ServerOptions, TransportKind } from 'vscode-languageclient';
let client: LanguageClient;
export function activate(context: vscode.ExtensionContext) {
const serverOptions: ServerOptions = {
run: { command: 'node', args: ['./src/server.js'], transport: TransportKind.stdio },
debug: { command: 'node', args: ['--inspect-brk=0', './src/server.js'], transport: TransportKind.stdio }
};
const clientOptions: LanguageClientOptions = {
documentSelector: ['javascript'],
synchronize: {
configurationSection: 'lsp-sample'
}
};
client = new LanguageClient(
'lsp-sample',
'LSP Sample',
serverOptions,
clientOptions
);
client.start();
}
这段代码为名称为 lsp-sample
的新 LanguageClient
创建对象,并启动它。
- 在
src
文件夹中创建另一个名为server.js
的文件,添加以下代码:
const { createConnection } = require('vscode-languageserver/node');
const { TextDocuments } = require('vscode-languageserver/node');
const { TextDocument } = require('vscode-languageserver-textdocument');
const connection = createConnection();
const documents = new TextDocuments(TextDocument);
connection.onInitialize(() => {
return {
capabilities: {
textDocumentSync: documents.syncKind,
completionProvider: {
resolveProvider: true
}
}
};
});
connection.onInitialized(() => {
connection.client.register(DidChangeConfigurationNotification.type, undefined);
});
documents.onDidChangeContent((change) => {
connection.console.log('Content changed!');
});
connection.onCompletion((textDocumentPosition) => {
return [
{
label: 'TypeScript',
kind: CompletionItemKind.Text,
data: 1
},
{
label: 'JavaScript',
kind: CompletionItemKind.Text,
data: 2
}
];
});
documents.listen(connection);
connection.listen();
这段代码创建了一个新的语言服务器,支持文本同步、配置更改和完成提供程序。
- 最后,在
VSCode
中启动客户端运行演示。打开一个扩展名为.js
的新文件并开始输入。你应该会在编辑器中看到自动完成建议弹出。
应用范例
现在,越来越多的工具开始使用LSP,包括:
- Visual Studio Code:JavaScript 语言服务器。
- Eclipse:Java 语言服务器。
- Atom:TypeScript 语言服务器。
- Sublime Text:Python 语言服务器。
以下是应用了 LSP
的开源代码,可作为实现参考: