跳到主要内容

语言功能

语言功能是编辑器里和语言相关的交互:补全、悬停、转到定义、诊断、格式化、重命名、代码操作等。界面和快捷键由 VS Code 提供,扩展只提供数据。

简单功能可以直接用 vscode.languages.registerXxxProvider。分析很重、或同一种语言要服务多个编辑器时,改成语言服务器,由语言客户端把协议翻译成这些提供器。

文档选择器​

注册时传入 DocumentSelector:一个语言 ID 字符串,或 { language, scheme, pattern, notebookType },也可以是它们的数组。

languages.match(selector, document) 返回分数。大于 0 表示匹配。* 是 5 分,相等或 glob 命中是 10 分。分数相同的提供器,后注册的优先。悬停这类可以多家同时生效的功能,只要分数大于 0 就会被问到。补全会按分数分组,同一组按顺序问,有结果就可以停。

虚拟文档的 scheme 不是 file。选择器只写语言、不写 scheme,会同时作用到 git: 等缓冲上。只想处理磁盘文件时写上 scheme: 'file'。

常见注册函数​

API用户看到的功能
registerCompletionItemProvider补全。可带触发字符,如 .
registerInlineCompletionItemProvider行内补全(灰字建议)
registerHoverProvider悬停
registerSignatureHelpProvider签名帮助
registerDefinitionProvider转到定义
registerTypeDefinitionProvider转到类型定义
registerImplementationProvider转到实现
registerReferenceProvider查找引用
registerDocumentSymbolProvider文档符号、大纲
registerCodeActionsProvider快速修复、源代码操作
registerCodeLensProvider行间可点击的 CodeLens
registerDocumentFormattingEditProvider格式化整个文档
registerRenameProvider重命名
registerFoldingRangeProvider折叠
createDiagnosticCollection问题面板里的错误和警告

提供器方法可以返回值或 Thenable。多数接收 CancellationToken,用户继续打字后旧请求会被取消,回调里应尽早看 token.isCancellationRequested。

一家提供器抛错或 Promise 拒绝,不会让整次操作失败,其他家的结果仍然可用。

参考​