VSCode代码折叠后“换行消失”本质是视觉压缩而非删除,需正确配置editor.showFoldingControls(推荐"always"或"mouseover")并确保语言服务提供foldingProvider;JSON/YAML/Markdown等需设foldingStrategy为"indentation"才生效,#region在这些语言中无效。

VSCode 代码折叠后“换行消失”,本质不是换行被删了,而是折叠区域的视觉呈现被压缩成单行,且默认不显示折叠内容的缩略预览——这不是 bug,是设计行为。要让折叠后仍保留可读性,得调对 showFoldingControls 和语言服务的配合方式。
折叠后只显示一行,鼠标悬停没预览?检查 showFoldingControls
折叠图标(▶)旁边不显示被隐藏内容的简略文本,大概率是 editor.showFoldingControls 被设成了 "never" 或 "mouseover" 但悬停失效:
-
"always":折叠控件始终显示,且悬停时会弹出预览(含前几行缩略),最直观;推荐开发中启用 -
"mouseover":仅悬停时显示控件,但若当前语言扩展未提供foldingProvider(比如 Plain Text、某些 JSON 文件),悬停也无预览 -
"never":控件彻底隐藏,快捷键仍可用,但视觉上就像“换行消失了”
在 settings.json 中确认这一项存在且值合理:
{
"editor.showFoldingControls": "always"
}
foldingStrategy 设为 indentation 后换行“看起来更乱”?这是预期效果
当把 editor.foldingStrategy 改成 "indentation",VSCode 会按空格/TAB 数量硬算层级,不再依赖语法结构。结果就是:
- 所有同缩进块都变成可折叠项(包括注释块、多行字符串内的换行、甚至空行段落)
- 折叠后显示的预览文本可能截断在中间,或带不完整引号/括号,显得“换行错位”
- Python/Shell/Makefile 等无大括号语言适合它;但 JS/TS/Java 等语法丰富语言反而容易误折叠
若你只是想让 if/for 块也能折,优先改用 // #region 显式标记,而不是全局切 indentation。
JSON/YAML/Markdown 折叠后内容“塌成一行”?它们根本不支持 #region
这类语言没有语法锚点(如 {}、def),VSCode 默认用 "auto" 策略时几乎不提供任何折叠范围。所谓“换行消失”,其实是根本没生成折叠区域:
- 必须手动设
"editor.foldingStrategy": "indentation"才能按缩进折叠 - 但即使这样,
// #region或#region注释在 JSON/YAML 中完全无效——它们不被解析为折叠指令 - Markdown 的折叠只作用于 HTML 块或代码块(需对应语言模式),普通段落不参与折叠
如果打开的是 .jsonc 文件却显示为 JSON(缺了 C 部分),右下角点击切换成 JSON with Comments,折叠支持会明显增强。
折叠预览里换行符被替换成空格?那是语言扩展的渲染逻辑
预览文本由语言扩展提供的 foldingRange 决定,它返回的 startCharacter 和 endCharacter 是字符偏移位置,VSCode 截取时会做简单清洗:
- 自动去除首尾空白、合并连续空白为单空格
- 不会保留原始换行符,所以多行对象字面量折叠后显示为
{ "a": 1, "b": 2 }这种单行格式 - 无法通过设置开启“保留换行预览”,这是 VSCode 渲染层的硬限制
真要看到结构化预览,只能靠鼠标点击展开——折叠预览本身定位就是“快速识别内容类型”,不是“替代展开”。


















