VSCode 可通过设置 "editor.foldingStrategy": "indentation" 强制按缩进折叠,全局或按语言(如 "[json]": { "editor.foldingStrategy": "indentation" })配置,需确保语言模式正确且无扩展干扰。

怎么让 VSCode 按缩进折叠而不是语法结构
VSCode 默认优先用语言服务提供的语法级折叠(比如函数、类、if 块),但很多场景下你更想要「纯看缩进」就折叠——比如写 YAML、JSON5、Markdown 列表,或者调试一段没加 function 关键字的 JS 片段时,语法折叠直接失效。
关键控制项是 "editor.foldingStrategy",它有两个合法值:"auto"(默认,优先语法)和 "indentation"(强制按缩进)。设成后者后,VSCode 就完全忽略语言服务器返回的折叠区域,只数空格/TAB 层级。
- 在
settings.json里加一行:"editor.foldingStrategy": "indentation" - 这个设置是全局生效的;如只想对某语言生效,用带语言标识的 scoped 配置,例如:
"[json]": { "editor.foldingStrategy": "indentation" } - 改完不用重启,保存即生效;但已打开的文件可能需要手动触发一次折叠刷新(比如按
Ctrl+KCtrl+0全部收起再展开)
为什么改了 foldingStrategy 还不按缩进折叠
常见原因是语言模式没识别对,或者扩展干扰了折叠逻辑。VSCode 的折叠行为依赖两个前提:当前编辑器的语言模式(language ID)正确,且该语言没有强制覆盖折叠策略。
- 确认右下角显示的语言名是否准确(比如 .yml 文件显示成
plaintext就不行,要点开改成yaml) - 某些扩展(如 Prettier、Better TOML)会注册自己的折叠提供者,它们可能无视
foldingStrategy设置;可临时禁用扩展验证 - 检查有没有其他设置冲突,比如
"editor.showFoldingControls"设为"never"会导致折叠控件消失,误以为没生效 - 注意:HTML、CSS 等语言即使设了
"indentation",也可能因内置语法解析器太强而“回退”到语法折叠——这是设计使然,不是 bug
foldEnable 和 foldingStrategy 有什么区别
"editor.foldEnable" 是总开关,关掉它整个折叠功能就没了;而 "editor.foldingStrategy" 是决定“怎么算一层”的规则。两者不互斥,但作用层级不同。
-
"editor.foldEnable": false→ 所有折叠按钮消失,Ctrl+Shift+[无效,无论策略设成啥都没用 -
"editor.foldingStrategy": "indentation"→ 折叠按钮还在,只是计算方式变成数缩进层级 - 如果你发现折叠突然全没了,先查
foldEnable是否被某个工作区设置意外关掉了(比如团队共享的.vscode/settings.json里写了false)
在多语言混排文件里怎么精细控制
像 Markdown 里嵌代码块、Vue 单文件组件、或 JSDoc 注释里的 JSON 示例,经常需要“主文件用语法折叠,代码块用缩进折叠”。VSCode 不支持单文件内混合策略,但可以靠语言嵌套 + scoped 设置逼近效果。
- 确保嵌入的代码块被正确识别为子语言(比如 Markdown 中的 ```json 块要能触发
json语言模式) - 给子语言单独设策略:
"[json]": { "editor.foldingStrategy": "indentation" },这样只有 JSON 块按缩进折,Markdown 主体仍走语法折叠 - 注意:这种设置对内联代码(如
`const a = 1`)无效,因为 VSCode 不会给行内文本分配语言模式 - 如果嵌套太深(比如 Vue 里的
<script setup lang="ts"></script>),建议用官方语言扩展(Volar),它比基础 TS 支持更细粒度的折叠区域控制


















