因为Python语言包自带硬编码配置,优先级高于全局设置;必须通过Preferences → Settings – Syntax Specific为Python单独配置"tab_size": 4和"translate_tabs_to_spaces": true,并在用户设置中禁用"detect_indentation": false,新.py文件才生效。

为什么改了全局设置,.py 文件还是 2 空格?
因为 Sublime 的缩进优先级里,Python.sublime-settings(语言包自带或你创建的语法专属配置)比用户全局设置高。Python 语言包默认硬编码了 "tab_size": 2 和 "translate_tabs_to_spaces": false,你改 Preferences → Settings 里的全局配置,它根本不会读。
实操上必须打开一个 .py 文件,确认右下角显示 “Python”,再执行 Preferences → Settings – Syntax Specific,编辑弹出的 Python.sublime-settings 文件。
- 只写你需要的字段,比如:
{ "tab_size": 4, "translate_tabs_to_spaces": true } - 别删已有内容,也别加多余逗号
- 保存后,新创建的
.py文件(包括Ctrl+N后立刻Save As)才会按这规则生效
新建文件缩进不生效?大概率是 detect_indentation 在捣鬼
哪怕你配好了 JavaScript.sublime-settings,只要 detect_indentation 是 true(默认值),Sublime 打开任何文件时都会扫描前 200 行,一看到有 \t 就强制把 translate_tabs_to_spaces 设为 false,你写的 true 直接被覆盖。
这个过程不报错、不提示,只在右下角悄悄显示 Tabs: 4 而不是 Spaces: 4。
- 必须在
Preferences → Settings(用户设置)里显式加一行:"detect_indentation": false
- 这行不加,所有语法专属设置都只是“临时有效”——手动转一次空格,下次打开旧文件又回退
- 关掉它之后,
tab_size和translate_tabs_to_spaces才真正起作用
怎么验证当前按 Tab 插入的是空格还是制表符?
光看缩进宽度没用,得确认实际字符。最直接的方法是开启空白符可视化:
- 在用户设置里加:
"draw_white_space": "all"
- 保存后,空格显示为小圆点(·),制表符显示为箭头(→)
- 按一次 Tab 键:如果出现四个 ·,说明
translate_tabs_to_spaces生效;如果出现一个 →,说明它被覆盖或设成了false
注意:这个设置只影响视觉,不影响行为。但它是唯一能一眼区分真假缩进的方式。
已存在文件缩进混乱,不能直接全选重缩进
Ctrl+A + Ctrl+[ 或 Reindent 会误处理字符串里的 \t、YAML 对齐空格、SQL 中的列对齐,甚至破坏正则表达式里的字面量制表符。
安全修复流程只有三步:
- 先确保右下角显示
Spaces: 4(不是Tabs: 4) - 执行
Convert Indentation → To Spaces(右键菜单或Ctrl+Shift+P输入)——这一步把所有缩进统一成空格 - 再执行
Indentation → Reindent,让 Sublime 按当前语法结构重新计算缩进层级
漏掉第一步,第二步就可能把注释块或模板字符串里的 \t 一起转掉,导致不可逆的格式错误。


















