应使用 vscode.workspace.edit 配合 TextEdit.insert() 或 replace() 在光标处插入代码,避免直接拼接字符串;模板应抽离为配置项,按优先级读取;插入后触发 ESLint 自动修复需调用 applyAutoFixes 命令;定时注入须校验编辑器状态,推荐用保存或文档变更钩子替代 setInterval。

怎么让插件在光标处插入一段代码
直接写入文本最常用也最容易出错。核心是用 vscode.workspace.edit,不能直接操作 document.getText() 后拼字符串再 set,那样会破坏撤销栈、丢失格式、不触发语法高亮更新。
常见错误现象:插入后缩进错乱、中文显示为方块、光标跳到文件开头、修改后保存提示“文件已被外部修改”。
- 必须用
TextEdit.insert()或TextEdit.replace(),配合TextEditor.edit()异步调用 - 插入位置要用
editor.selection.active,不是editor.selection.start(后者在多行选中时不准) - 如果模板含换行符,确保用
\n而非\r\n—— VSCode 默认按 LF 处理,Windows 用户容易在这里踩坑 - 插入后建议调用
editor.selection = new vscode.Selection(pos, pos)把光标移到末尾,否则用户继续敲字会覆盖刚插入的内容
如何支持用户自定义模板而不改插件源码
硬编码模板等于放弃维护性。正确做法是把模板抽离成配置项,让用户通过 settings.json 或单独的 JSON/YAML 文件管理。
使用场景:团队规范变更、不同项目需不同组件骨架、前端用 Vue/React 模板要隔离。
- 读取配置优先级:工作区设置 > 用户设置 > 插件默认值(用
vscode.workspace.getConfiguration('your-plugin').get('templates')) - 模板字段至少包含
name、body、scope(如['javascript', 'typescript']),避免无差别匹配 - 不要在 activate 里一次性加载全部模板——等用户真正触发命令时再解析,减少启动开销
- 若支持文件路径式模板(如
"./templates/react-component.json"),需用vscode.workspace.fs.readFile()读取,并 catchFileNotFound错误,降级到默认模板
为什么生成的代码没触发 ESLint 自动修复
VSCode 的 ESLint 插件默认只监听用户手动输入或保存事件,对插件注入的代码不响应,这是设计使然,不是 bug。
性能影响明显:每插入一行就跑一次 lint,会卡顿;但完全不修复又导致代码风格断裂。
- 推荐方案:插入完成后主动触发一次
eslint.executeAutofix命令(需插件声明contributes.commands并检查 ESLint 是否启用) - 更稳妥的做法是调用
vscode.commands.executeCommand('eslint.applyAutoFixes'),它会走标准修复流程,兼容 ESLint v8+ 和新旧配置 - 注意权限:该命令需要用户已安装 ESLint 插件,且当前文件被其接管(可通过
vscode.languages.getLanguages()+vscode.workspace.getConfiguration('eslint').get('enable')双重判断) - 别用
editor.document.save()代替——保存会触发所有保存钩子,可能提交未完成的草稿
定时自动注入代码的风险在哪
比如“每30分钟 git commit”类插件,看似省事,实则危险。代码注入不是纯读操作,它改变编辑器状态,而定时器无法感知用户是否正在编辑关键区块。
容易被忽略的地方:光标焦点、未保存修改、多窗口并行编辑、远程开发(SSH/Dev Containers)下的文件系统延迟。
- 绝对禁止在
setInterval回调里直接调用editor.edit()—— 此时activeTextEditor可能为 null,或指向错误文档 - 每次执行前必须校验:
vscode.window.activeTextEditor?.document.isDirty、!vscode.window.activeTextEditor?.selection.isEmpty - 建议改用
vscode.workspace.onDidSaveTextDocument钩子,在保存后做轻量注入(如补全 TODO 标记),比轮询安全得多 - 如果真要定时,用
vscode.workspace.onDidChangeTextDocument+ 节流控制,比固定间隔更贴合真实编辑节奏


















