keybindings.json是唯一真正生效的快捷键配置文件,必须通过ctrl+shift+p(win/linux)或cmd+shift+p(macos)执行“preferences: open keyboard shortcuts (json)”打开用户级文件,在空数组[]内添加含key、command、when字段的json对象,when不匹配将静默失效。

keybindings.json 文件才是唯一真正生效的地方,GUI 界面只适合试水,一碰冲突、插件干扰或条件限制就失灵。
怎么打开并编辑正确的 keybindings.json
别点“设置”里那个“Open Settings (JSON)”——那是改 settings.json 的,和快捷键无关。必须用命令面板:Ctrl+Shift+P(Windows/Linux)或 Cmd+Shift+P(macOS)→ 输入 Preferences: Open Keyboard Shortcuts (JSON) → 回车。VSCode 会自动打开用户级配置文件,初始内容是空数组 [],所有自定义项都得塞进这个方括号里。
常见错误包括:
- 手动去文件系统找路径复制粘贴,容易选错位置或权限异常
- 误开成
settings.json,改半天没反应 - 在 GUI 界面右键“更改键绑定”后直接保存,它生成的 JSON 不暴露
when细节,后续难调试
command 名写错,按了完全没反应
VSCode 命令名和界面文字经常不一致,比如“保存文件”对应的是 workbench.action.files.save,不是 saveFile 或 file.save。别猜,也别靠记忆。
获取准确 command 名的可靠方式:
- 在快捷键界面(
Ctrl+K Ctrl+S)中搜索目标功能,悬停在条目上,tooltip 里显示的就是完整命令 ID - 右键某条记录 → “将键绑定复制为 JSON”,直接拿到带
command和when的标准写法 - 打开 DevTools(
Developer: Toggle Developer Tools),切到 Console,执行vscode.commands.getCommands().then(console.log),等列表出来后搜关键词(如 “format”)
when 条件太窄,快捷键像消失了一样
多数“点了没反应”不是命令没绑,而是 when 没匹配上下文。它是个布尔表达式,漏一个条件就静默失效,VSCode 不报错也不提示。
典型场景和写法:
- 想在编辑器里生效?加
"when": "editorTextFocus",否则你在终端、设置页、搜索框里按,它就完全不触发 - 想只在 Python 文件里触发?用
"when": "editorTextFocus && resourceExtname == '.py'";单写editorLangId == 'python'可能因语言模式未激活而失败 - 想全局生效?删掉
when字段(等价于true),但要小心误触 - 同一
key绑了多条规则?VSCode 按匹配度选最具体的那条,不是按顺序。比如{"key":"ctrl+k","command":"a"}和{"key":"ctrl+k","command":"b","when":"terminalFocus"},只有终端里按才触发b
覆盖默认键前,先查谁在抢你的 key
直接覆盖高频键(比如 Ctrl+S)风险高,协作或临时换机器时容易卡壳。真要改,得控范围、留退路。
查占用最准的方式:
- 在快捷键界面搜索你的组合键(如
ctrl+s),看来源列是 “Default”、“Extension” 还是 “User” - 打开 DevTools Console,运行
console.log(JSON.stringify(monaco.keymaps.KeybindingsRegistry.getBoundKeybindings('workbench.action.files.save'), null, 2)),能看到所有绑了该命令的规则和它们的when - 禁用默认绑定要用
"-editor.action.showHover"这种负号前缀写法,不能留空"command": "",否则整条规则被忽略
Ctrl+; 在中文输入法下常被识别成 Ctrl+:,导致自定义失效。这不是 VSCode bug,而是字符 dispatch 映射错乱,需在 settings.json 中额外调整。











