必须分两步删除行首行尾空白,因为Sublime的Replace All会逐行扫描并重复匹配已修改内容,若用^\s+|\s+$一步替换,纯空行可能被清空;安全做法是先^\s+再\s+$,确保每行仅处理一次。

为什么必须分两步:先删行首,再删行尾
直接用 ^\s+|\s+$ 一步替换看似省事,但 Sublime 的 Replace All 不会跳过已修改的行——如果某行原本只有空格(比如 ),第二步匹配 \s+$ 会把它变成空字符串,紧接着第一步又对这个“新空行”执行 ^\s+,结果整行被清空。这不是 bug,是正则引擎逐行扫描的必然行为。
真正安全的做法是严格按顺序:
- 第一步:
Find What填^\s+,Replace With留空 → 干掉所有行首空白 - 第二步:
Find What改为\s+$,同样留空 → 再干掉所有行尾空白
这样能确保每行最多被处理一次,纯空行(如 \n)也不会被误删成“消失”。
如何避免误伤注释、YAML 或 Python docstring
全文 Replace All 很危险:Python 的 """ 多行字符串、YAML 的缩进键值对、甚至 C/JS 的块注释缩进,都依赖行首空格。一旦全删,语法可能直接失效。
正确做法永远是限定作用范围:
- 想处理某段代码?先鼠标拖选,或按
Ctrl+L逐行选中目标行,再开替换面板 - 想处理多个文件?在替换面板点右上角
In Files,填路径过滤器(如src/**/*.py) - 千万别全选全文后点
Replace All—— 即使你确认“没注释”,也难保 JSON 字符串里没带缩进的字段
遇到全角空格、零宽字符怎么办
从网页、微信、Excel 粘贴的文本常含 \u3000(全角空格)、\u200B(零宽空格)、\uFEFF(BOM)等,\s 默认不匹配它们,导致“看着是空行却删不掉”。
这时得手动扩展字符集:
- 删行首:用
^[\s\u200b\uFEFF\u00a0\u3000]+ - 删行尾:用
[\s\u200b\uFEFF\u00a0\u3000]+$ - 删空行:用
^[\s\u200b\uFEFF\u00a0\u3000]*$
操作前可按 Ctrl+Shift+P 输入 toggle_whitespace,打开空白符显示,看到 · 或 → 就说明有隐藏字符。
删完发现缩进错乱?大概率是 Tab/空格混用
行首空格删掉后,如果代码块整体左移、Alignment 插件对不齐、甚至报 IndentationError,基本可断定原文件混用了 Tab 和空格。
必须立刻统一:
- 菜单
View → Indentation → Convert Indentation to Spaces - 再关掉
Indentation → Detect Indentation(否则下次打开又自动切回 Tab)
这步做完再删空白,后续所有折叠、跳转、对齐才可靠。很多人跳过它,结果反复修格式,其实根子就在这儿。

















