VSCode快捷键必须通过编辑keybindings.json手动配置,GUI设置仅可读;绑定需用小写key、正确命令ID和when条件,冲突时按数组顺序覆盖,禁用快捷键可设command为空字符串。

快捷键绑定必须改 keybindings.json,GUI 界面只读不写
VSCode 所有真正生效的快捷键都在 keybindings.json 里,设置界面点来点去只是“看”,改了也不存。想重绑,必须进这个文件手动写 JSON。
打开方式:Ctrl+Shift+P → 输入 Preferences: Open Keyboard Shortcuts (JSON) → 回车。文件路径因系统而异,但内容结构统一:是个空数组 [],你加的每条绑定都得是对象,包在方括号里。
-
key字段必须小写、无空格、修饰键顺序固定(ctrl→shift→alt→meta),比如"ctrl+alt+/"合法,"Ctrl+Alt+/"或"ctrl+alt+/ "都无效 -
command必须是命令 ID,不是中文名。比如要绑“切换行注释”,得写"editor.action.commentLine",不是“切换注释” - 字母键默认小写;想触发大写需显式加
shift,如"ctrl+shift+u"绑的是 Ctrl+Shift+U,不是 Ctrl+U - 功能键写全称:
f1、escape、backspace,不能简写为esc或del
Ctrl+/ 注释快捷键冲突?先查谁在抢键
很多人改了 Toggle Line Comment 没反应,不是没生效,是别的扩展或默认绑定把它压住了。VSCode 按 keybindings.json 数组顺序匹配,后写的覆盖前面同 key 的条目。
排查方法:Ctrl+Shift+P → 输入 Developer: Toggle Developer Tools → 在 Console 里执行:
console.log(JSON.stringify(monaco.keymaps.KeybindingsRegistry.getBoundKeybindings('editor.action.commentLine'), null, 2))
能看到所有绑了该命令的快捷键及其 when 条件。常见干扰源:
- Vim 插件把
Ctrl+/映射成其他操作 - Prettier 或 ESLint 插件自带的快捷键覆盖了原生行为
-
when条件太窄,比如只在editorTextFocus && editorLangId == 'javascript'下生效,你在 JSON 文件里按就失效
想全局禁用某个快捷键?直接加 command 为空字符串
VSCode 不提供“删除快捷键”按钮,但可以“禁用”:写一条新绑定,key 和原快捷键一样,command 设为空字符串 "",且不写 when(或写成 "when": "true")。
例如彻底禁用 Ctrl+K Ctrl+I(格式化选中内容):
[{"key": "ctrl+k ctrl+i","command": ""}]
注意:这条必须放在 keybindings.json 数组末尾,否则可能被后续条目覆盖。
- 禁用后,该组合键在任何上下文都不起作用,包括终端、搜索框等
- 如果只想在特定语言禁用,加
when,比如"when": "editorTextFocus && resourceExtname == '.py'" - 禁用 ≠ 卸载插件。有些插件的快捷键是硬编码的,禁用后仍可能通过命令面板调用
重绑后没反应?重点盯 when 条件和语言模式
90% 的“重绑失败”问题出在 when 字段。它不是可选项,而是决定快捷键是否激活的开关。漏掉或写错,就等于没绑。
常用 when 场景:
- 只在编辑器内生效:
"when": "editorTextFocus" - 只在 Python 文件生效:
"when": "editorTextFocus && editorLangId == 'python'"(注意不是'Python',大小写敏感) - 排除 Vim Normal 模式干扰:
"when": "editorTextFocus && !vim.mode == 'Normal'" - 想无条件触发?删掉整个
when字段,或者写"when": "true"
另外务必确认右下角状态栏显示的语言 ID 正确——如果显示 Plain Text 或 Python (Jinja),那 editorLangId == 'python' 就永远不成立,你的绑定自然不触发。











