VSCode插件教程(6):LSP协议初始化参数

作者:技术拾光时间:2026-05-30 08:04:12浏览:578

LSP(语言服务器协议)初始化参数包括运行环境信息(进程ID、根URI、路径)、客户端能力、跟踪设置及工作区文件夹列表。路径仅当打开目录时有效,rootUri优先级高于rootPath。参数分为环境、能力与辅助设定三类,用于配置客户端与服务器的初始通信。

vscode插件快餐教程(6) - LSP协议的初始化参数

我们已经完成了LSP代码补全的基本实现,现在可以尝试搭建一套真正能运行的LSP系统了。在此之前,不妨再夯实一些基础细节。

第4节中我们讨论了LSP初始化时的握手过程。具体来说,在connection的onInitialize函数里,我们可以接收到客户端的初始化参数——例如客户端具备哪些能力。代码示例如下:

connection.onInitialize((params: InitializeParams) => {
    let capabilities = params.capabilities;
    return {
        capabilities: {
            textDocumentSync: documents.syncKind,
            // 告诉客户端,服务端支持代码补全
            completionProvider: {
                resolveProvider: true
            }
        }
    };
});

下面先通过一张图了解LSP初始化参数的整体构成:
VSCode插件教程(6):LSP协议初始化参数

接下来逐条解析这些参数的定义:

interface InitializeParams {
    /** 启动服务端的父进程ID。
     *  如果服务端不是由另一个进程启动的,则为null。
     *  如果父进程挂了,服务端就应该退出(参见退出通知)。
     */
    processId: number | null;

    /** 工作区的根路径。
     *  如果没有打开任何文件夹,则为null。
     *  @deprecated 建议改用rootUri。
     */
    rootPath: string | null;

    /** 工作区的根URI。
     *  如果没有打开任何文件夹,则为null。
     *  如果同时设置了rootPath和rootUri,rootUri优先。
     */
    rootUri: DocumentUri | null;

    /** 用户提供的初始化选项。 */
    initializationOptions: any;

    /** 客户端(编辑器或工具)提供的能力。 */
    capabilities: ClientCapabilities;

    /** 初始的跟踪设置。如果省略,默认关闭跟踪('off')。 */
    trace: 'off' | 'messages' | 'verbose';

    /** 服务端启动时,客户端已配置的工作区文件夹列表。
     *  仅在客户端支持工作区文件夹时可用。
     *  如果客户端支持但没有任何文件夹被配置,则为null。
     *  @since 3.6.0
     */
    workspaceFolders: WorkspaceFolder[] | null;
}

将这些信息归类后,可以用下图表示:
VSCode插件教程(6):LSP协议初始化参数

主要分为三大类:

第一类是运行环境相关信息,包括各种路径和进程ID;第二类是能力信息;第三类是辅助设定,例如trace开关和用户自定义的初始化选项。

需要特别注意的是:路径信息只有在VSCode中确实打开了一个目录时才能获取到。举例来说,如果打开的目录是 /Users/ziyingliuziying/working/gitlab/cafmode/server,那么 rootPath 返回的就是 /Users/ziyingliuziying/working/gitlab/cafmode/server。而 rootUri 返回的是 file:///Users/ziyingliuziying/working/gitlab/cafmode/server。至于 workspaceFolders,它是一个由 WorkspaceFolder 组成的数组,每个 WorkspaceFolder 包含 name 和 uri 两个属性。仍以上例说明,name 为 server,uri 同样是 file:///Users/ziyingliuziying/working/gitlab/cafmode/server。