必须关闭detect_indentation并配置tab_size和translate_tabs_to_spaces,否则打开文件时缩进会被自动覆盖;语法专属设置优先级高于全局设置,已打开文件需手动重载语法才能生效。

不能一键改完就永久生效,必须关掉 detect_indentation,再配 tab_size 和 translate_tabs_to_spaces,否则每次打开文件都会被自动覆盖。
为什么点几下没反应?因为 detect_indentation 在偷偷接管
Sublime 默认开启 detect_indentation,一打开文件就扫描前几行,立刻把你的 tab_size 改成它“猜”的值——比如看到开头有 2 个空格,右下角马上显示 Spaces: 2,哪怕你用户设置里写的是 4。这不是 bug,是默认行为。
- 检查右下角状态栏是否显示
Detect Indentation;如果是,说明它正在抢控制权 - 必须在
Preferences → Settings – User中显式加一行:"detect_indentation": false - 改完不重启、不新建文件也能生效,但已打开的文件需手动触发
Reload Syntax(Ctrl+Shift+P输入)
Tab 键插的是空格还是制表符?只看 translate_tabs_to_spaces
tab_size 只决定“显示宽度”,真正决定按 Tab 键插入什么的,是 translate_tabs_to_spaces。设为 true 才插空格,设为 false 就插真实 \t 字符——后者极易和空格混用,Git diff 乱、CI 报错、Python 直接抛 IndentationError。
- 绝大多数项目(PEP 8、ESLint、Airbnb 等)要求用空格,所以几乎总该设
"translate_tabs_to_spaces": true - 只设
"tab_size": 4不开这个,按 Tab 还是插\t,状态栏可能显示Tab Width: 4,但实际字符不是空格 - 验证方法:
Ctrl+Shift+P→ 输入Show Whitespaces,看到·是空格,→是\t
不同语言缩进不同,得单独配 Syntax Specific 设置
全局 Settings – User 对 .py、.js 这类文件基本无效,因为 Python 语言包自带 Python.sublime-settings,里面硬编码了 "tab_size": 2 和 "translate_tabs_to_spaces": false,优先级更高。
- 操作路径:先打开一个
.py文件 → 菜单Preferences → Settings – Syntax Specific(菜单仅在有语法识别时出现) - 右侧 JSON 中只加两行:
"tab_size": 4和"translate_tabs_to_spaces": true,别删原有内容 - 注意大小写:
Python不是python,JavaScript不是javascript - 已打开的文件不会自动刷新,必须
Ctrl+Shift+P→Reload Syntax才生效
已有代码缩进混乱,不能 Ctrl+A 就 Convert
直接全选 + Convert Indentation to Spaces 很危险:它会把字符串里的 \t、注释对齐用的空格也转掉,破坏语义。安全做法是分两步走。
- 先确认右下角显示
Spaces: 4(不是Tab Width: 4),再执行转换 - 如果
Convert Indentation菜单项灰掉,说明检测到混合缩进——手动删掉前几行开头的\t或多余空格,再试 - 转换完立刻执行
Indentation: Reindent(Ctrl+Shift+P输入),让 Sublime 按语法结构重排缩进 - 顺手加
"draw_white_space": "all"到用户设置,一眼看出哪是空格、哪是\t
真正容易被忽略的不是怎么设,而是 detect_indentation 默认开着、语法专属设置优先级更高、以及已有文件不会自动响应配置变更——这三件事不处理,所有设置都只是临时有效。











