vs code中formatonsave失效主因是三层配置冲突:编辑器级、语言级、工作区级设置任一关闭或错误均会导致失败;缩进不统一源于insertspaces与detectindentation配合不当;prettier与eslint应分工——prettier负责格式化,eslint专注检查;跨平台换行符需通过files.eol和git配置协同统一。

VS Code 里 formatOnSave 不生效?先查这三处配置冲突
格式化不触发,大概率不是插件没装,而是设置被覆盖或禁用。VS Code 的格式化行为由编辑器级、语言级、工作区级三层配置共同决定,任意一层关掉或配错都会让 formatOnSave 失效。
-
"editor.formatOnSave"必须为true(全局或当前工作区) - 对应语言的默认格式化工具必须存在且启用:比如
javascript文件需有defaultFormatter指向esbenp.prettier-vscode或vscode.typescript-language-features - 检查是否有
"[javascript]": { "editor.formatOnSave": false }这类语言专属覆盖——它会直接压倒全局设置
常见错误现象:Ctrl+S 后缩进没变、空格没转、分号没加,但手动按 Shift+Alt+F 却能格式化成功。这就是语言级配置把 formatOnSave 关了。
缩进用空格还是 Tab?editor.insertSpaces 和 editor.detectIndentation 怎么配合
缩进风格不统一,根源常在自动检测和手动设定打架。VS Code 默认开启 editor.detectIndentation,会读取文件首行缩进猜用空格还是 Tab;但一旦你手动改过一次缩进(比如按 Tab 插入了制表符),它就可能“记住”并固化这个选择,后续新建文件也跟着用 Tab,哪怕你偏好空格。
- 想彻底锁定空格:设
"editor.insertSpaces": true,同时关掉自动检测:"editor.detectIndentation": false - 想保留检测但防止误判:留着
detectIndentation,但加一条"files.trimTrailingWhitespace": true,避免末尾空格干扰首行缩进识别 - 项目级统一更可靠:在项目根目录放
.editorconfig,写indent_style = space和indent_size = 2,比 VS Code 单点设置更稳
注意:editor.tabSize 只影响 Tab 显示宽度,不决定插入内容;真正控制插入的是 insertSpaces 和 detectIndentation 的组合。
Prettier 和 ESLint 冲突时,谁该让步?prettier-eslint 已淘汰,现在怎么接
格式化结果和 ESLint 报错对不上,比如 Prettier 强制单引号,ESLint 却要求双引号——这不是 bug,是规则没对齐。新版已不再推荐用 prettier-eslint 这类桥接工具,容易导致格式化卡死或无限循环。
- 正确做法:用 Prettier 做唯一格式化器,把 ESLint 当纯检查器——关掉 ESLint 的格式类规则,例如
quotes、semi、brace-style,改用eslint-config-prettier - VS Code 中确保
"editor.defaultFormatter"指向 Prettier,且"eslint.format.enable"设为false(避免 ESLint 插件抢着格式化) - 如果非要 ESLint 格式化,那就禁用 Prettier 插件,并在
.eslintrc里加"prettier"到extends,再开"eslint.format.enable": true
性能影响:两个工具同时格式化同一文件,会触发两次解析和重写,保存延迟明显,尤其大文件下可感知卡顿。
换行符 CRLF vs LF 在跨平台协作中怎么稳住
Windows 上开发、Git 提交后 Linux CI 构建报错“行尾不可见字符”,八成是 CRLF(\r\n)混进了本该用 LF(\n)的项目。VS Code 底部状态栏显示的 CRLF 或 LF 是当前文件的换行符类型,但它不会自动转换,除非你明确设置。
- 项目统一用
LF:在工作区设置里加"files.eol": "\n",比每次手动点状态栏切换更可靠 - Git 层兜底:配
git config core.autocrlf input(Linux/macOS)或core.autocrlf true(Windows),让 Git 自动处理检出/提交时的换行转换 - 别信 “自动检测”:VS Code 的
files.autoSave不会根据.gitattributes改换行符,它只管保存时机,换行符得靠files.eol或文件内容本身驱动
容易被忽略的一点:某些脚本(如 Shell、Python shebang 行)对 \r 敏感,CRLF 会导致 /bin/sh^M: bad interpreter 这类错误,光看代码逻辑找不到问题。











