vscode默认不自动格式化代码,必须手动启用"editor.formatonsave": true并按语言指定defaultformatter(如"[python]": {"editor.defaultformatter": "ms-python.black-formatter"}),否则即使安装prettier/black/eslint也无效;全局设置defaultformatter会导致非兼容语言报错。

VSCode 默认不自动格式化代码,哪怕你装了 Prettier、Black 或 ESLint —— 关键开关 editor.formatOnSave 默认是 false,必须手动设为 true,否则 Ctrl+S 就只是保存。
为什么保存后没反应?先确认 editor.formatOnSave 开了没
这是 90%“配了没用”问题的根源。VSCode 不会默认开启这个行为,哪怕你已安装全部扩展。
- 打开设置(
Ctrl + ,或Cmd + ,),搜索format on save,勾选 Editor: Format On Save - 或直接编辑
settings.json,确保有这一行:"editor.formatOnSave": true - 注意:项目根目录下的
.vscode/settings.json会覆盖全局设置;如果里面写了"editor.formatOnSave": false,那整个项目都无效
为什么提示 “No formatter installed for 'python'”?defaultFormatter 必须按语言指定
VSCode 不会自动把 Prettier 当成 JavaScript 的格式化器,也不会让 Black 处理 Python——它根本不知道该用谁,必须显式声明。
- 右下角状态栏看当前语言模式(如
Python、TypeScript),确保不是Plain Text - 按
Ctrl+Shift+P输入Format Document With,看列表是否为空;为空说明扩展没装、没启用,或不支持当前语言 - 在
settings.json中按语言配置,例如:
{"[python]": {"editor.defaultFormatter": "ms-python.black-formatter"}, "[typescript]": {"editor.defaultFormatter": "esbenp.prettier-vscode"}}
- 切忌写成全局形式:
"editor.defaultFormatter": "esbenp.prettier-vscode"—— 这会让 Python 文件报错,Go 文件直接跳过
格式化器装了但右下角显示 “None”?检查扩展激活状态和语言匹配
右下角显示的语言模式(如 JavaScript)和当前激活的格式化器(如 Prettier)必须一致,否则保存只是“空转”。
-
.py文件右下角要是Python,不能是Plain Text;.ts文件不能是TypeScript却配了 JS 的 formatter - Python 用户注意:
ms-python.python扩展本身不等于格式化器,还需安装ms-python.black-formatter,或在设置中明确指定python.formatting.provider - JS/TS 项目若用 ESLint 做修复,需额外开启:
"editor.codeActionsOnSave": {"source.fixAll.eslint": true},且项目里得有eslint和对应配置
保存后格式没变?可能是 formatOnSaveMode 或超时导致静默失败
VSCode 1.84+ 引入了 editor.formatOnSaveMode,默认值是 file,但某些格式化器(尤其是 Prettier)遇到语法错误(如 Unterminated string literal)会直接放弃格式化,看起来像“没生效”。
- 对边写边调的场景,可尝试设为
modifications:"editor.formatOnSaveMode": "modifications" - 格式化慢导致被中断?VSCode 默认超时是 750ms,可在项目
.vscode/settings.json中加:"editor.formatOnSaveTimeout": 2000 - 多人协作时,真正决定“怎么格式”的不是 VSCode 设置,而是项目里的
.prettierrc、pyproject.toml或.eslintrc.js;本地设置只负责“调用”,别在 UI 里调缩进空格数来替代这些文件
最易忽略的一点:格式化器是否真的读到了你的配置文件。比如 prettier.requireConfig 设为 true 但项目里没 .prettierrc,就会静默跳过——这种失败不会弹报错,只留空白结果。











