VSCode终端中Ctrl+C不中断进程,根本原因在于该快捷键直接转发给当前CLI进程(如npm、python),而非VSCode处理;需先确认终端获得焦点(状态栏显示“TERMINAL”高亮),若仍无效,则属进程自身忽略SIGINT,与VSCode快捷键设置无关。

终端里 Ctrl+C 不中断进程?不是 VSCode 问题,是焦点和命令分流
VSCode 终端(Terminal)本身不处理 Ctrl+C 这类信号——它直接转发给当前运行的 CLI 进程(比如 npm run dev、python app.py)。所以按了没反应,大概率不是快捷键被覆盖,而是:进程没响应 SIGINT、终端未获得焦点、或你其实在编辑器区域按了键。
验证方法:先点一下终端面板让它获得焦点(状态栏右下角应显示「TERMINAL」高亮),再试 Ctrl+C;如果仍无效,说明是进程自身行为(例如某些 Node.js 工具会捕获并忽略该信号),和 VSCode 键位映射无关。
- 终端内所有快捷键都受
terminalFocus条件约束,图形界面快捷键(如Ctrl+Shift+P)在终端焦点下默认不生效 -
Ctrl+Shift+T在终端里实际触发的是「新建终端」,不是「重新打开已关闭标签页」——后者只在编辑器或侧边栏焦点时有效 - 别试图用
keybindings.json去重绑Ctrl+C,VSCode 不允许拦截或修改这类底层信号转发逻辑
想在终端里用 Ctrl+R 搜索历史?必须加 when: terminalFocus
很多人把 Ctrl+R 绑定到 workbench.action.terminal.runSelectedText 或类似命令,结果发现只在编辑器里生效,终端里按了没反应。根本原因是没写 when 条件,VSCode 默认全局绑定,但终端上下文有独立的可用命令集。
正确写法示例:
[{
"key": "ctrl+r",
"command": "workbench.action.terminal.toggleTerminal",
"when": "terminalFocus"
}]
注意:workbench.action.terminal.toggleTerminal 是切换终端显隐,而真正搜索命令历史的是终端原生功能(bash/zsh 的 Ctrl+R),VSCode 不接管也不暴露该能力。你只能绑定 VSCode 自己的终端操作命令,不能覆盖 shell 层行为。
- 终端内可用命令有限,常见有:
workbench.action.terminal.new、workbench.action.terminal.kill、workbench.action.terminal.clear -
when必须写成"terminalFocus",不是"terminalTextFocus"(后者不存在) - 如果绑定后仍不生效,检查右下角是否处于「VI 模式」——Vim 插件可能劫持了终端输入,临时禁用 Vim 扩展测试
GitLens / Prettier 抢占 Ctrl+Shift+B?终端里它本就不该生效
Ctrl+Shift+B 默认是构建任务快捷键,但 GitLens 会把它绑到 gitlens.showQuickFileHistory。问题在于:这个绑定默认条件是 editorTextFocus,理论上终端里按它不该触发任何事——可如果你发现终端里按 Ctrl+Shift+B 弹出了 GitLens 面板,说明它的 when 条件写得太宽(比如漏写了条件,或用了 always 类表达式)。
解决方式不是删扩展,而是精准压制:
[{
"key": "ctrl+shift+b",
"command": "-gitlens.showQuickFileHistory",
"when": "terminalFocus"
}]
- 加
"when": "terminalFocus"是关键:只在终端里禁用它,不影响编辑器中正常使用 - 别用
"when": "true"或空条件,那会导致全局禁用,且可能被其他扩展覆盖 - 禁用后,
Ctrl+Shift+B在终端里恢复为无操作——你若需要终端专用功能,得自己补一条新绑定,比如映射到workbench.action.terminal.runActiveFile
键盘布局导致 Ctrl+; 被识别成 Ctrl+:?改 keyboard.dispatch
中文键盘用户常遇到:明明写了 "key": "ctrl+;",但实际要按 Ctrl+(英文分号键)才触发,因为 VSCode 默认按字符 dispatch,; 和 : 在中文输入法下物理位置相同但字符不同。
解决方案必须写在 settings.json(不是 keybindings.json)里:
"keyboard.dispatch": "keyCode"
- 这个设置让 VSCode 按物理按键位置判断,而非输入字符,对非美式键盘(中文、日语、德语)必开
- 改完需重启终端面板(关掉再开),旧终端实例不会自动继承新设置
- 如果同时装了 Vim 插件,它的
leader键(如Ctrl+;)也依赖此设置才能稳定工作
终端快捷键冲突的本质,是上下文隔离没做好——VSCode 把编辑器、终端、侧边栏当作不同作用域,而很多插件默认绑定不加 when,就等于往所有地方撒网。最省事的解法不是硬刚,而是用条件精准收网。


















