必须同时设置tab_size、translate_tabs_to_spaces并关闭detect_indentation,否则按Tab键插入\t而非空格;tab_size仅控制显示宽度、自动缩进级宽和转换命令的替换数量,不决定Tab键输出;translate_tabs_to_spaces才控制Tab键插入空格还是\t;Python等语法包会覆盖全局设置,需用Settings–Syntax Specific单独配置;detect_indentation默认启用会静默覆盖所有缩进配置,必须手动禁用。

必须同时设置 tab_size、translate_tabs_to_spaces 并关闭 detect_indentation,否则按 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,等于什么都没改。
为什么 Python 文件设了全局设置还是 2 空格
因为 Python 语言包自带的 Python.sublime-settings 会硬编码 "tab_size": 2 和 "translate_tabs_to_spaces": false,优先级高于用户设置。
操作路径必须是:
- 先打开一个
.py文件,确保右下角显示 “Python” - 菜单 →
Preferences → Settings – Syntax Specific(注意不是普通 Settings) - 右侧 JSON 中只添加两行:
"tab_size": 4和"translate_tabs_to_spaces": true,不要删原有内容 - 已打开的文件需手动
Ctrl+Shift+P→ 输入Reload Syntax才刷新
JavaScript、JSON、HTML、Vue 等同理,各自进对应 Settings – Syntax Specific 配置。
为什么刚打开文件缩进就“自己变了”
因为 detect_indentation 默认为 true,Sublime 会在加载文件时扫描前几行,强行覆盖你所有缩进配置——哪怕文件是空的,也可能根据模板或历史残留误判。
这是设计行为,不是 bug。现象包括:
- 新建文件按预期插 4 空格,但打开旧
.py文件后右下角突然变成Tab Width: 2 - 改完设置重启软件,问题依旧
解决办法:
- 在
Preferences → Settings – User中加:"detect_indentation": false - 语法专属设置里也建议加这一项,避免新建文件时被干扰
- 已有文件需关闭再重开,或执行
Reload Syntax
已有文件缩进混乱怎么安全转成 4 空格
直接 Ctrl+A + Convert Indentation to Spaces 容易误伤字符串里的 \t 或注释对齐,导致语法错误。
推荐流程:
- 先开启可视化:
"draw_white_space": "all"(加到用户设置),让\t显示为 →,空格显示为 · - 如果
Convert Indentation to Spaces菜单项灰掉,说明检测到混合缩进;手动删掉前几行异常开头(比如 →·→),保存后再试 - 确认右下角显示
Spaces: 4后,再执行该命令 - 最后补一步:
View → Indentation → Reindent,让结构按当前规则重排层级
真正起作用的从来不是单个参数,而是 tab_size、translate_tabs_to_spaces、detect_indentation 三者协同;而最容易被绕过、又最难察觉的,就是 detect_indentation 那个静默接管。











