直接禁用插件比改settings.json更可靠,因extensions.enabled是白名单机制,设为false仅阻止自动启用,插件仍可能后台加载、注册命令、监听事件;真正切断干扰需用--disable-extensions参数启动或手动删除对应extensions目录。

直接禁用插件比改 settings.json 更可靠
很多人以为在 settings.json 里写 "extensions.enabled": { "xxx": false } 就算禁用了,其实不是。VSCode 的 extensions.enabled 是白名单机制,设为 false 只是“不自动启用”,但插件仍可能在后台加载、注册命令、监听事件——尤其对旧版 Python、Copilot 这类带本地服务的插件,禁用后 CPU 占用照涨。
真正切断干扰的方式是:用命令行启动时加 --disable-extension 参数,或直接删掉 ~/.vscode/extensions/xxx 目录(Windows 在 %USERPROFILE%\.vscode\extensions\)。删完再启动,VSCode 根本不会尝试加载它,连 Extension host terminated unexpectedly 都不会刷。
- 临时验证:终端执行
code --disable-extension ms-python.python --disable-extension github.copilot - 批量禁用:
code --disable-extension esbenp.prettier-vscode --disable-extension dbaeumer.vscode-eslint - 删目录前先查版本:
code --list-extensions --show-versions | grep python
别让多个 AI 补全插件同时注册 editor.suggest.provider
AI 插件(如 github.copilot、aliyun.tongyi-lingma、codegeex.codegeex)默认都会抢 editor.suggest.provider 这个提供者接口。VSCode 不会报错,但补全建议会忽有忽无、光标卡顿、甚至弹出两个重复提示——因为底层不知道该把输入事件交给谁。
这不是性能问题,是注册逻辑冲突。哪怕只留一个 AI 插件,也得确认它没和语言服务打架:比如 Vue 项目里 johnsoncodehk.volar 和 octref.vetur 同时启用,就会让 .vue 文件爆红,因为两者都试图接管 vue 语言模式的解析。
- 补全来源判断:按
Ctrl+Space唤出建议,看右侧图标(✨=AI,~=Pylance/Volar,□=snippet) - 悬浮提示会显示具体提供方,比如 “Provided by GitHub Copilot”
- 工作区级禁用更安全:
{ "extensions.enabled": { "github.copilot": false } }写进.vscode/settings.json,避免影响其他项目
Developer: Show Running Extensions 里的数字比名字更重要
打开 Developer: Show Running Extensions 不是为了数装了多少插件,而是盯两列:Startup Time 和 CPU。Startup Time >150ms 的插件,基本等于在编辑器刚启动时就锁住主线程;CPU 列持续波动且 >200MB,说明它在后台跑分析任务,不是“挂起”而是“真干活”。
常见陷阱是看到状态为 Activated 就以为它没事——其实 Activated 只代表注册了激活事件,而 Running 状态 + 高 CPU 才是正在吃资源的活进程。比如某些 Copilot 衍生插件、GitLens 的符号缓存、甚至 Prettier 的实时监听,都在这列暴露本相。
- Startup Time 高:优先怀疑主题预加载、远程连接、AI 插件初始化
- CPU 波动大:检查
gitlens.advanced.caching.enabled、eslint.run是否设为onType - 状态为
Activation failed:大概率是依赖版本不匹配,比如 Pylance 要求 Python 插件 ≥ v2026.6
格式化冲突的本质是多个插件监听 editor.formatOnSave
保存时代码被反复格式化、缩进错乱、光标跳到奇怪位置,90% 是因为至少两个插件同时响应 editor.formatOnSave。比如 esbenp.prettier-vscode 和 dbaeumer.vscode-eslint 都启用了这个开关,VSCode 会按加载顺序依次执行——结果就是先用 ESLint 格式化一遍,再用 Prettier 覆盖一遍,中间还可能夹着 Beautify。
解决方法不是关掉其中一个,而是显式指定默认格式化器,并关闭冗余钩子:
- 在
settings.json中固定:"editor.defaultFormatter": "esbenp.prettier-vscode" - 关掉 ESLint 的格式化能力:
"eslint.format.enable": false - 禁用其他格式化插件的保存钩子:
"prettier.requireConfig": true(让它只在有prettier.config.js时才工作)
真正难处理的是那些不走标准 API 的插件——它们可能直接 patch vscode.workspace.onDidSaveTextDocument,这种没法靠配置关,只能删目录。











