IPython Notebook能否将多个单元格绑定到标题单元格实现批量折叠?
解决方案
原生Jupyter Lab内置功能(3.0+版本无需额外安装)
Jupyter Lab 3.0及以上版本默认支持按Markdown标题层级折叠单元格组:
- 确保你的分区标题是标准Markdown标题格式,即用
#、##、###标记层级,而非仅手动格式化的加粗文本 - 打开左侧边栏的「目录」面板
- 点击任意标题项左侧的折叠箭头,即可一次性收起该标题下所有从属单元格,再次点击即可全部展开,也可以直接在Notebook正文里点击标题左侧的折叠箭头操作。
经典Jupyter Notebook(nbclassic)可用方案
内置单元格分组功能
- 选中要绑定到同一个标题下的所有单元格:点击第一个目标单元格,按住Shift点击最后一个目标单元格即可完成批量选择
- 点击顶部菜单栏「View」→「Cell Toolbar」→「Create Section」,选中的单元格会自动归属到上方最近的标题单元格下,后续点击标题左侧的折叠箭头就能实现批量收起/展开。
自定义快捷键脚本
如果需要高频使用该功能,可以配置快捷键实现一键操作:
- 打开Jupyter配置目录下的
custom/custom.js文件,不存在则手动新建 - 写入以下代码:
// 绑定Ctrl+Shift+F为当前标题下单元格批量折叠/展开快捷键 Jupyter.keyboard_manager.command_shortcuts.add_shortcut('ctrl-shift-f', { help : 'Fold all cells under current heading', handler : function (env) { const currentCell = env.notebook.get_selected_cell(); // 仅对Markdown标题单元格生效 if (currentCell.cell_type !== 'markdown' || !currentCell.get_text().startsWith('#')) return false; const currentIdx = env.notebook.get_selected_index(); const currentLevel = currentCell.get_text().match(/^#+/)[0].length; // 查找下一个同级或更高级标题的位置 let nextHeadingIdx = env.notebook.ncells(); for (let i = currentIdx + 1; i < env.notebook.ncells(); i++) { const loopCell = env.notebook.get_cell(i); if (loopCell.cell_type === 'markdown' && loopCell.get_text().startsWith('#')) { const loopLevel = loopCell.get_text().match(/^#+/)[0].length; if (loopLevel <= currentLevel) { nextHeadingIdx = i; break; } } } // 批量切换中间单元格的折叠状态 for (let i = currentIdx + 1; i < nextHeadingIdx; i++) { env.notebook.get_cell(i).toggle_input_hidden(); } return false; } });
- 保存文件后重启Jupyter Notebook,之后选中目标标题单元格按下
Ctrl+Shift+F即可一键折叠/展开该标题下所有从属单元格。
内容的提问来源于stack exchange,提问作者Echo
相关产品推荐
相关产品推荐

