VS Code自动补全体验取决于核心引擎选择与配置:禁用Copilot和TabNine共存以避免冲突;确保typescript.tsdk指向项目内TS版本;ESLint需配置import/resolver支持路径别名补全。

VS Code 的自动补全体验,不靠插件数量堆砌,而取决于你是否选对了核心引擎、配对了项目类型系统、避开了冲突陷阱——装错一个,整个 import 补全可能失效,useContext 后按 Ctrl+Space 只弹出空白框。
为什么 Copilot 和 TabNine 不能共存
两者都劫持 editor.suggest 面板并监听 onType 事件,同时启用时常见现象包括:输入 use 后建议列表卡顿 2 秒、下拉框空白、内存占用飙升(尤其 M 系列 Mac)。它们底层都依赖本地模型推理,不是“多一个更聪明”,而是“多一个就打架”。
- 前端项目优先留
GitHub Copilot:对 React/Vue/TS 的 hooks、组件结构、类型链理解更深 - 纯 Python/JS 小脚本或隐私敏感场景,换
TabNine或Windsurf:离线可用,无代码上传风险 - 必须关掉另一个的自动触发:
"github.copilot.inlineSuggest.enable": false或"tabnine.experimentalAutoImports": false - 验证是否真冲突:打开命令面板 → 运行
Developer: Toggle Developer Tools→ Console 标签页里敲几下补全,看有没有Extension host terminated unexpectedly
typescript.tsdk 指向错误,补全直接失能
TypeScript 补全是 VS Code 自带能力,但严重依赖工作区中实际使用的 tsc 版本。全局装了 typescript@5.4,项目用的是 4.9.5,VS Code 就会拿错语言服务——结果是 Array.prototype.map 能补全,但自定义的 MyContext 类型完全不出现。
- 在项目根目录
node_modules下确认路径:"typescript.tsdk": "./node_modules/typescript/lib"(注意是lib目录,不是bin/tsc) - 打开任意
.ts文件 → 命令面板 → 运行TypeScript: Select TypeScript Version→ 看底部状态栏是否显示Workspace version - Monorepo 场景下,每个子包必须单独配置
typescript.tsdk,父级配置不继承
ESLint 的 import/resolver 不配,路径别名补全就丢
VS Code 的路径补全(比如输入 import { foo } from ' 后列出 @/hooks/)其实由 ESLint 插件驱动,不是 TypeScript 决定的。如果 eslint-plugin-import 的 settings.import/resolver 没配对,补全会漏掉 @/components 这类别名,甚至把 src/api 显示成 ../../api。
- 在
.eslintrc.js中显式声明 resolver:settings: { 'import/resolver': { node: { paths: ['src'], alias: { '@': './src' } } } } - 改完配置后必须重启 ESLint Server:命令面板 →
ESLint: Restart ESLint Server(否则缓存不刷新,补全照旧失效) - 别指望
jsconfig.json或tsconfig.json的paths自动同步到补全逻辑里
Pylance 的 self 补全失效?先查这三个地方
Python 类方法中 self 参数不自动补全,大概率不是 Pylance 问题,而是环境或配置没对齐。
- 确认
python.languageServer设置为"Pylance"(不是"Default"或"Jedi") - 检查
python.analysis.completeFunctionParams是否为true(默认开启,但有人手动关过) - 确保文件后缀是
.py,且 VS Code 已识别为 Python 语言模式(右下角状态栏显示Python,不是Plain Text) - 手动触发一次:
Ctrl+Space,观察是否出现含self的完整函数签名;若仍无,看Output面板 → 切到Pylance日志,找Failed to resolve module类报错
最常被跳过的那一步,往往不是写 prompt 模板,而是确认 typescript.tsdk 指向哪里、import/resolver 是否同步、python.languageServer 是否生效——这些配置项不显眼,但一错就让整个补全链断裂,而且很难从报错信息里直接定位。











