Sublime Text中Tab键默认触发补全而非缩进,选中代码按Tab不缩进是设计使然;可靠缩进应使用Ctrl+]和Ctrl+[,或通过自定义Key Bindings为有选中时绑定indent命令。

选中代码按 Tab 不缩进?因为 Tab 被当成了补全触发器
Sublime Text 默认把 Tab 键绑定为「补全」命令(insert_best_completion),不是缩进命令。哪怕你选中了多行,按 Tab 也大概率弹出函数提示、Emmet 补全或什么都不做——尤其光标在引号内、括号后、或有语法高亮建议时。
这不是配置错了,是设计如此。真正负责块级缩进的原生命令是 indent 和 unindent,但它们默认没绑给 Tab。
- 别指望靠
"translate_tabs_to_spaces": true让选中后按Tab缩进——它只影响「光标在行首或空行时」的输入行为 -
Ctrl+]和Ctrl+[才是可靠缩进快捷键,它们调用的就是indent/unindent命令,且无视补全上下文 - 如果坚持要用
Tab缩进选中内容,必须手动重绑定,且需区分「有选中」和「无选中」两种场景,否则会破坏补全功能
想让选中时 Tab 缩进,必须自定义 Key Bindings
直接改用户快捷键文件(Preferences → Key Bindings – User),添加两条规则:一条处理「有选中内容」,一条保留「无选中时的补全」。
推荐写法(Windows/Linux):
{
"keys": ["tab"],
"command": "indent",
"context": [
{ "key": "selection_empty", "operator": "==", "operand": false },
{ "key": "setting.auto_complete_visible", "operator": "==", "operand": false }
]
},
{
"keys": ["tab"],
"command": "insert_best_completion",
"args": { "default": "\t", "exact": true },
"context": [
{ "key": "selection_empty", "operator": "==", "operand": true }
]
}
- 第一条规则:仅当有选中内容(
selection_empty == false)且补全面板没弹出时,才执行indent - 第二条规则:仅当无选中(
selection_empty == true)时,走原有补全逻辑;这样函数名后按Tab仍能补全 - 没加
context的纯Tab绑定会全局劫持,导致所有补全失效,务必避免
为什么 Ctrl+] 比 Tab 更值得依赖
Ctrl+](缩进)和 Ctrl+[(反缩进)是 Sublime 原生块缩进命令,不分析语法、不触发补全、不校验空格倍数,行为稳定可预测。
- 未选中时:只作用于当前行首空白符
- 选中多行时:统一增减一档缩进(由当前
tab_size和translate_tabs_to_spaces决定) - 对
.json、.md、.txt等无语法约束文件同样生效 - 即使右下角显示
Tab Width: 2且状态为Tabs,只要translate_tabs_to_spaces是true,Ctrl+]就插空格;否则插\t
缩进前务必确认当前视图状态
哪怕快捷键和设置都对,Ctrl+] 或重绑定后的 Tab 仍可能“没反应”或“缩错”,常见卡点如下:
- 右下角语法识别错误(如 Vue 单文件组件的
<script></script>块被当成 HTML)→ 点击语法名手动切到JavaScript - 文件被检测为混合缩进(
Indentation: Mixed)→Convert Indentation to Spaces菜单项会灰掉,需先手动清理几行开头的\t再试 -
detect_indentation为true(默认)→ 它会偷偷把当前视图的tab_size改成文件前几行的风格,关掉它才能让配置真正生效 - 已打开的文件没刷新语法设置 → 改完
Python.sublime-settings后,要按Ctrl+Shift+P输入Reload Syntax
真正麻烦的从来不是怎么设,而是 Sublime 在你没注意时悄悄覆盖了设置——detect_indentation 关不关,语法专属配置有没有配,已有文件缩进是否混杂,这三处漏掉任何一处,都会让缩进行为看起来“随机失灵”。


















