VScode的插件开发
参考:官方提供的一些例程 GITHUB & GITEE代码地址
本例基于其中一个案例lsp-sample
.
LSP是C/S模式的应用, 比较直接使用VS-API的方式实现功能的优势是, 可以有更好的性能, 因为大量的计算都是在Service这个进程中进行的。而我更喜欢这个方式, 是考虑是否可以为代码完成等功能迁徙到远程服务器上。
进一步的思考
1. 是否可以在远程发生配置修改的时候,更改本地代码
2. 是否可以根据用户输入内容自动生成对应的文件, 或修改其他文件
3. 本地的修改,比如时间和内容信息是否可以传送到远程进行记录和分析
Server
初始化函数
初始化函数中定义本插件服务提供哪些功能
connection.onInitialize((params: InitializeParams) => {
const result: InitializeResult = {
capabilities: {
...
}
};
return result;
});
初始化完成
初始化完成后一般注册一些修改事件
connection.onInitialized(() => {
connection.workspace.onDidChangeWorkspaceFolders(_event => {
connection.console.log('已接收到的工作区文件夹更改事件。');
});
});
Client
1. client作为插件入口
client是插件程序的入口, 在``中做如下配置:
"activationEvents": [
"onLanguage:plaintext"
],
"main": "./client/out/extension",
2. client 的结构
依然是activate
和deactivate
作为生命周期的启用和结束. client对象的主要API
- start
- stop
export function activate(context: ExtensionContext) {
...
client.start();
}
export function deactivate(): Thenable<void> | undefined {
if (!client) {
return undefined;
}
return client.stop();
}
3.client对象的创建
接受4个参数:
- 插件ID
- 插件名称
- 服务端选项
- 客户端选项
// 创建该语言客户端并启动该客户端。
client = new LanguageClient(
'languageServerExample',
'Language Server Example',
serverOptions,
clientOptions
);
3.1 服务端选项
- TransportKind.ipc 是选择进程间通信,另外可以选择socket.
transport: {kind:TransportKind.socket,port:8888}
// 该服务器是在节点中实现的
const serverModule = context.asAbsolutePath(
path.join('server', 'out', 'server.js')
);
// 服务器的调试选项
// --inspect=6009: 在节点的检查器模式下运行服务器,以便VS代码可以附加到服务器上进行调试
const debugOptions = { execArgv: ['--nolazy', '--inspect=6009'] };
// 如果在调试模式下启动扩展,则将使用调试服务器选项,否则将使用运行选项
const serverOptions: ServerOptions = {
run: { module: serverModule, transport: TransportKind.ipc },
debug: {
module: serverModule,
transport: TransportKind.ipc,
options: debugOptions
}
};
3.2 客户端选项
- scheme感觉作用不大
- language则表示本插件关心的文件类型
// 用于控制语言客户端的选项
const clientOptions: LanguageClientOptions = {
// 为纯文本文档注册服务器
documentSelector: [{ scheme: 'file', language: 'plaintext' }],
synchronize: {
// 通知服务器关于对工作区中包含的‘.客户端中心文件的文件更改
fileEvents: workspace.createFileSystemWatcher('**/.clientrc')
}
};
网友评论