tab键插入\t而非空格的根源是translate_tabs_to_spaces默认为false;需设为true且tab_size为数字4,python文件还需语法专属配置并禁用detect_indentation。

Tab键插入\t而不是空格,核心开关没开
按 Tab 还是输出制表符 \t,不是编辑器坏了,而是 translate_tabs_to_spaces 默认为 false。这个布尔值不设成 true,tab_size 再怎么配都只影响显示宽度,和输入行为无关。
常见错误包括:
- 只改了
tab_size,漏掉translate_tabs_to_spaces - 在用户设置里写了
"translate_tabs_to_spaces": "true"(加了引号,变成字符串) - 右下角显示
Tab Width: 4就以为生效了,其实旁边写着Tabs,说明模式仍是制表符
正确做法:打开 Preferences → Settings,在右侧用户设置中添加:
{
"translate_tabs_to_spaces": true,
"tab_size": 4
}
注意:tab_size 是数字,translate_tabs_to_spaces 是布尔值,不能加引号。
Python文件缩进还是2空格?语法专属配置被覆盖了
全局设置对 .py 文件基本无效,因为 Python 语言包自带 Python.sublime-settings,里面硬编码了 "tab_size": 2 和 "translate_tabs_to_spaces": false,优先级高于用户设置。
必须走语法专属路径:
- 先打开一个
.py文件(否则菜单不可用) - 菜单栏选
Preferences → Settings – Syntax Specific - 在右侧 JSON 中只添加两行:
"tab_size": 4和"translate_tabs_to_spaces": true - 已打开的文件需按
Ctrl+Shift+P输入Reload Syntax才生效
文件名必须严格匹配:配置存为 Python.sublime-settings,写成 Python3.sublime-settings 或 python.sublime-settings 都不生效。
Convert Indentation to Spaces 灰掉了?混合缩进被保护
菜单项变灰不是功能损坏,是 Sublime 检测到当前文件存在混合缩进(部分行开头是 \t,部分是空格),主动拒绝自动转换,防止错位。
安全处理步骤:
- 开启空白字符可视化:
View → Whitespaces → Show Whitespaces,或在用户设置中加"draw_white_space": "all",让\t显示为→,空格显示为· - 手动删掉前几行明显混搭的缩进(比如某行开头是
→·→) - 保存后重试命令;或临时切语法为
Plain Text(右下角点击 → 选Plain Text),再执行转换 - 转换完务必执行
Indentation → Reindent Lines,否则缩进层级可能未对齐
旧文件缩进混乱,但配置全对,为什么还错?detect_indentation 在偷偷覆盖
detect_indentation 默认为 true,打开文件时会扫描前 200 行,只要发现一个行首 \t,就静默覆盖你的 translate_tabs_to_spaces 和 tab_size,切回 Tabs 模式——你改的所有设置全被无视。
表现就是:用户设置里写了 true,打开旧 .py 文件,按 Tab 还是插 \t,右下角显示 Tabs: 4。
必须在 Preferences → Settings 用户设置中显式加:
"detect_indentation": false
加完后,已打开的文件不会自动刷新,需手动 Ctrl+Shift+P → Reload Syntax。关掉它,缩进行为才真正由你写的配置决定,而不是被文件内容反向劫持。
最易忽略的一点:所有配置只控制“新输入”,不会动已有 \t 字符。状态栏显示 Spaces: 4 只代表“接下来按 Tab 插 4 空格”,不代表历史缩进已清理——这点不厘清,永远在修表面,不动根子。











