ctrl+] 和 ctrl+[ 是 sublime 中唯一可靠多行缩进命令,不触发补全、不分析语法,仅机械增减行首空白;未选中时作用于当前行,选中多行时统一缩进,需配合精准选区与缩进归一化操作。

Ctrl+] 和 Ctrl+[ 是多行缩进的唯一可靠入口
Tab 和 Shift+Tab 在 Sublime 里不是缩进命令,而是补全触发器——尤其在函数名后、引号内或 JSX 标签中,按 Tab 会弹出补全菜单,根本不会动缩进。真正能稳定作用于多行的,只有 Ctrl+](右缩进)和 Ctrl+[(左缩进)。它们不分析语法、不触发补全、不矫正空格数,只机械增减行首空白。
关键行为规则:
- 未选中任何内容时,只作用于当前行首
- 选中多行时,对每行统一加/减一档缩进(由
tab_size和translate_tabs_to_spaces决定) - 对
.json、.md、.txt这类无语法约束的文件同样生效 - 折叠区域(
Ctrl+Shift+[折起来的代码)不参与缩进计算,缩进前务必先展开
选区不准,缩进就一定错
缩进漏行、缩错层级、甚至方向反了,90% 是因为选区没对准逻辑结构。比如光标停在 if 行但只选了半行,Ctrl+] 就只缩进那半行;又或者 def func(): 后面的整个函数体没被完整选中,缩进后直接破坏 Python 的嵌套关系。
推荐三类精准选区方式:
-
Ctrl+Shift+M:把光标放在任意括号({}、[]、())内,一键选中配对范围内的全部内容 -
Ctrl+Shift+J:光标停在某行,选中所有同缩进层级的连续行(适合缩进整个 if 块或 for 循环体) -
Ctrl+Shift+P→ 输入Selection: Expand Selection to Brackets:HTML 标签、JSON 对象、Vue 单文件组件的<script></script>块都靠它包裹准确
缩进单位混乱?先归一化再操作
混用 Tab 和空格是缩进错乱的根源。你按 Ctrl+],结果插入的是一个 Tab 字符(宽度由 tab_width 决定),而团队规范要求 4 个空格——这种不一致会在 Git diff 里爆炸式体现,也会让 ESLint 或 Prettier 报错。
执行缩进前必须做这三件事:
- 确认右下角语法标识准确(如 Vue 文件中的
<script></script>块常被误判为 HTML,需点开手动切到 JavaScript) -
Ctrl+Shift+P→ 输入Indentation: Convert Indentation to Spaces,把已有 Tab 全转为空格 - 检查用户设置中是否含
"detect_indentation": false,否则打开旧文件时 Sublime 会悄悄覆盖你的tab_size和translate_tabs_to_spaces
想彻底绕过语法干扰,就自定义键绑定
如果你常在多个项目间切换,且团队强制统一用 4 空格缩进,原生 Ctrl+] 仍可能受当前文件设置影响(比如某个 JSON 文件里 translate_tabs_to_spaces 是 false)。这时候最干净的做法是绕过所有自动逻辑,直接绑定固定行为:
在 Preferences → Key Bindings – User 中加入:
[
{"keys": ["ctrl+]"], "command": "insert", "args": {"characters": " "}},
{"keys": ["ctrl+["], "command": "left_delete", "args": {"forward": false}}
]
注意:ctrl+[ 这条只会删除开头最多 4 个空格,不智能退层级,所以必须配合精准选区使用;且该配置会完全覆盖原生行为,不再响应 tab_width 或语法类型。
真正容易被忽略的点是:Python 文件的缩进规则优先级高于用户设置,必须单独在 Python.sublime-settings 里写死 "tab_size": 4 和 "translate_tabs_to_spaces": true,否则改了全局也没用。











