Ctrl+Shift+P(Windows/Linux)或Cmd+Shift+P(macOS)是VSCode命令面板唯一默认且不可重绑定的快捷键;失效主因是输入法劫持、系统软件占用或内部绑定被修改,需逐一排查。

直接改 keybindings.json 才算真正生效
VSCode 启动快捷键(比如打开新窗口、聚焦已有实例)本身不归 keybindings.json 管——它属于系统级启动行为,和编辑器内部命令无关。但用户常误以为“Ctrl+Shift+P 启动命令面板”这类操作是“启动快捷键”,实际想改的是「触发某功能的快捷键」。所有这类绑定,必须写进 keybindings.json 才稳定生效。
图形界面(Ctrl+K Ctrl+S)只适合临时试水:它生成的规则不暴露 when 条件,一遇插件冲突或上下文切换就失灵。真要控制“什么时候能按、在哪儿生效”,只能手动编辑 JSON 文件。
- 打开方式唯一可靠:按
Ctrl+Shift+P(macOS 是Cmd+Shift+P)→ 输入Preferences: Open Keyboard Shortcuts (JSON)→ 回车 - 别点菜单栏“文件 > 首选项 > 键盘快捷方式”,那只是 GUI 预览页
- 别用
Open Settings (JSON),那是改settings.json的,和快捷键无关 - 文件默认是空数组
[],你加的所有对象都得塞进这个方括号里,不能删掉中括号
command 名写错,按了等于没按
VSCode 命令 ID 和界面文字完全不一致,靠猜或记忆必翻车。比如“格式化文档”对应的是 editor.action.formatDocument,不是 format、document.format 或 formatFile。
- 最准方法:在 GUI 快捷键面板里搜到目标命令 → 右键 → “复制命令 ID”
- 命令名区分大小写,且必须完整;旧插件升级后可能弃用旧 ID,比如
python.execInTerminal已被python.execInTerminalV2替代 - 终端相关命令优先用
terminal.前缀,而不是workbench.action.terminal.(后者不稳定,部分版本已弃用) - 想查全量命令列表?打开 DevTools(
Ctrl+Shift+I)→ Console 标签页 → 执行vscode.commands.getCommands().then(console.log),等输出后搜关键词
when 字段写错,VSCode 会静默忽略
when 不是可选项,省略它等于设为 "when": "true",但很多命令在错误上下文里根本不可用(比如在终端里调 editor.action.commentLine),结果就是报错或无响应。更糟的是,VSCode 从不提示 when 没匹配上,它只是彻底不触发。
- 常见
when表达式:-
"editorTextFocus":仅当编辑器文本区有焦点时生效(不在终端、设置页、搜索框里) -
"terminalFocus":只在集成终端获得焦点时触发 -
"editorTextFocus && editorLangId == 'typescript':必须是 TypeScript 文件且编辑器聚焦 -
"resourceExtname == '.py':扩展名是 .py,比editorLangId更稳妥(语言模式未激活时editorLangId可能为空)
-
- 多个条件必须用
&&连接,不能用空格、顿号或英文逗号 -
"when": true是非法写法,必须是字符串:"when": "true"或带逻辑的字符串 - 验证是否生效:先切到目标上下文(如打开一个 .ts 文件并点击编辑器),再按快捷键;或者在快捷键面板里搜该
command,看右侧是否显示你设的键位
覆盖默认键前,先确认谁在抢你的组合
VSCode 不报冲突,只静默丢弃你的绑定。尤其当你想改 Ctrl+S、Esc、Ctrl+P 这类高频键时,大概率已被 Vim、GitLens、Emacs Mode 等扩展抢先注册。
- 排查方法:在快捷键面板搜索你的目标组合(如
ctrl+s),看“来源”列是Default、Extension还是User - 临时禁用可疑扩展,再测试是否恢复
- 系统级拦截更隐蔽:搜狗拼音、Logitech Options、Raycast 常吞掉
Ctrl+Shift+P或Ctrl+;,退出它们再试一次比重配十次更有效 - 安全禁用默认绑定:不要删默认项,也不要写
"command": ""(VSCode 直接忽略整条)。正确做法是加负号前缀:{"key":"ctrl+k ctrl+i","command":"-editor.action.showHover"} - 同一
key绑了多条规则时,VSCode 按匹配度选最具体的那条,不是按顺序;比如{"key":"ctrl+k","command":"a"}和{"key":"ctrl+k","command":"b","when":"terminalFocus"},只有终端里按才触发b
真正难的从来不是写对 JSON 格式,而是搞清当前焦点在哪、语言模式有没有激活、哪个扩展在后台悄悄改了上下文、系统热键有没有偷偷截胡——这些细节不验一遍,光改配置文件只是在原地打转。


















