真正生效的快捷键配置必须编辑keybindings.json文件,通过Ctrl+Shift+P(macOS用Cmd+Shift+P)执行“Preferences: Open Keyboard Shortcuts (JSON)”打开;key须小写无空格、修饰键顺序固定,command须为完整命令ID,when条件错误会导致静默失效,禁用需用负号前缀而非留空。

直接改 keybindings.json 才算真正生效
GUI 界面(Ctrl+K Ctrl+S)只负责展示和简单增删,一旦涉及冲突覆盖、when 条件或插件抢占,它就不再可靠。所有最终生效的绑定都来自 keybindings.json 文件,必须通过命令面板打开:按 Ctrl+Shift+P(macOS 用 Cmd+Shift+P),输入 Preferences: Open Keyboard Shortcuts (JSON) 回车。别去文件系统里手动找路径——容易选错位置、权限异常,或误开成 settings.json。
key 和 command 写错一个字就静默失效
常见错误不是语法报错,而是字段值不合法:
-
key必须小写、无空格,修饰键顺序固定为ctrl→shift→alt→meta(macOS 用cmd);"ctrl+shift+p"✅,"Ctrl+Shift+P"❌ -
command必须是完整命令 ID,不是中文名;可在 GUI 中悬停查看 tooltip,比如editor.action.formatDocument,不是 “格式化文档” - 字母键默认小写;想触发大写需显式加
shift,如"ctrl+shift+u"绑的是Ctrl+Shift+U,不是Ctrl+U - 功能键写全称:
f1、escape、backspace,不能简写为esc或del
when 条件漏写或写错,快捷键就“假装没听见”
多数“点了没反应”不是命令没绑,而是上下文不匹配,VSCode 不报错也不提示,直接忽略:
- 想在编辑器里生效?加
"when": "editorTextFocus",否则在终端或资源管理器里按了白按 - 想只在 Python 文件里触发?用
"when": "editorTextFocus && resourceExtname == '.py'";单写editorLangId == 'python'可能因语言模式未激活而失败 - 想彻底放开限制?直接删掉
when字段(等价于true),但要小心误触 - 查谁在抢你的键:在 DevTools Console 里运行
console.log(JSON.stringify(monaco.keymaps.KeybindingsRegistry.getBoundKeybindings('workbench.action.quickOpen'), null, 2)),能看到所有绑了Ctrl+P的规则和它们的when
禁用默认快捷键不能留空 command,得用 unset
别删默认项,也别写 "command": ""——VSCode 会直接忽略整条规则。正确做法是用负号前缀:
[{"key":"ctrl+k ctrl+i","command":"-editor.action.showHover"}]
这条的意思是:明确禁用 editor.action.showHover 命令的默认绑定,释放 Ctrl+K Ctrl+I 组合,后续可放心绑定新命令。命令 ID 可在 GUI 中右键某条快捷键 → “复制命令 ID” 获取。注意:- 必须紧挨着命令名,不能有空格;也不能写成 "- editor.action",否则无效。
非美式键盘用户尤其要注意:Ctrl+; 常被识别成 Ctrl+:,这不是 VSCode bug,而是字符 dispatch 映射错乱。解决方法是在 settings.json(不是 keybindings.json)中添加对应修正配置。











