vscode格式化时行尾行为由files.eol、files.preferredlineending、git和editorconfig共同决定;仅改prettier的endofline无效,须同步配置git(core.autocrlf=false)、.gitattributes(* text=auto eol=lf)及vscode两项设置并重载窗口。

VSCode 格式化时的行尾换行行为,**不完全由格式化工具(如 Prettier)决定,而是 VSCode 自身的 files.eol 和 files.preferredLineEnding 设置 + Git 行为 + EditorConfig 三方共同作用的结果**。只改 Prettier 的 endOfLine 配置,大概率压不住问题。
为什么 Prettier 报 “Delete ‘␍’” 却切不了 LF?
这个错误本质是 Prettier 检测到文件里有 \r\n(CRLF),但它的规则要求 lf。但它不是“原因”,只是“报警器”。真正卡住你的是:
- VSCode 当前文件实际用的是 CRLF(右下角显示 CRLF),而你没点它切换
-
prettier.endOfLine设成了"lf",但 VSCode 保存时仍按files.eol写入 CRLF —— 两者打架 - Git 正在后台偷偷把 LF 转成 CRLF(
core.autocrlf=true),你刚切完 LF,保存后又变回 CRLF
VSCode 保存时到底用哪个换行符?
优先级从高到低:EditorConfig > 工作区 .vscode/settings.json > 用户 settings.json > 系统默认。关键参数是:
-
files.eol:字符串值,必须是"\n"(LF)或"\r\n"(CRLF),控制“新文件默认写什么” -
files.preferredLineEnding:字符串值,"lf"或"crlf",影响“保存时是否强制对齐”——尤其在有.gitattributes时它会读取该文件并覆盖files.eol - 如果项目根目录有
.editorconfig且含end_of_line = lf,EditorConfig 插件会直接接管,files.eol彻底失效
怎么让格式化(Prettier/ESLint)和保存行为一致?
别指望靠改 Prettier 单点突破。要三步对齐:
- 关掉 Git 的自动转换:
git config --global core.autocrlf false(Windows 用户也推荐设为false,不是true) - 项目根加
.gitattributes,内容只写一行:* text=auto eol=lf - VSCode 设置里配两项:
"files.eol": "\n"+"files.preferredLineEnding": "lf",然后重载窗口(Ctrl+Shift+P→Developer: Reload Window)
这样 Prettier 格式化、VSCode 保存、Git 提交三者才真正用同一个 LF。
已有大量 CRLF 文件怎么安全批量转 LF?
别用全局文本替换 \r\n → \n,容易误杀内容里的 \r。稳妥做法是:
- 先确保上面三项(Git + .gitattributes + VSCode 设置)已生效
- 运行:
git add --renormalize .,Git 会按.gitattributes规则重写索引中的换行符 - 再
git commit -m "normalize line endings",所有文件在仓库里就都是 LF 了 - 本地工作区文件是否显示 LF,取决于你当前 VSCode 的
files.preferredLineEnding和打开方式——只要状态栏显示 LF,就说明编辑器正在用 LF 渲染
最易被忽略的一点:VSCode 的“重载窗口”不是可选项,是必选项;files.eol 改了不重载,Windows 下新建文件十有八九还是 CRLF。











