最常见原因是editor.formatonsave开启但未指定默认格式化器或当前语言无可用formatter;vscode只认editor.defaultformatter的精确扩展id,需检查拼写、插件启用状态及右下角语言模式是否正确。

为什么保存时格式化没生效?
最常见原因是 editor.formatOnSave 开启了,但没指定默认格式化器,或当前语言没匹配到可用 formatter。VSCode 不会自动猜用哪个插件——它只认 editor.defaultFormatter 的值,且该值必须和已安装插件的扩展 ID 完全一致。
检查点:
-
editor.defaultFormatter值是否拼写正确(比如 Python 项目不能填esbenp.prettier-vscode,得填ms-python.black-formatter或charliermarsh.ruff) - 对应语言的格式化插件是否已安装并启用(例如 HTML 文件需确认
esbenp.prettier-vscode或内置 HTML 支持已激活) - 当前文件的语言模式是否正确(右下角显示的是
Python还是Plain Text?.yml文件若显示YAML而非Ansible,Black/Prettier 都不会触发)
如何让 Prettier 和 ESLint 协同工作不打架?
直接让 ESLint 执行格式化("eslint.format.enable": true)容易和 Prettier 冲突,尤其在引号、分号、空格等规则上。推荐方案是:Prettier 负责纯格式化,ESLint 专注代码质量检查,两者通过 editor.codeActionsOnSave 分工。
实操建议:
- 关闭 ESLint 的格式化能力:
"eslint.format.enable": false - 保留 ESLint 的修复能力:
"editor.codeActionsOnSave": { "source.fixAll.eslint": true } - 确保 Prettier 是唯一启用
formatOnSave的 formatter,且其配置(如.prettierrc)与团队 ESLint 规则兼容(例如都设"semi": false) - 若用 Vue,Vetur 默认接管格式化,需显式禁用:
"vetur.format.defaultFormatter.html": "none"
Odoo Python 文件怎么避免 Black 把 XML 字符串搞乱?
Odoo 中大量使用内联 XML(如 <field name="xxx">...</field>),Black 默认会把它当普通字符串重排,导致 XML 结构错乱甚至语法错误。这不是 Bug,是 Black 对多行字符串的固有行为。
解决路径只有两条:
- 在 XML 字符串前后加
# fmt: off/# fmt: on注释(Black 会跳过该段) - 改用
ruff代替 Black:charliermarsh.ruff插件支持更细粒度控制,且对 Odoo 模板字符串更友好;配置ruff.toml中select = ["I"]可关掉 import 排序类干扰项 - 绝对不要全局禁用 Black —— Odoo 模型逻辑部分仍需严格遵循 PEP 8
Ansible YAML 文件校验总失败,问题出在哪?
Ansible 的语法校验不是靠 VSCode 自带 YAML 解析器,而是依赖本地 ansible CLI 和 ansible-lint。只要三者任一没对齐,就会静默失效:语言模式不对、ansible.path 指向错误、或 ansible-lint 未安装/路径未配。
关键动作:
- 右下角点击语言标识,手动将
.yml关联为Ansible(不是 YAML) - 终端运行
which ansible,把输出的完整路径(如/opt/homebrew/bin/ansible)粘贴进 VSCode 设置里的ansible.path - 确认
ansible-lint已全局安装(pip install ansible-lint),并在设置中填入其绝对路径(ansible.lintPath) - 改完必须重启整个 VSCode 窗口,热重载不生效
格式化本身不解决语法错误,它只美化结构;真正的校验靠 ansible-lint 在保存后调用,报错会直接出现在 Problems 面板里。











