CodeActionProvider注册必须匹配语言ID,否则不会触发;需为每种语言单独注册,provideCodeActions中须过滤diagnostics并设置正确kind和range。

CodeActionProvider注册必须匹配语言ID,否则根本不会触发
VS Code 只会在文档语言 ID 与 registerCodeActionsProvider 第二个参数完全一致时,才把诊断(diagnostics)和光标上下文传给你的提供者。常见错误是写成 'javascript' 却在 .ts 文件里测试——TypeScript 文件的语言 ID 默认是 'typescript',不是 'javascript'。
- 查当前文件真实语言 ID:按
Ctrl+Shift+P→ 输入Developer: Inspect Editor Tokens and Scopes,看右下角 “Language ID” 字段 - 支持多语言?得注册多次:
vscode.languages.registerCodeActionsProvider('javascript', provider)和vscode.languages.registerCodeActionsProvider('typescript', provider) - 别用通配符,
'*'或'any'不被支持
provideCodeActions里必须过滤诊断,否则动作会无条件弹出
如果你的 provideCodeActions 方法不检查 context.diagnostics,而是直接返回一堆 CodeAction,那用户只要右键就会看到你的修复项——哪怕当前没任何问题。这不仅干扰体验,还会被 VS Code 标记为“低质量提供者”。
- 典型做法:用
context.diagnostics.filter(d => d.message.includes('Missing import'))锁定特定问题 - 别只靠 message 字符串匹配——有些语言服务器返回的是本地化消息(比如中文),建议同时检查
d.code(如果服务端有提供标准化错误码) - 范围判断很重要:
range.intersection(d.range)确保诊断确实落在用户当前选区或光标附近,避免跨函数误触发
QuickFix 类型动作必须设 codeAction.kind,否则不显示在 Ctrl+. 菜单里
VS Code 把 CodeActionKind 当作分类信号。如果你返回的 action 没设 kind,或者设成了 vscode.CodeActionKind.Refactor,那它只会出现在“重构”子菜单(需手动展开),而不会直接列在 Ctrl+. 的首层快速修复列表中。
- 要进首层快捷修复:必须用
vscode.CodeActionKind.QuickFix - 想支持“源操作”(如组织 import):用
vscode.CodeActionKind.Source,并确保isPreferred: true - 别漏掉
action.isPreferred = true——这是让 VS Code 默认高亮该动作的关键标志
WorkspaceEdit 插入文本时 range 要精准,否则光标会“消失”或覆盖代码
用 action.edit.insert() 自动加 import 时,如果 range 的 start 位置算错,轻则插入到上一行末尾,重则把光标吞进字符串里,用户无法继续输入。这不是 UI bug,是编辑器对 range 的严格语义要求。
- 正确姿势:用
document.lineAt(0).range.start找第一行开头;或用document.getWordRangeAtPosition(position, /\S+/)定位到最近非空白区域 - 避免用
editor.selection.start——它在有选区时返回选区起点,不是光标位置;应改用editor.selection.active - 插入后记得设置
action.command = { title: '', command: '', arguments: [] }(可选),但真正影响光标的是 range 精度,不是 command
provideCodeActions 返回的是扁平动作数组,没法天然分组。如果你希望用户一次选中多个修复,得自己聚合诊断、生成带子动作的 CodeAction,并手动处理 edit 的批量写入——这点官方 API 并不封装。


















