美文网首页VScode插件开发
LSP语言服务提供者

LSP语言服务提供者

作者: 从今以后_19d7 | 来源:发表于2022-11-25 12:34 被阅读0次

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 的结构

依然是activatedeactivate作为生命周期的启用结束. 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个参数:

  1. 插件ID
  2. 插件名称
  3. 服务端选项
  4. 客户端选项
// 创建该语言客户端并启动该客户端。
    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')
        }
    };

相关文章

网友评论

    本文标题:LSP语言服务提供者

    本文链接:https://www.haomeiwen.com/subject/qnrtfdtx.html