必须关闭detect_indentation,否则它会自动覆盖tab_size和translate_tabs_to_spaces设置;需在用户设置中显式添加"detect_indentation": false、"translate_tabs_to_spaces": true和"tab_size": 4,并在语法专属设置中为python等语言单独配置,再手动reload syntax生效。

Sublime Text 里按 Tab 键插不出空格,不是配置写错了,而是 detect_indentation 默认开启,它会扫描文件前几行、自动覆盖你设的 tab_size 和 translate_tabs_to_spaces —— 这个行为不报错、不提示,只在右下角默默显示 “Tabs: 4” 或 “Detect Indentation”,让你以为改成功了。
为什么改了 tab_size 和 translate_tabs_to_spaces 还是插 \t
根本原因就一个:detect_indentation 默认为 true,它优先级最高。只要打开的文件前几行有制表符或非预期空格数(比如旧 Python 文件开头是 2 空格),Sublime 就立刻切回对应模式,无视你的用户设置。
- 必须在
Preferences → Settings – User中显式添加"detect_indentation": false -
"translate_tabs_to_spaces": true是开关,决定按 Tab 插入的是空格还是\t;"tab_size": 4只定义“等效宽度”,不控制插入内容 - 只设
tab_size不开translate_tabs_to_spaces,按 Tab 还是插\t;只开translate_tabs_to_spaces不设tab_size,默认用 4,但可能被其他层覆盖 - 验证是否生效:打开新
Plain Text文件,按一次 Tab,再开"draw_white_space": "all",看出现的是四个·还是一个→
Python/JS 等语言缩进还是不对?去语法专属设置改
全局设置对 .py 文件基本无效,因为 Python 语言包自带 Python.sublime-settings,里面硬写了 "tab_size": 2 和 "translate_tabs_to_spaces": false,优先级高于用户设置。
- 先打开一个
.py文件,确认右下角显示的是Python,不是Plain Text - 菜单 →
Preferences → Settings – Syntax Specific,右侧 JSON 中只加两行:"tab_size": 4和"translate_tabs_to_spaces": true - 已打开的
.py文件需手动执行Ctrl+Shift+P→ 输入Reload Syntax才刷新 - JavaScript、JSON、YAML 同理,各自进对应的
Settings – Syntax Specific配置,不能指望全局一刀切
已有文件缩进混乱,怎么安全转成 4 空格
所有配置只影响“新输入”,不会动已有字符。混用 \t 和空格的文件,直接调 Convert Indentation to Spaces 可能灰掉——那是 Sublime 检测到混合缩进,拒绝误操作。
- 先确保当前视图右下角显示
Spaces: 4(点开确认,不是Tabs: 4) - 执行
View → Indentation → Convert Indentation to Spaces;若菜单灰掉,手动删掉几行开头的\t再试 - 转换完再执行
View → Indentation → Reindent Lines,让整篇结构按当前tab_size重新对齐 - 顺手加
"draw_white_space": "all"到用户设置,·是空格,→是\t,一眼识别混用
真正容易被忽略的是优先级链:文件内注释(如 # indent: 2) > 项目级 .editorconfig(需插件支持) > 语法专属设置 > 全局设置。任何一环存在,都可能让 tab_size 和 translate_tabs_to_spaces 静默失效。











