jupyter notebook 原生不支持自动折叠,仅提供手动点击或快捷键折叠单个单元格;所谓“自动折叠”需依赖第三方扩展、自定义js或jupyterlab配置间接实现。

默认不支持自动折叠,必须手动触发或通过插件/配置启用折叠能力。 Jupyter Notebook 原生只提供「手动点击左侧三角」或「快捷键」折叠单个单元格,没有“运行后自动折叠输出”或“打开时自动折叠代码”的内置开关。所谓“自动折叠”,实际是靠第三方扩展、自定义 JS 或 JupyterLab 的配置项间接实现的。
为什么原生 Notebook 没有 auto-fold 选项
Jupyter Notebook 的折叠逻辑完全由前端 JavaScript 控制,且仅响应用户显式操作(点击、快捷键)。它不会监听 run_cell 事件并自动设置 cell.metadata.collapsed = true,也不读取任何类似 "autoFoldOutput": true 的配置项。所有“自动”效果,都是外部注入行为的结果。
JupyterLab 中开启代码折叠(含自动展开/折叠倾向)
如果你用的是 JupyterLab(推荐),可通过 JSON 设置启用折叠 UI,并控制默认行为:
- 打开
Settings→Advanced Settings Editor→ 左侧选Notebook - 在右侧
User Preferences区域填入:{ "codeCellConfig": { "codeFolding": true, "autoCollapseOutput": false, "autoScrollOnRun": true } } -
"codeFolding": true启用左侧折叠控件;"autoCollapseOutput": false是关键——目前 JupyterLab 官方并未实现该字段(设为true也无效),所以输出仍需手动折叠 - 真正起作用的是
codeFolding:开启后,每个代码单元格左侧会出现蓝色竖条,点击即可折叠/展开
用 nbextensions 实现“运行即折叠输出”
这是最接近“自动折叠”的方案,依赖 jupyter_contrib_nbextensions 插件中的 Hide Input 或自定义 JS:
- 安装插件:
pip install jupyter_contrib_nbextensions && jupyter contrib nbextension install --user - 启用
Hide Input扩展(它本质是折叠输入区+隐藏代码,非真正折叠) - 若要“运行后自动折叠输出”,需手动注入 JS:在
~/.jupyter/custom/custom.js中添加:define([ 'base/js/namespace', 'base/js/events' ], function(Jupyter, events) { events.on('notebook:kernel-ready', function(){ Jupyter.notebook.kernel.execute('from IPython.display import Javascript; Javascript("$(\'.output_subarea\').hide();")'); }); }); - ⚠️ 注意:这段 JS 会在 kernel 启动后执行一次,不能保证每次
Shift+Enter都触发;且折叠的是 DOM 元素,不是写入.ipynb文件的collapsed标记,刷新页面会失效
容易被忽略的关键点
折叠状态是否持久,取决于你改的是哪一层:
- 点击三角图标 → 修改
cell.metadata.collapsed→ 保存后下次打开仍保持折叠(✅ 真正持久) - 用 CSS
display: none隐藏输出 → 不写入文件 → 刷新即恢复(❌ 伪折叠) - JupyterLab 的
codeFolding设置只影响 UI 控件是否出现,不影响默认折叠状态 - nbextensions 中的
Collapsible Headings折叠的是 Markdown 标题层级,对代码单元格无效











