按 ctrl+k ctrl+s 搜索 ctrl+p 可查快捷键来源;更准的是运行 developer: toggle keybinding troubleshooter 后按 ctrl+p,直接显示冲突绑定、扩展名及覆盖状态。

怎么快速定位哪个命令或扩展占用了 Ctrl+P
VSCode 不会弹窗告诉你“谁抢了你的快捷键”,但冲突发生时,最直接的线索就在 Ctrl+K Ctrl+S 打开的图形界面里。输入 ctrl+p 搜索,所有命中项都会列出,每条末尾标着来源:Default、GitLens、Prettier 或你自己的 user 设置。带 (when) 条件的条目(比如 editorTextFocus)可能只在编辑器有焦点时生效——表面没冲突,实际却抢了你的操作。
更准的办法是运行命令 Developer: Toggle Keybinding Troubleshooter,然后立刻按 ctrl+p,它会弹出面板,明确告诉你哪些绑定匹配、来自哪个扩展、是否被覆盖。
- 常见干扰扩展:GitLens(常占
ctrl+shift+h)、Bracket Pair Colorizer(爱抢ctrl+shift+p)、Vim(全盘接管h/j/k/l和ctrl+d) - 灰色条目 ≠ 无效,只是当前上下文不满足
when条件;绿色才真正生效 - 别信“看起来只有一条”,点开带 ▶ 的条目,才能看到完整命令 ID 和触发条件
为什么改了 keybindings.json 却没反应
不是语法错了,而是三条隐性规则卡住了你:
-
keybindings.json必须是合法 JSON 数组格式,哪怕只加一条,也得包在[ ]里,且每条对象后要加逗号(最后一项除外) -
when条件写得太窄,比如"when": "editorTextFocus",你在终端或设置页按快捷键,它就完全静音 - 系统或输入法根本没把按键传给 VSCode:搜狗拼音、Logitech Options、Raycast 都干过这事;临时退出它们再试一次,比改十次配置更快
另外注意:keyboard.dispatch 默认按字符 dispatch,非美键盘(如中文)下 ctrl+; 可能被识别成 ctrl+:。解决方法是打开 settings.json,加一行:"keyboard.dispatch": "keyCode" —— 这个不能写在 keybindings.json 里。
怎么安全禁用插件快捷键而不卸载插件
不想删 GitLens,又受不了它抢走 ctrl+shift+h?用负号语法最干净:
[{"key":"ctrl+shift+h","command":"-gitlens.showQuickFileHistory"}]
这个 - 前缀是 VSCode 官方支持的语法,表示“取消该命令的默认绑定”,不报错、不冲突、不影响插件其他功能。
- 命令 ID 必须写全,右键快捷键列表里的对应项 → “复制命令 ID” 最稳妥
- 别写
"command": ""或留空字符串,VSCode 会整条忽略 - 禁用后,该快捷键不会变灰,只是不再触发——你得自己补上新绑定,否则等于废掉了
自定义快捷键必须写的三个字段
每条规则是一个 JSON 对象,key、command、when 缺一不可:
-
key:大小写敏感,修饰键用ctrl/meta(Mac 的 Cmd)/alt/shift,多个键用空格分隔,例如"ctrl+alt+s" -
command:必须是 VS Code 内部注册的真实命令 ID,不是中文名,也不是函数调用;可在命令面板里搜索操作,悬停看提示,或右键 → “复制为 JSON” 获取准确值 -
when(强烈建议写):决定快捷键在哪种场景下才触发,例如"editorTextFocus && !editorReadonly"表示“光标在可编辑文本中才生效”;漏掉这个,可能在终端、设置页或只读文件里误触发,甚至被插件覆盖
顺序很重要:数组靠后的规则会覆盖前面的同 key + 同 command 绑定;建议把自定义规则统一放在数组末尾。











