必须用^\s+而非^\s,因^\s+匹配一个及以上行首空白、避免零长度匹配导致空行,^\s会插入大量空行;操作时须启用.*模式、仅作用于选中区域,并分步处理行首行尾空白。

直接删行首空格必须用 ^\s+,不是 ^\s*
用 ^\s+ 才能真正只删“有内容的行”开头的空白,^\s* 会匹配零长度位置,导致“Replace All”后插入大量空行。Sublime 的正则引擎对 * 的零宽匹配非常敏感,一用就翻车。
常见误操作:
• 没勾右下角 .* 图标 → ^\s+ 当纯文本处理,完全不生效
• 全选全文后点 Replace All → 注释行、YAML 键值对、Python docstring 缩进全被扫荡
• 用 ^ +(空格字面量)→ 只删空格,漏掉 Tab,缩进错乱更严重
- 必须先选中目标区域(比如 Ctrl+L 多行选中,或鼠标拖选代码块),再开替换面板
-
^\s+中的^锚定行首,\s+匹配一个及以上空白字符(含空格、Tab、\r、\n),避免零长度匹配 - 替换框绝对留空,别填
\n或空格 —— 否则每删一次反而多塞一个换行符
删完缩进崩了?大概率是 Tab 和空格混用
删掉行首空白后,如果发现 Python 报 IndentationError、Alignment 插件对不齐、折叠符号错位,基本可断定原文件混用了 Tab 和空格。Sublime 的视觉缩进和实际字符列数不一致,会导致后续所有对齐逻辑失效。
- 统一为纯空格:菜单
View → Indentation → Convert Indentation to Spaces - 关掉自动检测:菜单
Indentation → Detect Indentation设为false,否则下次打开又切回 Tab - 检查语法类型:右下角状态栏显示
source.python或source.yaml等,不同语法可能加载不同缩进设置
想同时删行首 + 行尾空格?顺序不能反
必须严格分两步:
第一步:查找 ^\s+,替换为空 → 干掉所有行首空白
第二步:查找 \s+$,替换为空 → 再干掉所有行尾空白
反过来会出问题:某些原本只有空格的行(比如纯空行或缩进行)在第二步变为空,再执行第一步时就被整行清空。虽然可用 ^\s+|\s+$ 一步到位,但 Sublime 的 Replace All 不跳过已修改过的行,风险更高。
- 删行尾空格更推荐配
"trim_trailing_white_space_on_save": true,它只动末尾,不动中间和缩进 - 配置路径:
Preferences → Settings – User,加一行 JSON:"trim_trailing_white_space_on_save": true - 注意冲突:如果装了
TrailingSpaces插件,需关掉它的自动清理,否则和原生选项打架
文件末尾那个“看不见的空行”最麻烦
如果删完发现最后一行还是空的,大概率是 EOF 前没有换行符 —— 这种行不被 ^\s+ 或 ^\s*$ 匹配,因为 Sublime 的 ^/$ 默认锚定的是“有换行符边界”的行。
- 验证方法:菜单
View → Show Console,输入view.substr(view.line(view.size())),返回''就说明存在这种 EOF 空行 - 手动删:光标移到该行开头,按
Ctrl+Shift+K(Windows/Linux)或Cmd+Shift+K(macOS) - 别用 Backspace 或 Delete —— 它们只删光标前字符,极易留下隐形字符(如
\u200b)











