1.实现语言客户端
笔记软件在2023/4/6 14:01:04推送该笔记
Language Client
"activationEvents": [
"onLanguage:plaintext"
]
这个部分告诉VS Code只要打开纯文本文件之后就立刻激活插件(例如:打开一个.txt
文件)
"configuration": {
"type": "object",
"title": "Example configuration",
"properties": {
"languageServerExample.maxNumberOfProblems": {
"scope": "resource",
"type": "number",
"default": 100,
"description": "Controls the maximum number of problems produced by the server."
}
}
}
这个部分配置了用户可以自定义的configuration
,用户通过这个配置可以在设置中对你的插件做一些修改。
真正的语言客户端代码和对应的
package.json
在/client
文件夹中
package.json
最有趣的部分是vscode
插件主机API和vscode-languageclient
这两个依赖库。
"engines": {
"vscode": "^1.43.0"
},
"dependencies": {
"vscode-languageclient": "^6.1.3"
}
客户端实现就是一个普通的VS Code插件,它有使用全部VS Code API的能力
下面是extension.ts文件的对应内容,也是lsp-sample插件的入口:
import * as path from 'path';
import { workspace, ExtensionContext } from 'vscode';
import {
LanguageClient,
LanguageClientOptions,
ServerOptions,
TransportKind
} from 'vscode-languageclient';
let client: LanguageClient;
export function activate(context: ExtensionContext) {
// 服务器由node实现
let serverModule = context.asAbsolutePath(
path.join('server', 'out', 'server.js')
);
// 为服务器提供debug选项
// --inspect=6009: 运行在Node's Inspector mode,这样VS Code就能调试服务器了
let debugOptions = { execArgv: ['--nolazy', '--inspect=6009'] };
// 如果插件运行在调试模式那么就会使用debug server options
// 不然就使用run options
let serverOptions: ServerOptions = {
run: { module: serverModule, transport: TransportKind.ipc },
debug: {
module: serverModule,
transport: TransportKind.ipc,
options: debugOptions
}
};
// 控制语言客户端的选项
let clientOptions: LanguageClientOptions = {
// 注册纯文本服务器
documentSelector: [{ scheme: 'file', language: 'plaintext' }],
synchronize: {
// 当文件变动为'.clientrc'中那样时,通知服务器
fileEvents: workspace.createFileSystemWatcher('**/.clientrc')
}
};
// 创建语言客户端并启动
client = new LanguageClient(
'languageServerExample',
'Language Server Example',
serverOptions,
clientOptions
);
// 启动客户端,这也同时启动了服务器
client.start();
}
export function deactivate(): Thenable<void> {
if (!client) {
return undefined;
}
return client.stop();
}