必须关闭detect_indentation,否则它会静默覆盖tab_size和translate_tabs_to_spaces;Python等语言需在语法专属设置中显式配置tab_size和translate_tabs_to_spaces,并手动Reload Syntax生效。

Sublime Text 的 Tab 缩进体验差,根本不是设置没写对,而是 detect_indentation 在后台悄悄覆盖你的所有配置——关不掉它,其他操作全是临时生效。
为什么改了 tab_size 和 translate_tabs_to_spaces 还是插 \t
因为 detect_indentation 默认为 true,只要打开一个文件,Sublime 就扫描前几行:看到 \t 就切 Tab 模式,看到 2 空格就强行设 tab_size 为 2,右下角显示 Tab Width: 2 或 Detect Indentation,但不会告诉你它动了什么。这个行为发生在“视图级”,优先级高于用户设置、也高于语法设置。
- 验证方式:新建一个
Plain Text文件,按一次Tab,再开启"draw_white_space": "all",如果出现 → 而不是四个 ·,说明translate_tabs_to_spaces没生效或被覆盖 - 必须在
Preferences → Settings – User中显式添加:"detect_indentation": false - 只加
"tab_size": 4不开translate_tabs_to_spaces,Tab键照样插\t;只开translate_tabs_to_spaces不设tab_size,默认用 4,但可能被语法设置劫持
Python/JS 等语言缩进不听全局设置?去配语法专属配置
全局设置对 .py、.js、.json 文件基本无效,因为对应语言包自带 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 - 已打开的文件不会自动刷新,必须按
Ctrl+Shift+P输入Reload Syntax回车 - 同理,
.js文件要配JavaScript.sublime-settings,.yml配YAML.sublime-settings,拼错文件名(如写成Python3.sublime-settings)就不生效
已有文件缩进混乱,Convert Indentation to Spaces 灰掉了怎么办
菜单里该选项变灰,不是功能坏了,而是 Sublime 检测到混合缩进(Indentation: Mixed),主动拒绝转换——防止把字符串里的 \t 或对齐注释的空格一起误处理。
- 先开
"draw_white_space": "all",看清哪些行开头是 →(\t),哪些是 ·(空格) - 手动删掉前几行明显混搭的缩进(比如某行开头是 →·→),保存后再试命令
- 或临时把语法切为
Plain Text(右下角点击 → 选 Plain Text),再执行Convert Indentation → To Spaces - 转完后务必执行
Indentation → Reindent Lines,否则结构层级可能未对齐;别用Ctrl+A + Ctrl+],会错缩字符串和注释
EditorConfig 或 trim_automatic_white_space 暗中破坏缩进
项目根目录有 .editorconfig 且含 indent_style = tab,EditorConfig 插件会直接接管缩进逻辑,优先级高于所有 Sublime 自身设置;而 trim_automatic_white_space 默认开启,保存时会删每行末尾空格,对 YAML 表格、SQL 对齐、字典格式是灾难性的。
- 检查是否启用 EditorConfig:菜单
Preferences → Package Settings → EditorConfig → Settings,确认插件未强制覆盖 - 关闭自动删尾随空格:在用户设置或语法专属设置中加
"trim_automatic_white_space": false,或改用更可控的"trim_trailing_white_space_on_save": true - 旧文件里的
\t不会自动转——所有配置只影响新输入,历史字符得靠Convert Indentation → To Spaces手动触发
真正卡住人的从来不是“怎么设”,而是 detect_indentation 的静默覆盖、语法设置的隐式优先级、以及混合缩进时的保护机制——它们不报错、不弹窗,只让你反复怀疑自己是不是按错了键。


















