欢迎去往我的github

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();
}

posted @ 2023-04-08 09:05  月夜魂归  阅读(29)  评论(0编辑  收藏  举报
……