关闭 detect_indentation 才能确保 translate_tabs_to_spaces 生效,因 sublime 默认自动检测前200行缩进并强制覆盖设置;需在用户配置中同时设 tab_size、translate_tabs_to_spaces 和 detect_indentation 三项,且语言专属设置优先级更高。

按 Tab 键仍插入 \t 字符,不是设置漏了,而是 Sublime 默认开启自动检测,一打开文件就覆盖你的配置——关掉 detect_indentation 才是关键第一步。
为什么改了 translate_tabs_to_spaces 还是插 \t?
根本原因是 detect_indentation 默认为 true。它会在打开文件时扫描前 200 行,只要发现任意行首有 \t,就立刻把 translate_tabs_to_spaces 强制设为 false,并忽略你用户设置里的 true。
- 这个行为静默发生,不提示、不报错、不修改你的配置文件
- 哪怕你在
Python.sublime-settings里写了"translate_tabs_to_spaces": true,只要文件第一行缩进是\t,照样失效 - 临时验证方法:新建一个
Plain Text文件,敲Tab,如果出空格,说明全局配置生效;如果还是\t,检查是否漏了detect_indentation
全局设置必须配齐这三项
只设 tab_size 或只开 translate_tabs_to_spaces 都不够。三者缺一不可,且必须写在 Preferences → Settings – User 中:
-
"tab_size": 4—— 指定一个缩进层级等于几个空格(Python 用 4,YAML/JSON 常用 2) -
"translate_tabs_to_spaces": true—— 开关,控制Tab键是否输出空格(布尔值,别加引号) -
"detect_indentation": false—— 关闭自动检测,防止被文件历史缩进覆盖
保存后,所有新打开或新建的文件(如 .env、.gitignore)立即按此规则响应 Tab 键。
Python / JavaScript 等语言文件为啥不生效?
因为语言包自带语法专属设置,优先级高于全局配置。例如 Python 插件默认硬编码了 "tab_size": 2 和 "translate_tabs_to_spaces": false,会直接压倒你的用户设置。
- 打开一个
.py文件 → 点右下角Python→Open Syntax Specific Preferences - 在弹出的
Python.sublime-settings中只写这两行(别删原有注释):"tab_size": 4和"translate_tabs_to_spaces": true - 已打开的
.py文件不会自动刷新,需手动执行Ctrl+Shift+P→ 输入Reload Syntax回车 - 同理处理
.js、.json、.vue等,各自进对应Settings – Syntax Specific
已有文件缩进混乱,怎么安全转成空格?
translate_tabs_to_spaces 只影响新输入,不改已有内容。状态栏显示 Tabs: 4 ≠ 已用空格,只是“当前视图缩进宽度为 4”,类型可能是 \t 或空格——得点开确认是 Spaces: 4 才算真正统一。
- 先确保文件已正确识别语法(右下角显示
Python,不是Plain Text;点它可手动切换) - 执行
Ctrl+Shift+P→ 输入Convert Indentation to Spaces回车 —— 它只处理行首缩进,不碰字符串或注释里的\t - 如果菜单灰掉,说明 Sublime 检测到混合缩进(部分行用
\t,部分用空格),需手动删掉几行开头的\t再试 - 转换后,再执行
Indentation: Reindent Lines,它才按当前tab_size和translate_tabs_to_spaces重新计算整篇缩进层级
最容易被忽略的是优先级链:# indent: 2 注释 > .editorconfig > 语法专属设置 > 全局设置。只要其中任一环存在,你的配置就可能静默失效——别只盯着 Settings – User 改。











