sublime text中可靠压缩连续空行的方法是先用join lines合并非空行,再用正则^s*$\n删除纯空行;join_lines不处理空行,正则\n{3,}易漏混有空白符的空行,^\s*$ 更准确。

用 find_in_files 批量删连续空行不靠谱
Sublime Text 本身没有“压缩连续空行”内置命令,很多人试过用 find_in_files 搜
+ 替换为
,结果要么漏删、要么把单空行也干掉了——正则在多行上下文里行为不稳定,尤其跨文件时容易误伤。
真正可靠的做法是走编辑器原生的「行操作」路径:
- 选中全文(
Ctrl+A/Cmd+A) - 执行
Ctrl+Shift+P(Mac 是Cmd+Shift+P),输入Join Lines并回车 - 再手动删掉残留的纯空行:按
Ctrl+H打开替换面板,查找^s*$(匹配仅含空白符或完全为空的行),替换为空
join_lines 命令为什么不能直接压缩空行
join_lines 的设计目标是合并「有内容的行」,遇到空行会跳过。它只对光标所在行或选中区域中「非空行」生效,不会触碰空行本身。所以直接用它处理 a
b,结果是 a
b,毫无变化。
关键点在于:这个命令不处理空行,也不识别“连续空行”这个概念。它只是把相邻的非空行用单个换行拼起来。
- 适用场景:整理日志片段、拼接 SQL 多行语句、修复被意外折行的 JSON 字段
- 不适用场景:清理模板文件、Markdown 草稿、YAML 配置中冗余的空行分隔
- 副作用:如果行尾有空格或制表符,
join_lines会保留它们,可能造成后续格式错乱
用正则替换时 ^s*$
和
{3,} 的区别
搜
{3,} 看似直觉,但实际会漏掉“空行+空格行+空行”这类混合情况;而 ^s*$
匹配的是「整行只含空白符或为空,且后面跟着换行」,更贴近人对“可删空行”的认知。
- 必须勾选
. matches newline吗?不需要——这里用的是^和$,依赖的是“行首/行尾锚点”,和该选项无关 - 替换为空时,别手滑写成
,否则空行变单换行,数量没减反而更碎 - 想保留最多一个空行分隔?把查找改成
^s*$ {2,},替换为
保存为自定义命令一键执行
反复操作太麻烦,可以建个简单插件,让 Ctrl+Alt+K 一键压缩空行:
import sublime
import sublime_plugin
<p>class CollapseBlankLinesCommand(sublime_plugin.TextCommand):
def run(self, edit):
view = self.view</p><h1>先删所有纯空行(含空格)</h1><pre class="brush:php;toolbar:false;"> region = sublime.Region(0, view.size())
content = view.substr(region)
import re
new_content = re.sub(r'^s*$
', '', content, flags=re.MULTILINE)
# 再压平连续空行 → 最多留一个
new_content = re.sub(r'
{3,}', '
', new_content)
view.replace(edit, region, new_content)
保存为 Packages/User/collapse_blank_lines.py,然后在 Preferences > Key Bindings 加一行:
{ "keys": ["ctrl+alt+k"], "command": "collapse_blank_lines" }
注意:这个脚本是全量重写 buffer,大文件(>10MB)会卡顿;如果只是临时清理,优先用前面的手动两步法更稳。
最易忽略的是:正则里的 ^ 和 $ 在 Sublime 中默认按“逻辑行”匹配,不是物理换行,所以带 BOM 或 CRLF/LF 混用的文件要先统一换行符再处理。











