必须同时设置"translate_tabs_to_spaces": true和"tab_size": 4,并关闭"detect_indentation": false;仅设tab_size无效,因它只控制显示宽度和转换比例,不改变tab键插入行为,真正决定插入内容的是translate_tabs_to_spaces。

要让 Sublime Text 的 Tab 键插入 4 个空格,必须同时启用 translate_tabs_to_spaces 并设 tab_size 为 4;只改其中一个,Tab 键依然输出 \t 字符,不是空格。
为什么改了 tab_size 还是插 Tab?
tab_size 只控制制表符的显示宽度和转换比例,不改变 Tab 键行为。真正决定“按 Tab 插什么”的是 translate_tabs_to_spaces:
-
translate_tabs_to_spaces: true→ 按Tab插入空格(数量由tab_size决定) -
translate_tabs_to_spaces: false(默认值之一)→ 按Tab插入\t,此时tab_size仅影响显示和Convert Indentation操作
两个配置必须写在同一级 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: 4) - 开启
"draw_white_space": "all",空格显示为小点,\t显示为 →,一眼分清混用 - 新建一个空文件,按
Tab,看是否插入 4 个小点;Shift+Tab是否一次性删掉全部 4 个
最容易被忽略的是 detect_indentation 和 translate_tabs_to_spaces 这两个开关——它们默认开启或关闭,不显式声明就等于没设。











