sublime的detect_indentation默认为true,但仅首次打开时扫描前200行,若首行缩进是tab则强制设translate_tabs_to_spaces为false,且不重试;需禁用自动检测或手动触发重检测。

Sublime 的 detect_indentation 默认开,但根本不管用?
不是它失效,而是你没让它“真正生效”。detect_indentation 默认为 true,但它只在文件**首次打开时扫描前 200 行**,一旦发现首行缩进是 \t,就立刻把 translate_tabs_to_spaces 设为 false,把你用户设置里写的 true 直接覆盖掉。更麻烦的是:这个判断只做一次,关了再开也不会重试——除非你手动触发或关掉自动检测。
常见错误现象:
- 右下角显示
Tab Width: 8或Spaces: 2,但你明明在用户设置里写了"tab_size": 4和"translate_tabs_to_spaces": true - 新建一个
.py文件,按 Tab 插入的是\t,不是 4 个空格 - 从命令行用
subl script.py打开,缩进行为和你在 GUI 里点开的不一致
解决方法不是“再试一次”,而是明确切断干扰链:
-
"detect_indentation": false必须加到用户设置(Preferences → Settings – User),否则其他配置全是临时的 - 如果项目根目录有
.editorconfig,且含indent_style = tab,EditorConfig 插件会优先接管,detect_indentation彻底失效 - 当前语法(如 Python)的专属设置(
Preferences → Settings – Syntax Specific)若没显式写"translate_tabs_to_spaces": true,语言包会 fallback 到默认 Tab
混合缩进已存在,Convert Indentation → To Spaces 灰掉了?
灰掉不是菜单坏了,是 Sublime 主动拒绝操作——它在状态栏提示 Mixed indentation detected 时,就会禁用所有自动转换命令。这不是 bug,是保护机制:混用空格和 Tab 的文件,强行转可能让缩进层级错乱(尤其 Python 中缩进=语法)。
必须先手动清理“污染源”:
- 打开
View → Whitespaces → Show Whitespaces(或设"draw_white_space": "all"),看清哪些是·(空格)、哪些是→(Tab) - 选中几行明显以
→开头的代码,Backspace 删除开头的 Tab,换成空格对齐(可用 Ctrl+Shift+P →Indentation: Convert to Spaces单独试这几行) - 再全选(Ctrl+A),右键 →
Convert Indentation → To Spaces就能亮了
注意:trim_automatic_whitespace 默认为 true,保存时会删行尾空格——如果你靠空格对齐 YAML 的 key: value 或 Markdown 表格,它会悄悄破坏结构。建议在用户设置里加 "trim_automatic_whitespace": false,或只在特定语法设置中关闭。
想保留自动检测,又不让它“自作主张”?
可以,但得接受它的局限性:detect_indentation 是启发式猜测,不是规则引擎。它只看文件开头,不读语义;遇到注释块、BOM、或实际代码从第 50 行才开始,就直接误判。
真要“智能适配”,得配合外部规范:
- 在项目根目录放
.editorconfig,写明indent_style = space和indent_size = 4,EditorConfig 插件会强制覆盖 Sublime 原生检测结果 - 用命令面板(Ctrl+Shift+P)搜
Set Syntax and Indentation,手动触发一次重检测——这比关掉再重开文件更快 - 绑定快捷键触发检测命令:
{"keys": ["ctrl+alt+i"], "command": "detect_indentation"},加到Key Bindings – User
但记住:检测结果只影响新输入和自动缩进,已有 \t 字符一个不动。转换仍需手动执行,且 Git diff 会因缩进变更整行标红——批量处理前务必提交快照。
为什么 Python 文件总回退到 2 空格?
不是 Sublime 抽风,是 Python 语法包自带的 Python.sublime-settings 没被你覆盖。它的默认行为是 fallback 到 Tab,且很多旧版 Python 包硬编码了 tab_size: 2。
必须三处同步设死:
- 用户设置(全局):
"tab_size": 4,"translate_tabs_to_spaces": true,"detect_indentation": false - Python 专属设置(
Preferences → Settings – Syntax Specific):同样三行,一模一样 - 项目设置(
Project → Edit Project):如果项目有特殊要求,这里再加一层保险
改完不用重启,但已打开的 Python 文件要按 Ctrl+Shift+P → Reload Syntax 才生效。最常被忽略的一点:右下角语法名(如 “Python”)点击后选 Open Syntax Specific Preferences,弹出的才是真正的 Python 设置文件——很多人改错了地方,去改了 Plain Text 的设置。











