VSCode插件不直接生成代码,而是通过注册CompletionItemProvider或调用LSP提供补全项;AI模型或预定义Snippets才实现函数/类/文件的自动生成。

VSCode 插件本身不直接“生成代码”,而是通过注册 CompletionItemProvider 或调用语言服务器(LSP)来响应输入、提供补全项;真正能“自动生成”函数/类/文件的,基本都依赖 AI 模型或预定义代码片段(Snippets),不是纯插件逻辑能独立完成的。
注册 registerCompletionItemProvider 时触发字符写错就完全不弹提示
常见错误是把触发字符设成 '.' 却没考虑语言上下文——比如在 Python 里输 os. 能触发,但在 JSON 文件里输 {. 就不该触发。VSCode 默认对 * 全局注册会污染非目标语言。
- 正确做法:按语言 ID 精确注册,例如只对
typescript和javascript注册:vscode.languages.registerCompletionItemProvider(['typescript', 'javascript'], new Completer(), '.', '(') - 触发字符不止是
'.',还可加'('(用于函数调用补全)、' '(空格,用于 Snippet 触发),但空格需配合triggerOnlyOnWhitespace: true配置 - 如果用了
'*'全局注册又没做语言过滤,在settings.json里看到"editor.suggest.showSnippets": false之类配置,可能被其他插件覆盖导致失效
provideCompletionItems 返回空数组却没报错,补全就是不出现
这不是 bug,是 VSCode 的静默行为:返回空数组 = “当前无建议”,不会报错也不会 fallback。最容易忽略的是没检查光标位置是否合法,或没截取到有效前缀。
- 务必用
document.lineAt(position).text.substr(0, position.character)获取前缀,别用document.getText()全文匹配——效率低且易误判 - 如果前缀含中文、特殊符号或缩进空格,正则匹配容易失败,建议先
.trimEnd()再判断,例如检测console时用linePrefix.trimEnd().endsWith('console')更稳 - 返回的
vscode.CompletionItem[]中每个 item 的insertText必须是字符串或vscode.SnippetString;若传入对象或 null,整个数组会被丢弃,界面无反应
想让补全项带参数提示和文档,但 documentation 字段不显示
documentation 字段只在鼠标悬停时显示,且必须是 string 或 vscode.MarkdownString;纯文本换行会被忽略,Markdown 格式才支持分段和链接。
- 写法示例:
item.documentation = new vscode.MarkdownString('**返回值**: `Promise<void>`\n\n详见 [MDN](https://developer.mozilla.org)');</void> - 参数提示(signature help)不是靠这个字段,而是由语言服务器(如
tsserver或clangd)提供;插件层无法直接控制 signature help 的内容 - 如果用了
vscode.CompletionItemKind.Method却没设置detail,VSCode 可能默认显示 “method”,建议显式设为item.detail = 'Fetch data from API'
AI 补全插件(如 CodeBuddy、Fitten Code)和自研插件共存时冲突严重
多个插件同时注册 CompletionItemProvider 且触发字符相同(如都监听 '.'),VSCode 会按注册顺序合并结果,但排序策略不透明,常导致建议重复、顺序混乱甚至卡顿。
- 避免硬编码触发字符,改用
vscode.languages.getLanguages()动态获取当前语言,再查配置项决定是否启用补全逻辑 - AI 类插件通常禁用本地 Snippet 补全(如关掉
editor.snippetSuggestions),你的插件若依赖 Snippet,得主动检查该设置:vscode.workspace.getConfiguration('editor').get('snippetSuggestions') === 'top' - 真实项目中,
IntelliCode和Pylance这类 LSP 客户端优先级远高于普通 provider,你的插件建议大概率排在它们后面——别试图“抢焦点”,专注提供它们覆盖不到的领域(比如内部 DSL 补全)
真正难的不是写出第一个补全项,而是让补全在不同语言、不同编辑状态(比如正在输入注释、字符串内、模板字面量中)下保持稳定不炸;VSCode 的补全链路太长,任何一环(LSP 响应超时、provider 抛异常、token 被 cancel)都会静默失败。


















