语言功能
语言功能是编辑器里和语言相关的交互:补全、悬停、转到定义、诊断、格式化、重命名、代码操作等。界面和快捷键由 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 拒绝,不会让整次操作失败,其他家的结果仍然可用。