Developer: Toggle Keybinding Troubleshooter 可定位快捷键冲突源,绿色▶条目为实际触发项;常见劫持者有GitLens、Vim、Remote-SSH;禁用需在keybindings.json中添加带减号的命令ID规则并重载窗口。

Developer: Toggle Keybinding Troubleshooter 能查到谁在抢键
按 Ctrl+Shift+P(Windows/Linux)或 Cmd+Shift+P(macOS),输入并执行 Developer: Toggle Keybinding Troubleshooter,然后立刻按你失效的快捷键(比如 Ctrl+Shift+F)。面板会列出所有匹配项,包括来源扩展、命令 ID 和是否被覆盖。
关键点:
- 带 ▶ 的绿色条目才是当前实际触发的;灰色条目是
when条件不满足,不是失效,只是没轮到它 - 常见劫持者:
GitLens(默认绑Ctrl+Shift+B到gitlens.showQuickFileHistory)、Vim(接管Esc、Ctrl+S等)、Remote - SSH(连接后动态注入绑定) - 如果某扩展条目排在最上面且状态为 enabled,大概率就是它在拦截
禁用插件快捷键但不卸载插件
想留着插件功能,只释放快捷键?在 keybindings.json 里加一条带减号的禁用规则即可:
[{"key": "ctrl+shift+b", "command": "-gitlens.showQuickFileHistory"}]
注意:
-
command必须写全命令 ID —— 在 GUI 快捷键面板中右键目标条目 → “复制命令 ID” 最稳妥 - 减号
-开头表示取消绑定,VS Code 不会报错也不会变灰,但该组合键将彻底不触发任何操作 - 别写
"command": ""或null,整条配置会被 VS Code 静默忽略 - 禁用后需重新加载窗口(
Ctrl+Shift+P→Developer: Reload Window)才生效
插件动态注册导致 keybindings.json 失效
有些插件(如 Remote - SSH、GitLens、Vim)不是静态注册快捷键,而是在特定上下文(比如连接成功、文件打开、模式切换)时动态注入。这时你在 keybindings.json 里写的规则可能被覆盖,甚至根本没机会生效。
实操建议:
- 先禁用全部扩展(
Ctrl+Shift+P→Extensions: Disable All Installed Extensions),再测试快捷键是否恢复 - 若恢复,逐个启用插件,每次启用后 reload window 并测试,定位具体干扰源
- 对确认有问题的插件,在其设置页搜
keybindings或shortcuts,看是否有开关可关闭快捷键自动注册 - 某些插件(如 Vim)提供
vim.disableExtension这类设置项,可在settings.json中临时关闭其快捷键层
when 条件冲突比命令 ID 冲突更难察觉
插件注册的快捷键往往附带精确的 when 表达式,例如 editorTextFocus && vim.mode == 'Normal' 或 resourceExtname == '.py' && python.languageServer != 'None'。这些条件可能和你的自定义规则形成隐性竞争:你的规则因 when 更宽泛而被插件规则“压过”,或者反过来,插件规则因条件更严只在特定时刻激活,导致你误判为“有时有效有时无效”。
排查要点:
- 在 Troubleshooter 面板里,把鼠标悬停在每条匹配项上,看完整
when表达式是什么 - 检查你自己的
when是否拼错(比如editorTextFocu少个s),VS Code 不报错,整条静默丢弃 - 不要依赖默认
when—— 插件自带的规则通常有明确上下文约束,而你的自定义若没写when,就可能在终端、搜索框等区域意外触发,反而被系统快捷键截胡
真正麻烦的不是插件抢了键,而是它抢得悄无声息:没有报错、不提示覆盖、连 Troubleshooter 有时都只显示“已启用”却不动,直到你手动验证每个上下文下的 when 计算结果。











