真正生效的快捷键绑定必须写入keybindings.json文件;需通过Ctrl+Shift+P(Win/Linux)或Cmd+Shift+P(macOS)执行“Preferences: Open Keyboard Shortcuts (JSON)”打开,该文件默认为空数组[],所有自定义项须以合法JSON对象形式写入其中。

所有真正生效的快捷键绑定,都必须写进 keybindings.json 文件里;GUI 界面只展示结果,不控制逻辑。
怎么打开并正确编辑 keybindings.json
别点“设置”里的键盘快捷方式页面去改——那只是只读视图。按 Ctrl+Shift+P(Windows/Linux)或 Cmd+Shift+P(macOS),输入 Preferences: Open Keyboard Shortcuts (JSON) 回车。文件路径固定:
- Windows:
%APPDATA%\Code\User\keybindings.json - macOS:
~/Library/Application Support/Code/User/keybindings.json - Linux:
~/.config/Code/User/keybindings.json
首次打开是空数组 [],所有自定义项必须作为对象写在方括号内,不能删掉中括号,也不能写成单个对象(会解析失败)。
key 和 command 字段怎么填才不白配
常见失效不是语法错,而是值不合法:
-
key必须小写、无空格;修饰键顺序固定为ctrl→shift→alt→meta(macOS 用cmd,Windows/Linux 用win);"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 条件
90% 的“失灵”问题出在 when 表达式没匹配上下文,它静默失效,不报错也不提示:
- 想在编辑器里生效?必须加
"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
覆盖默认快捷键或禁用它,关键看数组顺序
VSCode 不是“先来后到”,而是按 keybindings.json 数组顺序匹配,后写的条目会覆盖前面同 key 的绑定:
- 想禁用某默认快捷键,把
command设为"unset",例如屏蔽Ctrl+K Ctrl+I的悬停提示:{"key": "ctrl+k ctrl+i", "command": "unset"} - 扩展自带的快捷键可能依赖其激活状态;如果命令 ID 不生效,先确认扩展已启用,并检查其是否提供该命令
- 避免使用
Ctrl+Alt+X类组合:Windows 系统级热键(如Ctrl+Alt+Del)会拦截,VSCode 根本收不到事件
最易被忽略的一点:当你在多个地方(用户级、工作区级、扩展级)配置了快捷键,最终生效的是优先级最高且 when 匹配成功的那一条——而用户级 keybindings.json 优先级最高,但它本身内部的顺序仍决定覆盖关系。











