必须同时设置"tab_size":4和"translate_tabs_to_spaces":true,且禁用"detect_indentation":false,并在语法专属设置中同步配置,否则Tab键仍插入制表符;因tab_size仅控显示宽度,真正决定输入行为的是translate_tabs_to_spaces开关。

tab_size 和 translate_tabs_to_spaces 必须同时设对,否则按 Tab 键永远插不出 4 个空格——只改其中一个,等于白调。
为什么改了 tab_size 还是插入制表符(\t)?
因为 tab_size 只控制显示宽度和换算逻辑,不决定按键行为。真正开关是 translate_tabs_to_spaces:
-
translate_tabs_to_spaces为true→ 按 Tab 插入tab_size个空格 -
translate_tabs_to_spaces为false(默认之一)→ 按 Tab 插入单个\t,哪怕tab_size是 100 也无效
二者必须同级写在 Preferences → Settings – User 里,缺一不可。
为什么刚打开文件缩进又变回 2 空格或 Tab?
因为 detect_indentation 默认为 true,Sublime 会在加载时扫描前几行,自动覆盖你的全部设置。这不是 bug,是设计行为:
- 状态栏右下角显示
Tab Width: 2或Tab,说明检测已生效,当前视图设置被临时劫持 - 解决方法:在用户设置中显式加
"detect_indentation": false - 该设置只在文件打开时触发,改完需重新打开已有文件才生效
为什么 Python/JS 文件还是用 2 空格?
因为语法专属设置(如 Python.sublime-settings)优先级高于全局用户配置。很多语言包自带硬编码规则:
- 路径:
Preferences → Package Settings → Python → Settings – Syntax Specific - 在里面加两行:
"tab_size": 4和"translate_tabs_to_spaces": true - 已打开的文件需执行
Ctrl+Shift+P→ 输入Reload Syntax才刷新 - 其他语言(JS、JSON、Vue、YAML)同理,各自进对应
Settings – Syntax Specific
怎么确认当前按 Tab 插出来的是空格还是制表符?
光看缩进视觉宽度没用,得看实际字符。最直接的方法是开启空白符可视化:
- 在用户设置中加
"draw_white_space": "all" - 保存后,空格显示为小圆点(·),制表符显示为箭头(→)
- 按一次 Tab,如果出现四个 ·,说明生效;如果出现一个 →,说明
translate_tabs_to_spaces没起作用,或被语法设置覆盖
真正容易被忽略的是优先级链:文件内注释(如 # indent: 2) > 项目级 .editorconfig > 语法专属设置 > 全局设置。只要其中任一环存在,你的配置就可能静默失效。


















