必须同时设置"translate_tabs_to_spaces":true和"tab_size":4,并关闭"detect_indentation":false,否则Tab键仍插入\t;因tab_size仅控制显示宽度和转换比例,真正决定按键输出的是translate_tabs_to_spaces,且语法专属设置优先级更高。

不能只改 tab_size,必须同时设 translate_tabs_to_spaces 为 true,否则按 Tab 键永远插的是 \t 字符,不是空格。
为什么改了 tab_size 还是插出 Tab?
因为 tab_size 只控制制表位宽度(即显示时一个 \t 占几格),它不改变输入行为。Sublime 默认 translate_tabs_to_spaces 是 false,所以按 Tab 就是插 \t。右下角显示 Tabs: 4 ≠ 你用了空格;只有显示 Spaces: 4 才算生效。
常见误操作包括:
- 只加
"tab_size": 4,漏掉"translate_tabs_to_spaces": true - 把
true写成"true"(字符串)或True(首字母大写) - 改了左侧 Settings – Default(只读模板),没动右侧 Settings – User
怎么让新输入的 Tab 自动变空格?
打开 Preferences → Settings,在右侧用户设置中添加这两项(确保 JSON 格式正确):
{
"translate_tabs_to_spaces": true,
"tab_size": 4
}其中 tab_size 值需匹配项目规范:Python 通常用 4,YAML 必须用 2,Vue/React 常用 2。如果希望光标移动也完全基于空格(避免跳转错位),可额外加 "use_tab_stops": false。
注意:detect_indentation 默认为 true,打开旧文件时会扫描前 200 行,只要发现行首有 \t,就自动关掉 translate_tabs_to_spaces 并切回 Tab 模式。要防止这个行为,必须显式加上 "detect_indentation": false。
为什么 Python 文件里设置不生效?
Python 语法包自带 Python.sublime-settings,里面硬编码了 "tab_size": 2 和 "translate_tabs_to_spaces": false,它优先级高于全局用户设置。
解决方法是单独配语法专属设置:
- 打开一个
.py文件 - 菜单进入
Preferences → Settings – Syntax Specific - 在右侧添加相同配置:
{ "tab_size": 4, "translate_tabs_to_spaces": true } - 已打开的文件需执行
Ctrl+Shift+P→ 输入Reload Syntax才刷新生效
其他语言同理:JavaScript、JSON、Markdown 都要各自进对应的 Settings – Syntax Specific 配置,且语法名大小写敏感(如必须是 Python,不是 python)。
已有文件里的 Tab 怎么批量转?
Convert Indentation to Spaces 只处理行首缩进,不碰字符串或行中 \t,安全可靠。
操作方式:
- 快捷键:
Ctrl+Shift+P(Win/Linux)或Cmd+Shift+P(macOS),输入Convert Indentation to Spaces回车 - 菜单路径:
View → Indentation → Convert Indentation to Spaces - 多文件批量处理:用
Ctrl+P打开文件列表,按住Ctrl(或Cmd)多选,再对任意一个执行该命令,所有选中标签页同步转换
如果菜单灰掉,说明 Sublime 检测到混合缩进(Tab + 空格混用)。此时先手动删掉几行开头的 \t,或开启 "draw_white_space": "all" 显示空白字符辅助识别,再重试。
最常被忽略的是优先级链:文件内注释(如 # indent: 2) > 项目级 .editorconfig > 语法专属设置 > 全局用户设置。只要其中任一环存在冲突配置,你的设置就可能静默失效。


















