笔记本热重新加载
在VS代码中自动重新加载Jupyter笔记本 .ipynb 文件在外部被修改。
我为什么建造这个
我调查了为什么VS Code Copilot没有这个问题。答案是:Copilot是一个VS Code扩展,可以直接访问内部 NotebookEdit API外部工具,如Claude Code、Cursor代理或MCP服务器,只能写入 .ipynb 磁盘上的文件——VS Code的笔记本编辑器会忽略已打开笔记本的磁盘更改。 File: Revert File 也不起作用;如果笔记本没有脏,那就不行了。
唯一触发重新加载的是从笔记本选项卡切换回来。这是因为当编辑器重新获得焦点时,VS Code会检查文件的mtime。但没有API可以通过编程方式触发此操作。
因此,我构建了这个扩展。它民意调查开放时间 .ipynb 文件,当检测到更改时,从磁盘读取文件并使用以下命令应用差异 NotebookEdit.replaceCells() -与Copilot内部使用的API相同。只有更改的单元格会被替换,因此您的滚动位置会被保留。
这也是必要的,因为我的HPC集群使用GPFS,其中 inotify 事件不会传播,使 vscode.workspace.createFileSystemWatcher 没用。投票是唯一可靠的方法。
特性
- 轮询打开的笔记本以进行磁盘更改(可配置间隔)
- 基于差异的更新——只触摸修改/添加/删除的单元格
- 保留滚动位置——不替换未更改的单元格
- 处理代码单元格、标记单元格、输出(文本、图像、错误)和执行计数
- 适用于任何文件系统(否
inotify依赖性) - 适用于远程SSH、WSL和容器
安装
搜索 “笔记本热重新加载” 在VS代码扩展中,或:
ext install kdkyum.notebook-hot-reload设置
| 设置 | 默认值 | 说明 |
|---|---|---|
notebookHotReload.enabled | true | 启用/禁用热重新加载 |
notebookHotReload.pollingInterval | 1500 | 轮询间隔(毫秒)(500-10000) |
运作原理
- 当Jupyter记事本打开时,扩展每隔1.5秒轮询一次文件的修改时间
- 当检测到变化时,它会读取
.ipynb来自磁盘的JSON - 它将当前内存单元与新单元进行比较(比较源、种类、执行计数、输出计数)
- 仅通过以下方式替换更改后的范围
WorkspaceEdit+NotebookEdit.replaceCells() - 编辑前后未更改的单元格保持不变(保留滚动位置)
用例
- 克劳德代码+Jupyter MCP:当AI代理编辑和执行单元格时,实时查看笔记本电脑的变化
- 光标/风帆+MCP:外部代理修改立即出现在VS代码中
- HPC/远程SSH:适用于并行文件系统(GPFS、NFS、Lustre),其中
inotify不可用 - 脚本和自动化:任何在VS代码之外修改笔记本的工作流程
许可证
麻省理工学院
