全局禁用插件仅标记状态而非卸载,插件仍驻留内存但不响应事件;真正生效需确保其未被列在extensions.disabled中且未被其他配置(如affinity或默认格式化器)唤醒。

全局禁用后,为什么当前项目里插件还是不工作?
因为 VSCode 的“禁用”只是标记状态,不是卸载;插件仍保留在内存中,但不会响应事件——除非你显式启用它。真正让插件在某个工作区「活过来」,靠的不是“启用”,而是**不把它列在禁用列表里 + 确保它没被其他配置压制**。
常见错误现象:extensions.disabled 里写了 "esbenp.prettier-vscode",结果在项目里设了 "prettier.enable": true,格式化依然不触发 → 实际上插件根本没加载,prettier.enable 这个配置项压根没机会读取。
- 先确认该插件是否真被全局禁用了:打开命令面板,运行
Extensions: Show Disabled Extensions,看它是否出现在列表中且标注为 “disabled globally” - 再检查项目根目录下的
.vscode/settings.json,确保里面没有"extensions.disabled"包含该插件 ID - 如果用了
extensions.experimental.affinity(值为0),也得删掉——它会强制禁用,优先级高于用户设置
只在当前项目启用某插件的可靠写法
VSCode 不支持“仅在此项目启用”,但支持“在此项目不禁用”。最稳妥的做法是:全局禁用所有非必需插件,然后在目标项目的 .vscode/settings.json 中**显式移除禁用项**,并补上必要配置。
例如你想只在 Python 项目里用 ms-python.python,其他项目都不用:
- 全局禁用它:右键插件 →
Disable(不是Disable (Workspace)) - 打开 Python 项目文件夹,在命令面板运行
Preferences: Open Workspace Settings (JSON) - 在
.vscode/settings.json中添加:
{
"extensions.disabled": [
"!ms-python.python"
],
"python.defaultInterpreterPath": "./venv/bin/python"
}
! 前缀表示“例外”,即这条规则下该插件不被禁用。注意:extensions.disabled 是数组,不能混用布尔值或对象;多个例外就写多个带 ! 的字符串。
⚠️ 不要依赖 extensions.enabled: ["ms-python.python"] —— 这个字段在 VSCode 1.85+ 已被弃用,行为不稳定,部分版本直接忽略。
禁用后插件还在跑?检查这三处配置
插件被禁用 ≠ 功能消失。VSCode 会为了满足你写的配置,悄悄拉起已禁用的插件。以下三项配置最容易“兜底唤醒”插件:
-
editor.defaultFormatter:比如设为"esbenp.prettier-vscode",即使插件被禁用,保存时仍会尝试加载它 -
files.associations或explorer.autoReveal类触发器:某些插件靠文件关联激活,禁用不等于解除监听 -
python.languageServer、yaml.validate等插件专属开关:它们独立于插件启用状态,设为true就可能强行唤起后台进程
解决办法不是反复点“禁用”,而是进 .vscode/settings.json 把这些相关字段删掉或设为 false。比如禁用 Prettier 后,顺手加上:"prettier.enable": false。
终极隔离:用 unwantedDependencies 阻止插件启动
VSCode 1.85+ 引入了 unwantedDependencies 字段,它比 extensions.disabled 更底层:不是“禁用已加载的插件”,而是“不让它进入加载流程”。对语言服务器类插件(如 ms-python.python、redhat.vscode-yaml)特别有效。
操作路径:
- 在项目根目录创建或编辑
.vscode/extensions.json - 写入:
{ "unwantedDependencies": ["ms-python.python"] }
注意:unwantedDependencies 中的 ID 必须和插件市场 URL 末尾完全一致(如 https://marketplace.visualstudio.com/items?itemName=ms-python.python → ID 是 ms-python.python)
生效需重新打开文件夹或执行 Developer: Reload Window;它不会出现在“已禁用扩展”列表里,因为它根本没被注册进插件系统——这才是真正意义上的“按项目隔离”。
这个字段不显示在 UI 上,也不受命令面板控制,容易被忽略。但如果你发现 extensions.disabled 总是“禁而不止”,大概率该换到这一层了。


















