必须关闭 detect_indentation 才能让 tab_size 和 translate_tabs_to_spaces 生效,否则它会静默覆盖设置;再为每种语言单独配置语法专属设置。

Sublime Text 的 Tab 缩进不是改一个配置就能统一的,必须同时控制 tab_size、translate_tabs_to_spaces 和 detect_indentation 三个参数,否则新开文件、切换语法、打开旧项目时缩进会“自己变”——你完全感知不到它在偷偷覆盖设置。
为什么改了 Settings – User 还是按 Tab 插入 \t?
根本原因是 detect_indentation 默认为 true,它会在你打开任何文件的瞬间扫描前几行,强行把 tab_size 和 translate_tabs_to_spaces 改成“它猜的值”。比如你打开一个用 2 空格缩进的 .py 文件,右下角立刻显示 Tab Width: 2,哪怕你用户设置里写的是 4。
- 这个覆盖发生在“视图级”,优先级高于用户设置,也高于语法专属设置
- 不会弹窗提醒,也不会修改你的配置文件
- 关掉它的唯一办法是在
Preferences → Settings – User中显式加一行:"detect_indentation": false
Python 文件缩进还是 2 空格?去改 Python.sublime-settings
全局设置对 .py 文件基本无效,因为 Python 语言包自带 Python.sublime-settings,里面硬编码了 "tab_size": 2 和 "translate_tabs_to_spaces": false。你改了全局,它照旧按自己的来。
- 操作路径:打开任意
.py文件 → 右下角点击语法名(如“Python”)→ 选Open Syntax Specific Preferences - 在弹出的 JSON 中只保留这两项:
"tab_size": 4和"translate_tabs_to_spaces": true - 已打开的
.py文件不会自动刷新,要按Ctrl+Shift+P输入Reload Syntax才生效
Convert Indentation to Spaces 灰掉了怎么办?
菜单里 Convert Indentation → Convert to Spaces 灰掉,不是功能损坏,而是 Sublime 检测到当前文件存在混合缩进(部分行用 \t,部分用空格),它主动拒绝自动转换,防止错位。
- 先开启空白字符可视化:
View → Whitespaces → Show Whitespaces(或设"draw_white_space": "all"),让\t显示为 →,空格显示为 · - 手动删掉前几行明显混搭的缩进(比如某行开头是 →·→)
- 保存后重试命令;或临时切语法为
Plain Text(右下角点击 → 选Plain Text),再执行转换 - 转完后务必执行
Indentation → Reindent,否则缩进层级可能未对齐
不同语言要用不同缩进数(比如 JS 用 2、Python 用 4)怎么配?
不能只靠全局设置。Sublime 的语法专属设置(Syntax Specific Settings)优先级最高,必须为每种语言单独配。
- 打开一个
.js文件 →Preferences → Settings – Syntax Specific→ 右侧加:{"tab_size": 2, "translate_tabs_to_spaces": true} - 同理,对
.py文件做一次,右侧加:{"tab_size": 4, "translate_tabs_to_spaces": true} - 文件名必须严格匹配:
JavaScript.sublime-settings、Python.sublime-settings——拼错一个字母就不生效
最容易被忽略的是 detect_indentation 的静默覆盖行为:它不报错、不提示,只是让所有其他缩进配置变成“纸面有效”。关掉它,才是让 tab_size 和 translate_tabs_to_spaces 真正起效的第一步。


















