必须同时设置"translate_tabs_to_spaces": true和"tab_size": 4,且关闭"detect_indentation": false;仅改tab_size无效,因它只影响显示宽度和转换比例,不改变Tab键插入行为。

Sublime Text 默认按 Tab 键插入的是 \t 字符,不是空格;要让它真正输入 4 个空格,必须同时启用 translate_tabs_to_spaces 并设好 tab_size,缺一不可。
为什么改了 tab_size 还是插 Tab?
只设 "tab_size": 4 不起作用——它只控制制表符的显示宽度或转换时的换算比例,不改变 Tab 键行为。真正决定“按 Tab 插什么”的是 translate_tabs_to_spaces。如果它是 false(默认值之一),哪怕 tab_size 是 100,按 Tab 依然输出 \t。
-
translate_tabs_to_spaces: true→ 按 Tab 插入空格(数量由tab_size决定) -
translate_tabs_to_spaces: false→ 按 Tab 插入\t,tab_size只影响显示和 Convert 操作 - 两个配置必须写在同一级 JSON 对象里,且都在用户设置或语法专属设置中
全局设置在哪改?怎么避免被覆盖?
打开 Preferences → Settings,右侧“Settings – User”面板里添加:
{
"tab_size": 4,
"translate_tabs_to_spaces": true,
"detect_indentation": false
}
detect_indentation: false 是关键:它关掉 Sublime 打开文件时自动扫描前几行缩进并覆盖你设置的行为。否则,一个开头有 2 空格的 Python 文件会强制把当前视图切回 tab_size: 2 和 translate_tabs_to_spaces: false。
- 别动左侧“Settings – Default”,那是只读模板
- 别在
Settings – Syntax Specific里改全局,那只会对当前语法生效 - 如果项目根目录有
.editorconfig,EditorConfig 插件会优先于这些设置——要么删插件,要么同步配indent_size=4
Python/JS/YAML 等文件缩进还是不对?
语言包自带的语法专属设置(如 Python.sublime-settings)优先级高于全局设置。即使你全局设了 4 空格,打开 .py 文件时,它仍可能加载 Python 包里默认的 "tab_size": 2。
- 打开一个
.py文件 →Preferences → Settings – Syntax Specific - 右侧粘贴:
{ "tab_size": 4, "translate_tabs_to_spaces": true } - 保存后,新打开的
.py文件立即生效;已打开的需Ctrl+Shift+P → Reload Syntax - 同理,JSON 文件要单独配
tab_size: 2,Makefile 则必须保留indent_with_tabs: true
怎么验证真的生效了?
别只看状态栏显示 Tab Width: 4——它不反映是否在用空格。真正有效的信号是右下角显示 Spaces: 4(不是 Tab Width)。
- 开启空白字符显示:
View → Render Whitespace → All,空格显示为小点,\t显示为→ - 新建文件,按一次 Tab,应出现 4 个点;Shift+Tab 应一次性删掉全部 4 个
- 如果粘贴一段代码后缩进错位,大概率是混用了
\t和空格,先Convert Indentation to Spaces再试
最容易被忽略的是 detect_indentation 和 translate_tabs_to_spaces 这两个布尔开关——它们默认不开启,且一旦被覆盖,不会报错,只默默让缩进行为和你预期相反。

















