vscode 默认不保存折叠状态,需启用 editor.restoreviewstate 并确保文件被编辑过,或使用 #region/#endregion 折叠标记实现跨会话持久化。

折叠状态为什么每次重启就丢失
VSCode 默认不持久化代码块的折叠状态,关闭文件再打开,所有手动折叠都会恢复展开。这不是 bug,而是设计如此——折叠被视为临时编辑辅助行为,不是文件元数据的一部分。
要让折叠状态“记住”,必须启用 editor.foldingStrategy 对应语言的语法折叠,并确保 editor.foldEnable 为 true;但最关键的是开启 editor.restoreViewState(默认已启用),且文件必须被 VSCode 视为“已编辑过”(哪怕只是光标停留过)才会保存视图状态。
-
editor.restoreViewState只对已打开过的编辑器实例生效,新标签页首次打开文件不会还原 - 如果用命令行
code file.js直接打开,且该文件此前未在当前窗口中打开过,折叠状态不会恢复 - 某些语言扩展(如 Python 的 Pylance)会覆盖默认折叠逻辑,导致
editor.foldingStrategy: "syntax"失效,此时需检查扩展是否禁用了折叠
如何强制 VSCode 记住某段代码的折叠状态
纯靠手动折叠不行,得用折叠标记(folding markers)——这是唯一能跨会话持久生效的方式。VSCode 支持以注释形式声明折叠区域,只要格式匹配,重启后依然折叠。
不同语言的标记语法略有差异,但核心是:开头注释含 #region 或 // #region,结尾含 #endregion 或 // #endregion。注意空格和大小写敏感性。
- JavaScript/TypeScript:
// #region 初始化逻辑+// #endregion - Python:
# region 数据处理+# endregion(注意无//,且空格不能少) - Java/C#:
#region 工具方法+#endregion(不带双斜杠也有效) - 折叠标记必须独占一行,前后不能有其他代码或多余字符
示例(TypeScript):
// #region API 配置 const baseUrl = 'https://api.example.com'; const timeout = 5000; // #endregion
折叠策略选 auto 还是 syntax?
editor.foldingStrategy 决定 VSCode 怎么识别可折叠区域。选错会导致自定义标记失效,或语法块无法折叠。
-
"auto":自动检测语言支持,优先用扩展提供的折叠提供者(如 ESLint、Pylance),若无则回退到缩进折叠 -
"syntax":强制只按语言语法结构(如函数、类、if 块)折叠,忽略缩进,也忽略注释标记 -
"indentation":纯靠缩进判断,适用于 Shell、YAML 等无语法折叠支持的语言
想让 #region 生效,必须确认当前语言模式下,所用扩展支持 region 折叠(比如 TypeScript 官方支持,但某些轻量 JS 扩展可能不支持)。可在命令面板运行 Developer: Toggle Developer Tools,查看 Console 是否报错 Folding provider does not support regions。
插件级方案:只有折叠还不够,还要“跳转+命名”
单纯记忆折叠不够,真正提升效率的是快速定位和语义化命名。官方折叠功能不支持给区域加 ID 或快捷跳转,得靠插件补足。
推荐两个轻量插件:
-
Region Folder:支持用// region my-api标记,然后通过命令Region Folder: Jump to Region模糊搜索跳转,且折叠状态跨会话保留 -
Toggle Quotes不相关,别装错;真正有用的是Bracket Pair Colorizer虽然不直接管折叠,但它高亮配对括号,间接帮你一眼识别哪些块本该可折叠却没被识别 - 禁用任何声称“智能折叠”的重型插件——它们常劫持折叠逻辑,反而导致原生
#region失效
插件安装后,务必重启 VSCode,且检查设置里是否与 editor.foldingStrategy 冲突(比如插件要求设为 indentation,而你设了 syntax)。
region 标记的命名别太随意,比如 // #region xxx 中的 xxx 最好是动词短语(init state、handle error),否则搜起来费劲。VSCode 自身不校验命名,但人脑会。











