空行和行尾空格必须分两步处理:删空行用^\s*$正则,删行尾空白靠trim_trailing_white_space_on_save配置;混用会破坏Python缩进、YAML对齐及Makefile变量展开。

空行和行尾空格必须分两步处理——用 ^\s*$ 删空行,靠 "trim_trailing_white_space_on_save": true 自动清行尾空白;混用正则通杀会崩 Python 缩进、乱 YAML 对齐、让 Makefile 变量展开失败。
为什么 ^\s*$ 是删空行唯一靠谱的写法
它能同时匹配「真正空的行」和「伪空行」(比如只含空格、\t、\r、\n、全角空格 \u3000 或不间断空格 \u00a0 的行),不依赖换行符类型(LF/CRLF/CR),也不需要插件。
-
^$看似简洁,但只要行里有 1 个空格或\t就完全失效 -
\n\n在 Windows 文件(\r\n\r\n)里根本匹配不上,跨平台极不稳定 - 必须关闭右下角的
. matches newline(即那个\n图标不能高亮),否则^\s*$可能跨行吞掉两段代码 - 替换框一定要留空——填
\n会导致每删一行反而多塞一个换行符
[ \t]+$ 才是删行尾空格的安全正则
别用 \s+$:Sublime 中 \s 默认包含 \r 和 \n,一匹配就可能把换行符也卷进来,导致上下两行“粘连”,比如 return true;\n\nif (x) 变成 return true;if (x)。
-
[ \t]+$明确只匹配行末的空格和制表符,$锚定行尾,安全可控 - 勾选
.*(启用正则),但务必确认. matches newline是关闭状态 - 中文文档里若有全角空格或零宽空格(
\u200b),需显式扩展:[ \t\u3000\u00a0\u200b]+$ - 长期项目建议直接配
"trim_trailing_white_space_on_save": true,保存即生效,比手动更可靠
文件末尾那个“删不掉”的空行是怎么回事
Sublime 的 ^\s*$ 匹配的是「有换行符边界」的行。如果文件最后一行为空,且 EOF 前没有换行符(即光标停在空行开头),那它在 Sublime 内部不被视为可匹配的“一行”——不是 bug,是行为逻辑。
- 验证方法:按
Ctrl+`打开控制台,输入view.substr(view.line(view.size())),返回''就说明存在这种 EOF 空行 - 补救方式:光标移到最后一行开头,按
Ctrl+Shift+K(Windows/Linux)或Cmd+Shift+K(macOS)整行删除 - 别用
^\s*\n或^\s*$\n:它们会把换行符纳入匹配,但在 EOF 无换行时照样失效,还可能误删其他位置的换行 - 批量处理前先保存文件——很多编辑器(包括 Sublime)会在保存时自动补上结尾换行符,让后续正则能正常命中
真正容易被忽略的点
不是正则怎么写,而是哪些地方它“看不见”或“不该碰”:
-
\s默认不匹配零宽空格(\u200b)、BOM(\uFEFF)、某些 Unicode 空白字符,得手动加到字符集中 - 从网页、微信、Excel 粘贴的内容常带这些隐藏字符,建议先按
Ctrl+Shift+P输入toggle_whitespace开启空白可视化 - Python 函数之间、CSS 规则块之间、Markdown 段落之间的空行是有语义的,全删会导致格式化工具误判或渲染异常
- 空标签清理(如
<div></div>)要用跨行正则 + 反向引用,且必须开启. matches newline,但它和删空行的正则冲突,得分开执行、开关切换

















