vscode 无法与 web 版 jupyter notebook 完全一致,但启用 jupyter.keymap: "jupyter-notebook" 并清除冲突快捷键后,可高度还原 shift+enter 执行下移、a/b 插入、dd 删除等核心行为,关键需确保 microsoft 官方 jupyter 扩展已启用且版本 ≥ v2025.10.x,并执行 developer: reload window 生效。

直接结论:VSCode 无法做到和 Web 版 Jupyter Notebook “完全一致”,但可以高度还原核心行为(如 Shift+Enter 执行并下移、A/B 插入单元格、DD 删除等),关键在于启用 jupyter-notebook 键映射模式,并确保没有其他快捷键覆盖。
确认 Jupyter 扩展已启用且为最新版
所有快捷键逻辑都依赖于 Microsoft 官方 Jupyter 扩展的完整加载。旧版本(如 v2024.x 之前)可能缺失 jupyter-notebook 键映射选项,或命令注册不全。
- 按
Cmd+Shift+X(macOS)或Ctrl+Shift+X(Windows/Linux)打开扩展面板 - 搜索
Jupyter,确认由Microsoft发布的扩展状态为“已启用”,版本号 ≥v2025.10.x - 点击扩展右下角齿轮 → “检查更新”,更新后执行
Developer: Reload Window - 如果扩展显示“禁用”或“损坏”,卸载后重装,不要依赖第三方 fork 版本
在 settings.json 中强制启用 jupyter-notebook 键映射
VSCode 的 jupyter.keymap 设置是开关,不是建议值——它决定是否激活整套 Jupyter Notebook 风格的键盘状态机(包括命令/编辑双模式、单元格导航逻辑)。仅靠 UI 下拉选择有时不生效,必须写进 settings.json。
- 按
Cmd+Shift+P→ 输入Preferences: Open Settings (JSON) - 添加这行(注意逗号分隔):
"jupyter.keymap": "jupyter-notebook" - 同时建议补上:
"jupyter.askForKernelRestart": false(避免每次切换 kernel 弹窗打断操作流) - 保存后必须执行
Developer: Reload Window,单纯重启编辑器窗口不够
清理 keybindings.json 中的冲突规则
很多人卡在这一步:明明设置了 jupyter.keymap,但 Shift+Enter 还是只运行不跳转,或者 A/B 没反应。大概率是 keybindings.json 里存在手动添加的、作用域宽泛的覆盖规则,比如:
-
{"key":"shift+enter","command":"editor.action.insertLineAfter"}—— 这会抢走 Jupyter 的执行逻辑 -
{"key":"a","command":"editor.action.insertLineAfter","when":"editorTextFocus"}—— 在编辑模式下拦截了A,导致无法进入命令模式 - 任何
when条件里没限定jupyter.hasNotebookProvider或notebookEditorFocused的全局绑定,都可能干扰
解决方法:打开 Preferences: Open Keyboard Shortcuts (JSON),删掉所有未明确关联 jupyter. 命令的 shift+enter、ctrl+enter、a、b、m、y、d 绑定,保存即生效。
验证命令模式是否真正可用
Jupyter 的快捷键分两层:编辑模式(输入代码)和 命令模式(管理单元格)。Web 版中按 Esc 退出编辑、进入命令模式,VSCode 默认也如此,但容易被忽略。
- 在代码单元格中按
Esc,左侧垂直条应变为实心蓝色(macOS)或深色(Windows),此时再按A才会在上方插入单元格 - 如果按
Esc没反应,说明当前焦点不在 notebook 编辑器内——检查是否误点了输出区域、侧边栏或终端 - 若长期处于编辑模式,
Ctrl+Enter会变成插入空行(系统级行为),这不是 bug,而是 VSCode 尊重了当前上下文;这时先按Esc切回命令模式即可
真正的难点不在配置,而在于习惯迁移:Web 版的“默认命令模式”在 VSCode 中需要主动触发一次 Esc,后续操作才符合预期。这点不适应,所有快捷键都会显得“不一致”。











