列选择不能批量删行首缩进,因其仅按列位置删除字符,不识别缩进语义;真正可靠的是正则^\s+替换,可统一清除空格、Tab及混合缩进。

列选择本身不能批量删行首缩进
Sublime 的列选择(Ctrl+Shift+L 或 Cmd+Shift+L)只是把光标放在每行相同列位置,它不识别“行首缩进”这个语义——你用鼠标拖出列选区后按 Delete,删的是你选中的那一竖列字符,不是“每行开头的空白”。如果各行缩进长度不一致(比如有的 2 空格、有的 1 tab、有的 4 空格 + tab),列选择会错位、删一半、甚至误删代码内容。
真正能批量删行首缩进的只有 ^\s+ 正则替换
这是唯一稳定覆盖所有情况的方式,包括空格、tab、混合缩进、Unicode 空白符:
- 打开替换面板:
Ctrl+H(Windows/Linux)或Cmd+H(macOS) - 点击右下角
.*按钮启用正则模式(确保它是高亮蓝色) -
Find What填^\s+,Replace With留空 - 先点
Find All看匹配是否合理(尤其注意 Python 缩进块是否被误伤) - 确认无误再点
Replace All
注意:^\s+ 中的 \s 比 [ \t] 更完整,它包含 \f、零宽空格等,适合处理从不同编辑器粘贴进来的文本。
别信 Ctrl+Shift+K 或 Shift+Tab 能批量清缩进
这些快捷键在列选择下完全不可靠:
-
Ctrl+Shift+K只删“光标到行首”的内容,但列选择时多个光标列位置固定,不一定在行首;若某行缩进是 3 字符,另一行是 5 字符,列选第 4 列再按它,第一行根本没反应,第二行删掉第 4–5 字符——不是缩进,可能是代码 -
Shift+Tab在 Sublime 中实际是补全触发器,不是缩进命令;真正管用的缩进操作是Ctrl+[,但它只对当前选中块做“减一档”缩进,不等于“删光行首空白”,且会受tab_size和translate_tabs_to_spaces设置影响 - 如果你已经列选了,又想用
Ctrl+[,得先确保所有光标都在有效缩进范围内,否则部分行可能缩进不变、部分行缩进异常
删完发现格式乱了?大概率是换行符或残留 \r 导致的
批量替换后出现 ^M、空行变双空行、缩进塌陷,往往不是正则写错了,而是换行符不匹配:
- 看 Sublime 窗口右下角状态栏,显示的是
DOS (CRLF)还是Unix (LF)?必须和源文件一致 - 如果显示
DOS但替换了,而\r被当普通字符处理,会导致行尾多出\r;此时搜\r替换为空即可 - 删行首缩进前,如果文件本身有
\r\n换行,^\s+不会误吞\r,因为它属于行首空白;但替换后若手动改过换行格式,就容易出问题
真正难处理的不是怎么删,而是删完要不要保留某些行的缩进(比如 Markdown 列表项或 YAML 键值对),这时候就得手动加负向断言,比如 ^(?!(\s*-\s|\s*[a-zA-Z0-9_]+:)).*\s+——但那已超出批量清理范畴,得按需定制。











