必须关闭editor.detectindentation并用准确语言id配置,否则tabsize设置会被自动探测覆盖或格式化工具接管;右下角状态栏可临时调试,但稳定生效需三者同时到位。

VSCode 默认不会为不同文件类型自动区分缩进,必须手动关闭自动探测、用准确语言 ID 配置、并协调格式化工具,否则你设的 editor.tabSize 很可能被绕过或覆盖。
为什么关掉 editor.detectIndentation 是第一步
VSCode 打开文件时会扫描前几行,看到 4 个空格就悄悄把 editor.tabSize 改成 4,看到 Tab 就切到 editor.insertSpaces: false——这个行为在混用 Python(4 空格)和 JSON(2 空格)的项目里几乎必然出问题。
- 它优先级高于你在
"[python]"块里写的配置,哪怕你写了"editor.tabSize": 4,打开一个老 JSON 文件仍可能被重置为 2 - 必须在每个语言块里显式写
"editor.detectIndentation": false,全局设置无效 - 不关它,
"[json]": { "editor.tabSize": 2 }这种配置大概率只在新建文件里生效
语言 ID 写错等于没配:确认 python 不是 py,json 不是 jsonc
右下角状态栏点一下当前语言名,弹出菜单第一行显示的就是真实 ID。VSCode 只认官方定义的 ID,拼错或用扩展名替代全无效。
- 常见正确 ID:
python、javascript、typescript、json、html、css、markdown -
jsonc是带注释的 JSON,如果你没在files.associations里把.json显式关联给jsonc,就该用json -
.vue文件的<script></script>块实际生效的是javascript或typescript,不是vue
Prettier 正在偷偷改缩进:要么统一配置,要么禁用接管
一旦你装了 esbenp.prettier-vscode 并设为默认格式化器,editor.tabSize 就基本失效。Prettier 的 tabWidth 配置直接接管整份文件的缩进风格。
- 检查
settings.json是否有类似"[json]": { "editor.defaultFormatter": "esbenp.prettier-vscode" }的配置 - 想让它听你的,就在项目根目录加
.prettierrc,写{"tabWidth": 2}或{"tabWidth": 4},和语言设置对齐 - 不想让 Prettier 动 Python 缩进?在
"[python]"块里加"editor.defaultFormatter": null
临时调试别改 settings.json:状态栏点一点就生效
写代码中途发现缩进不对,不用翻配置文件。右下角状态栏就是最直接的调试入口。
- 点击
Spaces: 4或Tab Size: 2区域,可快速切换当前文件的缩进大小或字符类型 - 选
Convert Indentation to Spaces能把全文 Tab 替换成空格,再点数字设成 4,立刻统一 - 这个操作只影响当前编辑器实例,关掉再打开文件,还是会读取语言配置或重新检测——所以它只是临时手段,不能替代正确配置
真正稳定生效的关键,是三件事同时到位:语言 ID 准确、editor.detectIndentation 关闭、格式化工具不冲突。漏掉任意一个,缩进就会在某个时间点突然“变回原样”。











