sublime text 中 tab 键默认插入 \t 而非空格,需将 translate_tabs_to_spaces 设为 true 并配合 tab_size 和 detect_indentation: false 才能统一使用 4 空格缩进。

Sublime Text 里按 Tab 键默认插入 \t,不是空格——哪怕右下角显示 Tab Width: 4,那也只表示“制表位宽度为 4”,不等于用了 4 个空格。要真正统一缩进,必须同时控制「输入行为」和「已有内容转换」,否则 PEP 8、ESLint、Black 都会报错。
为什么改了 tab_size 还是插出 \t?
根本原因是 translate_tabs_to_spaces 默认为 false。这个开关不打开,tab_size 就只是个显示参数,对按键输入完全没影响。
-
translate_tabs_to_spaces必须设为true(布尔值,别加引号) - 它只管“未来输入”:新敲的 Tab、自动缩进、代码折叠展开时的缩进
- 它不管粘贴进来的内容——粘贴的
\t会原样保留 - 如果只设
tab_size不设这个,右下角可能显示Spaces: 4,但实际插入的仍是\t
怎么让 Python 文件强制用 4 空格?
全局设置对 .py 文件基本无效,因为 Python 插件自带硬编码的 "tab_size": 2 和 "translate_tabs_to_spaces": false。必须进语法专属设置。
- 打开一个
.py文件 →Preferences → Settings – Syntax Specific - 在右侧添加两行(别删原有内容):
"tab_size": 4,<br>"translate_tabs_to_spaces": true
- 关键补一刀:
"detect_indentation": false—— 否则一打开旧文件,Sublime 就扫描前 200 行,发现有\t就立刻切回 Tab 模式 - 已打开的文件需手动执行
Ctrl+Shift+P→Reload Syntax才生效
已有混用缩进的文件怎么安全批量转?
Convert Indentation to Spaces 不是万能替换,它只处理行首缩进,且依赖当前视图的 tab_size 设置。混用时直接调用常失败。
- 先确认右下角状态栏显示的是目标缩进类型,比如
Spaces: 4;如果是Tab,点它 →Convert Indentation to Spaces - 若菜单灰掉,说明 Sublime 检测到混合缩进(部分行是
\t,部分是空格),得手动删掉几行开头的\t再试 - 转完后,再执行
Ctrl+Shift+P→Indentation: Reindent Lines,它才按当前tab_size和translate_tabs_to_spaces重新计算整篇缩进层级 - 顺手开
"draw_white_space": "all",让\t显示为→、空格显示为·,一眼揪出混用
哪些地方会静默覆盖你的设置?
优先级从高到低是:文件内注释(如 # indent: 2) > 项目级 .editorconfig > 语法专属设置 > 全局用户设置。只要其中任一环存在,你的配置就可能失效。
- 检查项目根目录有没有
.editorconfig;如果有,里面indent_style = tab会直接压倒所有 Sublime 设置 - 某些语法(如
Makefile)强制用\t,即使你设了translate_tabs_to_spaces: true,它也会无视 - 插件如
EditorConfig或SublimeLinter可能劫持缩进逻辑,临时禁用它们测试是否恢复正常 - 新建
Plain Text文件测试 Tab 键行为,如果这时变空格了,说明问题出在语法绑定或插件上
最容易被忽略的是 detect_indentation 的默认行为——它不关掉,编辑器永远在“猜”你想用什么缩进,而不是听你的。所有语法专属设置里,这行都该和 translate_tabs_to_spaces 一起出现。











