美文网首页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