原生 jupyter notebook 默认不支持代码折叠,需通过 nbextensions 插件启用 collapsible headings 和 codefolding;jupyterlab 从 v3.0 起内置 codefolding 配置,需在设置中手动开启并重启生效。

原生 Jupyter Notebook(非 JupyterLab)默认不支持代码折叠,必须通过插件或手动注入 CSS/JS 实现。直接启用 codeFolding 配置无效,这是常见误区。
用 nbextensions 插件一键启用折叠
这是最稳定、兼容性最好的方式,适用于 Notebook 5.x–7.x(截至 2026 年仍广泛使用)。
- 先安装扩展管理器:
pip install jupyter_contrib_nbextensions,然后运行jupyter contrib nbextension install --user - 启动 Jupyter Notebook,在首页点击
Nbextensions标签页 - 找到并勾选
Collapsible Headings—— 注意:它实际折叠的是 Markdown 标题下的所有后续单元格(含代码),不是纯代码块;若要折叠单个代码单元格,需额外启用Codefolding子项(部分版本中与前者合并,部分独立列出) - 刷新页面后,每个代码单元格左侧会出现小三角图标,点击即可折叠/展开
JupyterLab 用户别走错路
JupyterLab 从 v3.0 起已内置代码折叠能力,但默认关闭,且配置位置和语法与 Notebook 完全不同。
- 打开设置 →
Settings→Advanced Settings Editor→ 左侧选Notebook - 在右侧用户设置 JSON 中添加:
{"codeCellConfig": {"codeFolding": true}} - 保存后重启 Lab 页面(仅改配置不重启无效)
- 注意:该设置只影响代码单元格的折叠控件(小三角),不影响输出区域;如需折叠输出,要用
Ctrl+O或右键 →Toggle Output
自定义 JS/CSS 方案容易踩的坑
有人尝试修改 jupyterthemes 的 custom.js 来加“折叠全部”按钮,但极易失效。
- Jupyter Notebook 6+ 使用了新的前端架构(基于 Lumino),旧版
IPython.notebookAPI 大部分已弃用,IPython.toolbar.add_buttons_group在新版中不再可用 - 手动注入的 JS 若未绑定到正确的事件钩子(如
notebook_loaded.Notebook),按钮可能渲染出来但点击无响应 - CSS 折叠样式依赖特定 class 名(如
.foldable),但不同主题(jt -t onedorkvsjt -t grade3)对折叠区域的 DOM 结构处理不一致,导致按钮错位或不可见 - 修改
custom.css后必须执行jupyter themes --reset并重启服务才生效,仅刷新浏览器无效
真正可靠的折叠体验,取决于你用的是 Notebook 还是 Lab —— 两者底层机制完全不同,混用方案必然失败。尤其要注意:Notebook 的 Collapsible Headings 是按标题组织的逻辑折叠,而 Lab 的 codeFolding 是按语法块(def/class/if)做的物理折叠,行为差异很大,不能假设功能一致。











