答案是detect_indentation默认为true,会自动检测文件首行缩进并覆盖用户设置;必须在用户设置中显式添加"detect_indentation": false,再配合"tab_size": 4和"translate_tabs_to_spaces": true,并手动reload syntax或convert indentation to spaces才能生效。

为什么改了设置,Tab 还是插 \t?
因为 translate_tabs_to_spaces 只控制「新输入行为」,不改变已有文件里的 \t。哪怕你加了 "translate_tabs_to_spaces": true 和 "tab_size": 4,打开一个老 .py 文件,按 Tab 键可能还是插 \t——那是因为 Sublime 检测到文件前几行有 \t,自动启用了 detect_indentation(默认为 true),直接覆盖你的设置。
实操建议:
- 在用户设置里显式关掉它:
"detect_indentation": false - 检查右下角状态栏是否显示
Tabs: 4;如果是,点它 → 选Convert Indentation to Spaces,强制切过去 - 确认没被
.editorconfig劫持:如果项目根目录有该文件,且含indent_style = tab,EditorConfig 插件会无视所有 Sublime 设置
Convert Indentation to Spaces 为什么没反应?
这个菜单命令(View → Indentation → Convert Indentation to Spaces)只处理「当前视图的行首缩进」,而且换算严格依赖当前 tab_size 值。常见失效场景:
- 当前文件
tab_size是 2,但原始 \t 实际占 4 列宽 → 转出来缩进错位 - 文件混用 \t 和空格缩进 → 转换后嵌套结构塌陷(尤其 Python 的
if/for块) - 右下角显示
Tabs: 8或Spaces: 2→ 表明已被.editorconfig锁死,此时命令无效
安全做法:先点右下角 Tab Width: X → 选 Indent Using Spaces → 再设目标宽度(如 4)→ 最后执行转换。
怎么批量处理整个 src/ 目录下的 .py 文件?
Sublime 原生不支持跨文件批量缩进转换。靠菜单或命令面板一次只能处理一个文件,选中多个标签页也无用。
真正可行的批量方案只有命令行:
- Linux/macOS:
find src/ -name "*.py" -exec sed -i 's/^\t/ /g' {} \;(仅替换行首单个 \t,不推荐) - 更稳妥用
expand(POSIX 标准工具):find src/ -name "*.py" -exec expand -t 4 {} \; -exec mv {} {}.tmp \; -exec mv {}.tmp {} \; - Python 脚本更可控:
python3 -c "import pathlib; [p.write_text(p.read_text().replace('\t', ' ')) for p in pathlib.Path('src').rglob('*.py')]"(注意:这会无差别替换所有 \t,慎用)
⚠️ 关键提醒:任何批量替换都必须先 git add -N 查看变更预览,避免破坏缩进语义。
语法专属设置和 Project Settings 怎么不冲突?
Sublime 的缩进规则优先级是:Project Settings > Syntax Specific > User Settings。比如你在全局开了 translate_tabs_to_spaces,但打开 .yaml 文件发现 Tab 还是 \t,大概率是 YAML.sublime-settings 里没配,或配成了 false。
排查路径:
- 打开目标文件 →
Preferences → Settings – Syntax Specific - 右侧粘贴和用户设置一致的内容:
"tab_size": 2,"translate_tabs_to_spaces": true - 若项目有
.sublime-project,检查其中"settings"下是否覆盖了缩进项
EditorConfig 插件一旦启用,它的配置优先级高于所有 Sublime 设置——这点最容易被忽略。











