Sublime Text中Tab键默认触发代码补全而非缩进,真正可靠的块级缩进快捷键是Ctrl+](增)和Ctrl+[(减),它们跨语法稳定生效,不受补全逻辑干扰。

Sublime Text 里按 Tab 键不缩进,不是快捷键坏了,而是它根本就不是缩进命令——它是补全触发器;真正可靠、可预测的块级缩进操作,只有 Ctrl+](增)和 Ctrl+[(减)。
为什么按 Tab 不缩进,甚至弹出补全菜单?
Tab 在 Sublime 中默认绑定的是 insert_best_completion 或 Emmet 补全,不是缩进。只要光标落在函数名后、引号内、HTML 标签名后、或有补全提示的位置,按 Tab 就会触发补全,而非插入空白符。
- 这不是 bug,是设计行为:Sublime 把“代码补全”优先级设得比“缩进”高
- 即使你已设
"translate_tabs_to_spaces": true,Tab键仍可能跳过缩进逻辑直接补全 - 想验证是否被劫持:新建一个
.txt文件,输入任意字符后按Tab——如果此时能插入空格/Tab,说明问题出在当前语法或插件上
Ctrl+] 和 Ctrl+[ 才是真·缩进快捷键
这两个命令专用于修改行首空白符,不分析语法、不触发补全、不自动对齐倍数,行为稳定且跨文件类型通用。
- 未选中内容时:只作用于当前行
- 选中多行时:整块统一增/减一档缩进(由
tab_size和translate_tabs_to_spaces决定) - 对
.json、.md、.txt等无语法约束文件同样生效 - 列选择(Alt+拖选)后也适用,但注意:它会在每行**光标位置前**插入缩进,不保证逻辑层级一致
按了 Ctrl+] 没反应?先查这三件事
不是快捷键失效,是缩进逻辑被卡住了。
- 右下角语法标识是否准确?比如 Vue 的
<script></script>块常被误判为 HTML,点它手动切到 JavaScript - 当前文件是否混用空格和 Tab?执行
Ctrl+Shift+P→ 输入Indentation: Convert Indentation to Spaces归一化后再试 -
detect_indentation是否开着?默认为true,它会根据文件首行缩进风格锁定设置(如识别出是 2 空格,你按Ctrl+]加一档,它可能立刻把你加的 4 个空格“抹平”回合法倍数)。关掉最彻底:"detect_indentation": false
想让 Ctrl+] 固定插入 4 个空格,而不是一个 Tab 字符?
原生命令的行为受两个设置控制:tab_size 控制宽度,translate_tabs_to_spaces 控制字符类型。但默认不保证输出空格——尤其当 translate_tabs_to_spaces 是 false 时,Ctrl+] 就只插一个 \t。
- 确保
"translate_tabs_to_spaces": true,否则Tab键和Ctrl+]都插\t -
"tab_size": 4要和translate_tabs_to_spaces同时设才有效 - 若团队强制统一用 4 空格且不想被任何文件影响,可在
Preferences → Key Bindings – User中加自定义绑定:[ {"keys": ["ctrl+]"], "command": "insert", "args": {"characters": " "}} ]注意:这会完全绕过缩进系统,适合风格高度统一的项目
真正麻烦的不是记不住快捷键,而是缩进行为被 detect_indentation、语法专属配置、.editorconfig 多层覆盖后,同一组按键在不同文件里表现不一致——这种“看似随机”的失效,才是日常开发中最消耗判断力的地方。


















