必须编辑keybindings.json才能真正生效,图形界面仅支持简单增删;涉及冲突覆盖、条件限制或插件干扰时需手动配置,每条规则须为合法json对象并含准确when条件,否则静默失效。

必须编辑 keybindings.json 才能真正生效
图形界面(Ctrl+K Ctrl+S)只能做简单增删,一涉及冲突覆盖、条件限制或插件干扰,就立刻失效。比如你想让 Ctrl+Enter 插入新行,但 GUI 里改完没反应——大概率是被 GitLens 或 Vim 插件劫持了,GUI 根本不显示这类抢占关系。
正确做法是:按 Ctrl+Shift+P → 输入 Preferences: Open Keyboard Shortcuts (JSON) → 回车。VSCode 会打开用户级 keybindings.json,里面是个空数组 [],所有自定义规则都得塞进去。
- 别手动去文件系统找路径,容易选错位置(比如误开成工作区或远程配置)
- 别用
Open Settings (JSON),那是改settings.json的,和快捷键无关 - 每条规则必须是对象,格式为
{"key":"ctrl+enter","command":"editor.action.insertLineAfter","when":"editorTextFocus"}
when 条件不满足时快捷键完全静默
VSCode 不报错、不提示,直接忽略。比如你写了 "when": "editorTextFocus",但当前焦点在终端或资源管理器,按下快捷键就像没绑定一样。
常见 when 值:
-
editorTextFocus:仅在编辑器文本区域有焦点时生效(写代码时) -
textInputFocus:输入框类控件也响应(比如搜索框、重命名输入) -
terminalFocus:只在终端面板激活时触发 - 多个条件用
&&连接,如"editorTextFocus && !editorReadonly"
查当前上下文可用的 when 表达式,打开命令面板 → Developer: Toggle Developer Tools → 控制台里执行 monaco.editor.getConfiguration().editor,看焦点状态字段。
插件快捷键抢占是最大隐形坑
GitLens、Vim、Prettier 等插件自带大量绑定,且优先级高于用户配置。你新加的 Ctrl+Shift+P 可能早被 Vim 扩展占用了,GUI 里搜不到来源,但就是不执行你的命令。
排查方法:
- 打开
Ctrl+K Ctrl+S→ 在搜索框点右侧键盘录制按钮 → 按下你的快捷键组合 → 看结果列表里“来源”列是Extension还是User - 临时禁用可疑插件,再试一次
- 想释放某个组合键,用
-command.id显式禁用,例如:{"key":"ctrl+k ctrl+i","command":"-editor.action.showHover"}
注意:- 必须紧挨着命令名,不能有空格;写成 "- editor.action.showHover" 无效。
非美式键盘用户必调 keyboard.dispatch
中文、日语、德语等键盘布局下,Ctrl+; 常被识别成 Ctrl+:,导致自定义失效。这不是 bug,而是 VSCode 默认按字符 dispatch 导致的映射错乱。
解决方法:打开 settings.json(不是 keybindings.json),加一行:
"keyboard.dispatch": "keyCode"
这个设置让 VSCode 按物理按键位置判断,而不是按输出字符。改完后 Ctrl+; 就能稳定绑定,不用再猜它到底被当成什么键。
真正麻烦的从来不是怎么加一条快捷键,而是搞清它为什么没反应——when 条件、插件抢占、键盘布局这三关,漏掉任何一个,配置都白写。











