VSCode原生不删空行,只删行尾空白;删空行需依赖Prettier(压缩连续空行为一个)或正则(如^\s*\r?\n匹配并替换);files.trimTrailingWhitespace仅处理行末空白,不触碰换行符。

VSCode 原生不删空行,只删行尾空白;真要删/压缩空行,必须靠格式化器(如 Prettier)或正则手动干预——没有“开个开关就自动搞定”的捷径。
为什么 files.trimTrailingWhitespace 完全不管空行
这个配置只扫描每行末尾的 、\t、\r,擦干净后留下原样换行符。一个纯 \n 的空行,它看都不看一眼。你看到的“空行”本质是换行符在起作用,不是内容为空;而 trimTrailingWhitespace 从不触碰换行符本身。
常见错觉:给空行加了 5 个空格 → 保存后只剩 \n → 误以为“空行被删了”。其实只是空格没了,空行还在。
- 验证是否生效?在某行末尾敲几个空格 → 保存 → 看右下角是否弹出 “Trimmed trailing whitespace”
- 它和
files.trimFinalNewlines是两件事:trimFinalNewlines只管文件末尾的换行符数量,不碰中间 - 语言模式可能覆盖该设置(比如
[makefile]默认禁用),需单独启用
Prettier 删空行的真实行为:不是“删除”,而是“压缩”
Prettier v3+ 默认会把连续多个空行(≥2)合并为一个,但它不会把所有空行都干掉——这是有意为之的设计:保留单空行作为逻辑分隔符。如果你发现空行没变少,大概率是因为配置没生效或版本太旧。
- 确保已安装
esbenp.prettier-vscode扩展 - 开启
"editor.formatOnSave": true,且文件语言模式识别正确(右下角显示css/javascript等) - Prettier 不靠
singleQuote或semi控制空行,真正起效的是其内置的空白压缩逻辑,无需额外配endOfLine - 若想禁用此压缩(比如项目要求函数间必须空两行),Prettier 本身不支持;得换 ESLint +
no-multiple-empty-lines规则
VSCode 正则替换删空行:匹配整行 + 换行符,否则白忙
用 ^\s*$ 替换为空,结果还是空行——因为换行符没被吃掉。真正有效的写法必须把换行符纳入匹配范围,否则只是把“空格清空”,不是“删空行”。
- LF(macOS/Linux)文件:查找
^\s*$\n,替换留空 - CRLF(Windows)兼容写法:查找
^\s*\r?\n,替换留空 - 删“连续多个空行”而非全部:查找
(^\s*\r?\n){2,},替换为\n(保留一个) - 文件开头有 BOM(
\uFEFF)时,^\s*匹配不到;可先手动删 BOM,或改用^\uFEFF?\s*\r?\n
批量处理多个文件时最常翻车的三个点
全局搜索替换(Ctrl+Shift+H → Replace in Files)看着方便,但一不留神就改坏几十个文件。
- 混合换行符项目(部分 LF、部分 CRLF):单用
\n会漏掉 CRLF 文件里的空行;统一用\r?\n更稳 - UTF-8 with BOM 文件:BOM 在行首,
^\s*不匹配它,第一行空行可能漏删 - 末尾连续空行:正则逐行匹配,可能残留两个换行符(即一个空行);若要严格限制结尾最多一个空行,额外跑一次
(\r?\n){3,}→\r?\n\r?\n
真正麻烦的不是正则写不对,而是删完才发现 YAML 配置因空行消失解析失败,或者 Git diff 突然爆几百行改动——留一个空行不是偷懒,是给机器和人留呼吸感。


















