全局设置未生效是因为python语言专属配置未启用,必须将tabsize和insertspaces置于"[python]"块内,并关闭detectindentation;其他语言同理,且缩进与格式化是两套独立系统。

为什么全局设置改了,Python 还是 2 空格?
因为 editor.tabSize 和 editor.insertSpaces 写在 settings.json 根层级时,是全局默认值,但会被语言专属设置覆盖——而 Python 默认没开专属配置,所以它其实用的是 VSCode 内置的 fallback 规则(通常是 2 空格)。你看到的“没生效”,本质是没启用语言作用域。
真正起效的方式只有一种:把缩进配置包进 "[python]" 块里。其他语言同理,比如 "[javascript]"、"[html]"。
- 语言 ID 必须准确:不是
.py,而是python;不是.vue,而是vue([vue]可单独设,但 template 部分实际走[html],script 走[javascript]) - 别漏掉
"editor.detectIndentation": false:否则 VSCode 会读你文件第一行的缩进,强行覆盖你的配置 - 如果右下角状态栏显示 “Plain Text”,说明文件没被识别为对应语言,缩进配置压根不加载
怎么快速给当前语言加专属缩进?
不用手写 JSON,VSCode 提供了零出错路径:
- 打开一个
.py文件 → 按Ctrl+Shift+P(Win/Linux)或Cmd+Shift+P(macOS)→ 输入并选择Preferences: Configure Language Specific Settings - 在弹出列表里选
Python→ 右侧设置面板直接搜tab size,填4;搜insert spaces,勾上 - 保存后,VSCode 自动在
settings.json里插入"[python]"块,格式完全正确
这个方法比手动编辑安全得多——不会拼错 language-id,也不会放错括号位置。
微软正式发布 Visual Studio Code 1.118 版本 。本次更新重点强化了 AI 开发体验与企业管理能力,其中最引人注目的是新增 Copilot CLI 远程控制功能,允许开发者通过手机或网页远程监控和接管 AI 会话 。同时,为了提高 AI 的运行性价比,新版本优化了令牌缓存策略以降低成本 。此外,1.118 版还引入了 Chronicle 本地历史追踪、TypeScript 7.0 支持以及更严格的企业级访问管控 。
Vue 文件里 template 缩进还是乱?
Vue 是复合语言:外层是 vue 模式,但 <template></template> 实际由 HTML 格式化器处理,<script></script> 交给 JavaScript 处理。你只配 "[vue]",对内部块无效。
- 必须分别配
"[html]"和"[javascript]",例如:"[html]": { "editor.tabSize": 2 } -
"[vue]"块只影响 script setup、style 或顶层空白行等纯 vue 区域,不影响嵌入块 - 改完配置后,得重新打开 .vue 文件,或者手动触发一次格式化(
Shift+Alt+F),否则 template 不会立刻响应新规则
保存后缩进又被改成 2 空格?
大概率是 editor.formatOnSave 开着,而 VSCode 内置格式化器(比如 HTML 或 JSON 的默认 formatter)有自己的缩进逻辑,优先级高于 editor.tabSize。
- 关掉自动格式化:
"editor.formatOnSave": false,或只对特定语言关:"[json]": { "editor.formatOnSave": false } - 或者换用 Prettier/ESLint 等外部格式化器,并在对应语言块里指定:
"[javascript]": { "editor.defaultFormatter": "esbenp.prettier-vscode" } - 注意:Prettier 的
tabWidth配置(在.prettierrc里)会彻底接管缩进,此时 VSCode 的editor.tabSize就失效了
最常被忽略的一点:缩进规则和格式化行为是两套系统,混用时一定要确认谁在主导——否则调半天 tabSize,结果全是格式化器在背后偷偷改。










