应关闭插件级格式化开关而非仅禁用 editor.formatonsave,因 prettier、eslint 等插件会绕过该设置自行监听保存事件;需在 settings.json 中设 "prettier.enable": false、"eslint.format.enable": false 等插件专属配置,并同步关闭 editor.formatonpaste 防粘贴格式化。

关掉插件的自动格式化,不是卸载插件,而是切断它注册的保存/粘贴钩子——editor.formatOnSave 设为 false 只拦得住 VS Code 自带行为,拦不住 Prettier、ESLint 这些插件自己动手。
为什么关了 editor.formatOnSave 还在格式化?
因为插件(比如 esbenp.prettier-vscode 或 dbaeumer.vscode-eslint)会绕过编辑器开关,直接监听文件保存事件。它们有自己的配置项,优先级高于全局设置。
-
prettier.enable为true时,Prettier 插件会无视editor.formatOnSave,自行触发格式化 -
eslint.format.enable开启后,ESLint 插件会在保存时调用 fix 功能,效果类似格式化(但实际是代码修复) - 某些插件(如
HookyQR.beautify)甚至不走标准 formatter 接口,而是用auto_format_on_save这类私有字段控制
怎么查清是哪个插件在偷偷动你的代码?
右下角状态栏点格式器名称(比如显示 Prettier 或 ESLint),它就是当前生效的 formatter;如果没显示,按 Ctrl+Shift+P 输入 Format Document With... 看列表里有哪些选项——排第一的那个,大概率就是罪魁祸首。
- 打开命令面板 → 输入
Preferences: Open Settings (JSON),检查有没有插件专属配置漏关 - 搜索
prettier.、eslint.、javascript.format.、typescript.format.这几类前缀 - 注意
vscode-eslint的eslint.format.enable和eslint.codeActionsOnSave.fixAll是两个独立开关,后者也会导致保存时“重排”
prettier.enable 和 eslint.format.enable 必须设为 false
这两个配置项是插件级开关,不关它们,editor.formatOnSave 就形同虚设。直接写进 settings.json 最稳:
{
"editor.formatOnSave": false,
"prettier.enable": false,
"eslint.format.enable": false,
"javascript.format.enable": false,
"typescript.format.enable": false
}
-
javascript.format.enable和typescript.format.enable是 VS Code 内置 JS/TS 格式器的开关,很多人忘了关,结果改完 Prettier 还是被内置格式器“悄悄整形” - 如果只关某语言,比如只禁 JS:写成
"[javascript]": { "prettier.enable": false },注意方括号和引号不能少 - 工作区配置(
.vscode/settings.json)会覆盖用户设置,务必同步检查
粘贴时也被格式化?那是 editor.formatOnPaste 在干活
很多人只盯着保存,却忽略粘贴也会触发格式化——只要当前文件有可用 formatter(比如你装了 Prettier 且没关 prettier.enable),Ctrl+V 一粘就重排。
- 加一行
"editor.formatOnPaste": false到settings.json即可 - 临时跳过:粘贴时按住
Shift再按Ctrl+V(或Cmd+V),VS Code 会跳过所有格式逻辑 - 语言级覆盖也生效:比如
"[typescript]": { "editor.formatOnPaste": true },那 TS 文件照样粘贴即格式
真正难搞的不是设置本身,而是插件之间互相覆盖、用户设置和工作区设置打架、以及内置格式器和第三方插件共存时的隐性冲突——建议先清空 settings.json,再一条条加回必要配置,边加边验证保存行为,否则很容易漏掉某个 .enable 字段。











