根本原因是detect_indentation默认为true,会扫描文件前几行缩进并覆盖tab_size和translate_tabs_to_spaces设置;必须同时配置"tab_size":4、"translate_tabs_to_spaces":true和"detect_indentation":false才生效。

为什么改了 tab_size 按 Tab 还是插 \t?
根本原因就一个:detect_indentation 默认为 true,它会扫描文件前几行缩进,直接覆盖你设的 tab_size 和 translate_tabs_to_spaces。这个行为不报错、不提示,只在右下角默默显示 “Tabs: 2” 或 “Detect Indentation”,让你误以为配置生效了。
必须在 Preferences → Settings – User 中显式添加:
{
"tab_size": 4,
"translate_tabs_to_spaces": true,
"detect_indentation": false
}
tab_size 只定义“等效宽度”,不控制插入内容;translate_tabs_to_spaces 才决定按 Tab 键插的是空格还是 \t;detect_indentation 关不掉,其他两项基本白设。
Python/JS 等语言缩进还是 2 空格?去语法专属设置改
全局设置对 .py 文件基本无效——Python 语言包自带 Python.sublime-settings,硬写了 "tab_size": 2 和 "translate_tabs_to_spaces": false,优先级高于用户设置。
- 先打开一个
.py文件,确认右下角显示的是Python(不是Plain Text) - 菜单 →
Preferences → Settings – Syntax Specific,右侧 JSON 中只加两行:{ "tab_size": 4, "translate_tabs_to_spaces": true } - 已打开的文件需手动执行
Ctrl+Shift+P→ 输入Reload Syntax才刷新 - JavaScript、JSON、YAML 同理,各自进对应
Settings – Syntax Specific配置,不能指望全局一刀切
怎么验证当前按 Tab 插入的是空格还是制表符?
光看缩进视觉宽度不够,得确认实际字符。最直接的方法是开启空白符可视化:
在 Settings – User 中加一行:"draw_white_space": "all",保存后:
- 空格显示为小圆点(·)
- 制表符显示为箭头(→)
- 按一次 Tab,若出现四个 ·,说明生效;若出现一个 →,说明
translate_tabs_to_spaces没起作用,或被语法设置覆盖
注意:这个设置只影响显示,不影响行为,但它是唯一能一眼看清实际插入内容的方式。
已有文件缩进混乱,怎么安全转成 4 空格?
所有配置只影响“新输入”,不会动已有字符。混用 \t 和空格的文件,Convert Indentation to Spaces 菜单项可能灰掉——那是 Sublime 检测到混合缩进,主动拒绝误操作。
安全操作步骤:
- 确保右下角显示
Spaces: 4(点击它确认,不是Tabs: 4) - 执行
View → Indentation → Convert Indentation to Spaces - 若菜单灰掉,先手动删掉开头几行的 \t,或全选后用
Ctrl+Shift+P→ 输入Reindent再试 - 转换后建议立刻执行
View → Indentation → Set Indent Width: 4锁定宽度
真正容易被忽略的是 detect_indentation 的静默接管能力——它不声不响就把你的配置架空,关不掉就永远在和编辑器“猜谜”。











