必须关闭 detect_indentation 并设 translate_tabs_to_spaces 为 true,否则 tab_size: 8 无效;语法专属设置优先级高于全局,需在对应语言设置中配置;EditorConfig 和 trim_automatic_whitespace 也会干扰缩进行为。

直接改 tab_size 到 8 不够,必须同步关掉 detect_indentation 并确保 translate_tabs_to_spaces 为 true,否则打开文件瞬间就被覆盖回默认行为。
为什么设了 tab_size: 8 还是插 \t 或缩进错乱
Sublime 默认开启 detect_indentation,一打开文件就扫描前几行——只要发现任意行首有 \t 或 2/4 空格,立刻把你的 tab_size: 8 和 translate_tabs_to_spaces: true 全部覆盖。右下角显示 Tab Width: 8 ≠ 实际用了 8 个空格,它可能只是在显示一个被自动探测出来的宽度,而输入行为仍是 \t。
-
translate_tabs_to_spaces必须为true(布尔值,别加引号),否则按 Tab 键永远只输出单个\t字符 -
tab_size只在translate_tabs_to_spaces为true时生效,决定按 Tab 键插入几个空格 -
detect_indentation必须显式设为false,否则所有设置对已有文件都只是“临时有效”
Python / JS 等文件不认全局设置?去语法专属配置里改
全局用户设置对 .py、.js、.json 文件基本无效,因为语言包自带的 Python.sublime-settings 等文件硬编码了 "tab_size": 2 和 "translate_tabs_to_spaces": false,优先级更高。
- 先打开一个
.py文件,再点菜单Preferences → Settings – Syntax Specific - 在右侧 JSON 中只添加两行(不要删原有注释或配置):
"tab_size": 8和"translate_tabs_to_spaces": true - 已打开的文件需手动执行
Ctrl+Shift+P→ 输入Reload Syntax回车才生效 - 同理处理其他语言:JavaScript、JSON、Vue 等都要各自进对应
Settings – Syntax Specific
Convert Indentation to Spaces 菜单项灰掉?说明检测到混合缩进
这个菜单项变灰不是功能损坏,而是 Sublime 主动拒绝操作——它发现当前文件里既有 \t 开头的行,也有空格开头的行,强行转换会导致 Python 缩进错误或结构塌陷。
- 先开空白符可视化:
View → Whitespaces → Show Whitespaces(或加"draw_white_space": "all"到用户设置),让\t显示为→,空格显示为· - 手动删掉前几行明显混用的缩进(比如某行开头是
→·→) - 保存后重试;或临时切语法为
Plain Text(右下角点击 → 选 Plain Text),再执行转换 - 转完务必执行
View → Indentation → Reindent Lines,否则嵌套层级可能未对齐
注意 EditorConfig 和 trim_automatic_white_space 的干扰
如果项目根目录有 .editorconfig,且含 indent_style = tab 或 tab_width = 4,EditorConfig 插件会直接劫持缩进逻辑,优先级高于所有 Sublime 设置。另外,trim_automatic_white_space 默认为 true,保存时会悄悄删掉行尾空格——这对靠空格对齐的 YAML、SQL 或多行字典格式是灾难性的。
- 检查右下角是否显示
EditorConfig,若显示且宽度不符,先确认.editorconfig内容 - 在用户设置中加
"trim_automatic_white_space": false,或更稳妥地,在语法专属设置中只为 YAML/Markdown 单独关闭 - 批量处理整个目录?Sublime 原生不支持。真要批量,用命令行
expand -t 8或 Python 脚本,但必须先git add -N预览变更,避免破坏语义


















