直接编辑keybindings.json才是真正的自定义,图形界面仅支持简单增删;必须用ctrl+shift+p(win/linux)或cmd+shift+p(macos)打开该文件,添加含key、command及可选when字段的json对象,when写错会导致静默失效,冲突时vscode不提示而直接忽略。

直接改 keybindings.json 才算真正自定义
图形界面(Ctrl+K Ctrl+S)只能增删简单绑定,没法加 when 条件、没法覆盖被扩展劫持的命令、也没法调试为什么键没反应。真要控制触发时机或解决“按了没用”,必须编辑 keybindings.json。
打开方式只有这一种可靠:按 Ctrl+Shift+P(Windows/Linux)或 Cmd+Shift+P(macOS),输入 Preferences: Open Keyboard Shortcuts (JSON) 回车。别去菜单里点,容易开错成 Settings 页面。
这个文件路径是:
- Windows:
%APPDATA%\Code\User\keybindings.json - macOS:
~/Library/Application Support/Code/User/keybindings.json - Linux:
~/.config/Code/User/keybindings.json
它默认是空数组 [],所有你加的规则都得塞进去,格式必须是合法 JSON 对象,每个对象含 key、command,when 可选。
when 字段写错,快捷键就静默失效
VSCode 不会报错,也不会提示 when 错了——它只是不触发。常见错误包括:
- 把
editorTextFocus用在 Markdown 预览页,其实该用markdownPreviewFocus - 多个条件用空格或中文顿号分隔,正确写法是
"when": "editorTextFocus && editorLangId == 'python'" - 误写成布尔值:
"when": true是错的,必须是字符串"when": "true"或带逻辑表达式的字符串 - 用了不稳定命令前缀,比如
workbench.action.terminal.toggleTerminal,应改用terminal.toggleTerminal
验证 when 是否生效,最简单方法是打开对应上下文(比如打开一个 .py 文件并聚焦编辑器),再按快捷键看是否触发;或者在快捷键面板里搜索该命令,看右侧是否显示你设的键位已激活。
冲突不是“提示你”,而是“直接忽略”
VSCode 遇到冲突不会弹窗警告,尤其当冲突来自系统级快捷键(如 Windows 的 Ctrl+Shift+Esc)或已启用的扩展(如 Vim 插件占用了 Esc),你的绑定会被静默丢弃。
排查步骤很直接:
- 在快捷键面板搜索你要绑定的
command名,看是否已有其他键位占用 - 临时禁用可疑扩展(特别是 Vim/Emacs 模拟类),再测试
- 检查是否用了平台敏感修饰键:macOS 上
cmd不能写成ctrl,Windows 上ctrl+alt+shift+k顺序错可能导致识别失败 - 右键某条绑定 → “清除键绑定”,它会在
keybindings.json里写入{"key": "", "command": "-"},比手动删更安全
注意:多个相同 command 绑定共存时,后加载的(即 JSON 数组中位置靠后的)优先级更高,但前提是 when 条件匹配度更高者胜出。
恢复默认 ≠ 重装 VSCode,但删错就难回退
想清空所有自定义?别删整个 keybindings.json 文件,只清空内容,保留 [] 即可。如果已经删了或改乱了,最快恢复方式是:
- 打开快捷键面板(
Ctrl+K Ctrl+S)→ 右上角 ⋯ → “重置为默认值” - 或者手动打开
keybindings.json,全选删除全部内容,保存,VSCode 会自动还原为默认行为
但要注意:如果你之前复制过别人配置、或混用了不同平台的键位(比如把 macOS 的 cmd 直接粘贴到 Windows 环境),恢复后可能仍残留异常。最稳妥的做法是先关掉 Settings Sync,再清理 keybindings.json,避免跨设备污染。











