keybindings.json 是唯一真正生效的地方,vs code 快捷键修改界面仅是展示层,所有绑定逻辑最终归结于此文件,gui 操作本质是向该 json 数组追加或替换对象,未写入文件则重启后失效。

keybindings.json 是唯一真正生效的地方
VS Code 的快捷键修改界面(Ctrl+K Ctrl+S)只是展示层,所有绑定逻辑最终都归结到 keybindings.json 文件。GUI 上点“修改”本质是往这个 JSON 数组里追加或替换对象。不打开它,就等于没改——哪怕你在界面上反复点击、保存,只要没写进文件,重启后就清零。
路径固定:
Windows:%APPDATA%\Code\User\keybindings.json
macOS:~/Library/Application Support/Code/User/keybindings.json
Linux:~/.config/Code/User/keybindings.json
- 文件初始为空数组
[],所有自定义项必须作为对象塞进方括号内,不能删掉中括号 - 字段名全小写:
key、command、when,大小写错一个就静默失效 -
key值必须按修饰键顺序书写:ctrl → shift → alt → meta(macOS 用cmd,Windows/Linux 用win),例如"ctrl+shift+p"✅,"Ctrl+Shift+P"❌ -
command必须是完整命令 ID,不是中文名。悬停在 GUI 快捷键条目上,tooltip 显示的才是真名,比如editor.action.jumpToBracket,不是 “跳转到括号”
多键组合(chord)必须用数组形式声明
像 Ctrl+K Ctrl+C 这种两段式快捷键,在 JSON 中不能写成 "ctrl+k ctrl+c" —— 这会被当成单次按键序列,根本无法触发。正确写法是用数组包裹两个字符串:
[{"key": "ctrl+k", "command": "editor.action.commentLine"}, {"key": "ctrl+k ctrl+c", "command": "editor.action.commentLine"}]
但注意:VS Code 对 chord 的支持有前提:
- 第一段(如
ctrl+k)本身不能绑定其他命令,否则会直接执行那个命令,没机会等第二段 - 第二段(如
ctrl+c)必须紧接在第一段释放后 700ms 内按下,超时则回退为单独执行ctrl+k - chord 不支持嵌套三层及以上,比如
Ctrl+K Ctrl+C Ctrl+D无效
when 条件不匹配 = 快捷键“消失”
90% 的“快捷键点了没反应”问题,根源都在 when 字段。它不是可选项,而是运行时开关。漏写、写错、条件太窄,都会让绑定彻底失效。
- 想在编辑器里生效?至少加
"when": "editorTextFocus",否则在终端、侧边栏、搜索框里按了也白按 - 只在 Python 文件里触发?用
"when": "editorTextFocus && resourceExtname == '.py'",比editorLangId == 'python'更可靠——语言模式未激活时后者可能为plaintext - 和 Vim 插件共存?加上
vim.mode == 'Normal',避免插入模式下误触 - 彻底放开限制?直接删掉
when字段(等价于true),但要小心在错误上下文触发副作用
查谁在抢你的键?打开 DevTools Console,运行:console.log(JSON.stringify(monaco.keymaps.KeybindingsRegistry.getBoundKeybindings('editor.action.jumpToBracket'), null, 2))
能看到所有绑了该命令的规则及其 when 表达式。
覆盖与冲突:后写的永远赢
VS Code 不按“默认→插件→用户”的层级叠加,而是按 keybindings.json 数组顺序线性匹配——从上到下扫描,遇到第一个 key 匹配且 when 为 true 的条目就执行,后面同 key 的直接忽略。
- 想禁用某个默认绑定?不用删,只需在数组末尾加一条相同
key、command为-xxx的负向声明,比如:{"key": "ctrl+alt+l", "command": "-editor.action.formatDocument"} - 多个扩展注册相同快捷键?最后加载的扩展或用户配置胜出。但加载顺序不可控,所以最稳的办法是显式覆盖 + 加
when限定场景 - 系统级热键(如 macOS 的 Spotlight
Cmd+Space)VS Code 根本捕获不到,这类组合别硬刚
真正麻烦的不是怎么写,而是怎么让不同语言、不同插件、不同输入法状态下的快捷键互不打架——这需要你持续观察 when 是否被意外绕过,以及 chord 的第一段是否被其他命令截胡。











