必须同时设置"translate_tabs_to_spaces": true、"tab_size": 4和"detect_indentation": false,否则Tab键仍插入\t;因前者是输入开关,tab_size仅控显示与换算,detect_indentation默认会静默覆盖配置。

Sublime Text 默认按 Tab 键插入的是制表符 \t,不是空格——哪怕右下角显示 Tab Width: 4,那也只是渲染宽度,和输入行为无关。要真正让 Tab 键插空格,必须同时控制三个参数:开关、数量、防覆盖。
为什么改了 tab_size 还是插 \t?
因为 translate_tabs_to_spaces 没开,或者开了但被更高优先级配置覆盖了。这个布尔值默认为 false,不显式设成 true,Tab 键永远插 \t。
-
tab_size只定义“等效宽度”,不影响按键输出内容 -
translate_tabs_to_spaces才是决定按Tab插入空格还是\t的开关 - 只设
tab_size不设translate_tabs_to_spaces→ 仍插\t - 只设
translate_tabs_to_spaces不设tab_size→ 插 4 个空格(默认值),但可能被语法设置覆盖
为什么刚配好就失效?detect_indentation 在偷偷接管
Sublime 默认开启 detect_indentation,一打开文件就扫描前几行,自动把 tab_size 和 translate_tabs_to_spaces 改成它“猜”的值——比如你打开一个用 2 空格缩进的 .py 文件,右下角立刻显示 Tab Width: 2,你的用户设置完全被架空。
- 它不报错、不提示,只在右下角默默显示
Detect Indentation或Tabs: 2 - 必须在
Preferences → Settings – User中显式加"detect_indentation": false - 关掉它,才是让其他配置生效的前提
Python/JS 文件缩进还是不对?去语法专属设置改
全局用户设置对 .py、.js 等文件基本无效,因为语言包自带的 Python.sublime-settings 或 JavaScript.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回车才刷新
已有文件缩进混乱,Convert Indentation to Spaces 灰掉了怎么办?
灰掉不是功能坏了,是 Sublime 检测到混合缩进(部分行用 \t、部分用空格),主动拒绝转换,防止错位。直接搜替换或全选缩进都可能破坏结构。
- 先开启空白字符可视化:
"draw_white_space": "all",让\t显示为→,空格为· - 手动删掉前几行明显混搭的缩进(如开头是
→·→) - 或临时切语法为
Plain Text(右下角点击 → 选Plain Text),再执行转换 - 转完后务必执行
Indentation: Reindent Lines,否则缩进层级可能未对齐
真正容易被忽略的不是怎么配,而是 detect_indentation 的静默覆盖能力——它不改你的配置文件,也不弹窗提醒,只是在你每次打开文件时悄悄重置缩进状态。关掉它,才能让 tab_size 和 translate_tabs_to_spaces 发挥作用。


















