必须同时设置"tab_size":4、"translate_tabs_to_spaces":true并关闭"detect_indentation":false,否则tab键仍插入\t;因tab_size仅控制显示宽度和转换比例,真正决定按键输出的是translate_tabs_to_spaces,且语法专属设置优先级更高。

Sublime Text 默认按 Tab 键插入的是制表符 \t,不是空格;要让它真正输出 4 个空格,必须同时满足三个条件:启用空格转换、设对缩进宽度、关掉自动检测——缺一不可。
为什么只改 tab_size 没用?
tab_size 本身不控制按键行为,它只决定:
• 制表符在编辑器里的显示宽度
• 执行 Convert Indentation to Spaces 时的换算比例(比如一个 \t 换成几个空格)
• 自动缩进时每级缩进占多少列
真正让 Tab 键输出空格的是 translate_tabs_to_spaces:
• "translate_tabs_to_spaces": true → 按 Tab 插入 tab_size 个空格
• "translate_tabs_to_spaces": false(默认值之一)→ 按 Tab 插入单个 \t,哪怕 tab_size 是 100 也无效
所以只写 "tab_size": 4,等于什么都没改。
必须关闭 detect_indentation
Sublime 在打开文件时会扫描前几行,自动推断缩进类型和宽度,并覆盖你设的所有缩进配置。这是设计行为,不是 bug。
现象:
• 新建文件按预期插 4 空格,但打开旧 .py 文件后右下角突然变成 Tab Width: 2 或 Indentation: Tab
• 改完设置重启软件,问题依旧
解决办法:
• 在 Preferences → Settings – User 中添加:"detect_indentation": false
• 已打开的文件需手动关闭再重开,或执行 Ctrl+Shift+P → Reload Syntax
Python/JavaScript 等语法必须单独配 Syntax Specific
全局用户设置对 .py、.js、.json 等文件基本无效——因为语言包自带的 Python.sublime-settings 等优先级更高,里面通常硬编码了:
• "tab_size": 2
• "translate_tabs_to_spaces": false
操作路径:
• Preferences → Settings – Syntax Specific(注意不是普通 Settings)
• 在弹出的 JSON 中只加两行:"tab_size": 4 和 "translate_tabs_to_spaces": true
• 不要删原有配置,只补这两项
• 已打开的文件需 Ctrl+Shift+P → Reload Syntax 才生效
其他语言同理:
• JavaScript → 进 Preferences → Package Settings → JavaScript → Settings – Syntax Specific
• JSON/HTML/Vue 同样需各自检查并同步配置
已有文件缩进混乱怎么修?
直接全选 + 缩进命令容易误伤字符串里的 \t 或注释对齐位置。
安全顺序:
• 确认右下角显示 Spaces: 4(不是 Tab)
• 执行 Convert Indentation → To Spaces(菜单:View → Indentation → Convert Indentation to Spaces)
• 再执行 Indentation → Reindent(它会按当前 tab_size 和 translate_tabs_to_spaces 重新计算整篇结构)
• 若文件来自 Windows,顺手做一次 Convert Line Endings → Unix,避免 CRLF 干扰缩进判断
顺手开启 "draw_white_space": "all",让空格显示为 ·、\t 显示为 →,一眼识别混用。
最常被忽略的是三者协同:语法专属设置决定“谁说了算”,detect_indentation 决定“它会不会临时篡改”,而 translate_tabs_to_spaces 和 tab_size 必须在同一层级、同一文件里成对出现——少一个,就白配。











