VSCode快捷键生效遵循用户级>工作区级>插件默认>内置默认的优先级,但需满足语法合法、when条件匹配且未被更高层显式禁用;常见失效原因包括插件取消命令、when条件过宽或配置文件损坏。

为什么你新加的快捷键没生效
VSCode 的快捷键不是“谁写在后面谁赢”,而是有明确优先级:用户级 keybindings.json > 工作区级 .vscode/keybindings.json > 插件默认绑定 > 内置默认。但这个顺序有个关键前提:所有配置都语法合法、when 条件匹配、且没被更高层显式禁用。常见失效场景是——你写了新绑定,但某插件(比如 Vim)在工作区或语言块里加了 "command": "-editor.action.formatDocument",直接把命令从绑定表里踢掉了,你的新 key 就永远找不到目标 command。
- 打开命令面板
Ctrl+Shift+P,输入Preferences: Open Keyboard Shortcuts (JSON),确认你改的是用户级路径(Windows 是%APPDATA%\Code\User\keybindings.json,macOS 是~/Library/Application Support/Code/User/keybindings.json) - 检查文件是否为空数组
[]或只剩注释——VSCode 会把空数组当有效配置,导致全部回退到内置默认 - 搜索
-字符,确认没有工作区或插件在悄悄取消你依赖的命令
如何让 Ctrl+Enter 真正只在编辑器里插入空行
很多人绑了 editor.action.insertLineAfter 却发现按 Ctrl+Enter 时终端也响应、甚至设置页里也触发——问题出在 when 条件太宽或缺失。VSCode 不会自动帮你加上下文限制,全靠你手动写准。
- 正确写法必须带
when:{"key": "ctrl+enter", "command": "editor.action.insertLineAfter", "when": "editorTextFocus && !editorReadonly"} -
editorTextFocus表示光标在可编辑文本区域;!editorReadonly避免在只读文件(如 diff 视图)里误触发 - 别用
textInputFocus——它覆盖终端、搜索框、甚至命令面板输入框,冲突风险极高 - 如果想在 Markdown 预览里禁用,可加
&& !isMarkdownPreviewFocused
插件快捷键抢了你的 Ctrl+C,怎么不卸载插件就抢回来
Vim、GitLens、Office 插件常默认绑定基础热键,但 VSCode 提供了比“禁用插件”更轻量的解法:用负号 - 精准取消特定命令绑定,且不影响插件其他功能。
- 先在快捷键面板搜
Ctrl+C,找到来源为vscodevim.handleKey或gitlens.showQuickFileHistory的条目 - 右键 → “Copy Command ID”,得到类似
extension.vim_ctrl+c或完整 ID - 在
keybindings.json里加一条:{"key": "ctrl+c", "command": "-extension.vim_ctrl+c"} - 注意:
-必须紧贴command值开头,不能有空格;ID 必须和面板里显示的一模一样(大小写、点、下划线都不能错)
更新后快捷键全丢,别急着重写配置
VSCode 大版本更新(如 1.89→1.90)可能因目录结构变更、插件 API 不兼容或 JSON 校验变严格,导致 keybindings.json 被静默忽略或重命名成 .bak。此时最稳的恢复路径不是重装,而是定位损坏点。
- 打开文件系统,直接去用户
User/目录下看keybindings.json是否还在,有没有变成keybindings.json.bak或keybindings.json.old - 用外部 JSON 校验器(如 jsonlint.com)粘贴内容,检查是否有多余逗号、单引号、或
//注释(JSON 不支持) - 如果文件存在但为空,不要手动补
[]——删掉整个文件,重启 VSCode,它会自动重建干净的默认绑定逻辑 - 别信“重启就能好”,很多更新后的问题要等第二次启动才加载新配置,第一次只是迁移旧数据
真正容易被忽略的是 when 条件的隐式覆盖:你写的条件看似合理,但和某个插件的 when 交集为真时,VSCode 会选优先级更高的那条——而这个“更高”未必是你以为的那个。


















