keybindings.json是VSCode唯一生效的快捷键配置入口,GUI仅提供只读视图;所有自定义绑定必须以数组形式写入该文件,key需按ctrl→shift→alt→meta顺序小写书写,command须用命令ID,when条件决定上下文生效范围,覆盖默认键靠数组末尾优先匹配。

keybindings.json 是唯一生效入口,GUI 只能看不能改
VSCode 所有真正起作用的快捷键绑定,只认 keybindings.json 文件里的内容。你在 GUI 界面(Ctrl+K Ctrl+S)里点来点去,只是“查看+临时覆盖”,关掉窗口就失效;想持久、可同步、能调试,必须进 JSON 文件。
打开方式只有一条路:Ctrl+Shift+P(Windows/Linux)或 Cmd+Shift+P(macOS),输入 Preferences: Open Keyboard Shortcuts (JSON) 回车。别点设置页里的“键盘快捷方式”链接——那不是编辑入口,是只读视图。
文件路径固定,首次打开是空数组 [],所有自定义项必须作为对象写在中括号内,例如:
[{"key": "ctrl+1", "command": "editor.action.commentLine"}]
删掉方括号或写成普通对象(没包在数组里)会导致整个文件失效。
key 和 command 字段写错,90% 的“没反应”都出在这儿
key 不是随便按什么就写什么。修饰键顺序必须是 ctrl→shift→alt→meta(macOS 用 cmd,Windows/Linux 用 win),字母键一律小写。写成 "Ctrl+Shift+U" 或 "ctrl-shift-u" 都不识别。
command 必须是命令 ID,不是中文名。比如“格式化文档”对应的是 editor.action.formatDocument,不是 "格式化文档" 或 formatDocument。最稳的办法:在 GUI 快捷键面板里悬停目标命令,看 tooltip 显示的完整字符串。
- 功能键写全称:
f1、escape、backspace——esc或del无效 - 大写字母需显式加
shift:"ctrl+shift+u"绑定的是 Ctrl+Shift+U,不是 Ctrl+U - 多个键用
+连接,不能用空格或逗号
when 条件不满足,快捷键就静默失效
没报错、没提示、按了没反应?八成是 when 表达式没过。它不是可选项,而是上下文开关。漏写或写错,VSCode 就当这个快捷键“不该在此时出现”,直接忽略。
常见组合:
- 想在编辑器里生效:
"when": "editorTextFocus"(没这个,光标在终端或侧边栏时永远不触发) - 只在 Python 文件里生效:
"when": "editorTextFocus && resourceExtname == '.py'"(比editorLangId == 'python'更可靠,避免语言模式未激活导致失效) - 排除只读文件:
"when": "editorTextFocus && !editorReadonly" - 完全放开限制:直接删掉
when字段(等价于true),但要小心误触其他区域
查 when 是否命中,用 Ctrl+Shift+P 运行 Developer: Inspect Context Keys,点编辑器任意位置,看实时变量里 editorTextFocus、resourceExtname 等是否为 true。
覆盖默认快捷键要靠数组顺序,不是“禁用”而是“后写赢”
VSCode 不按“谁先注册谁优先”,而是按 keybindings.json 数组里对象的**书写顺序**匹配:遇到第一个 key 匹配项就执行,后面同 key 的直接跳过。所以想覆盖默认的 Ctrl+K Ctrl+I(悬停提示),不是删掉它,而是在数组末尾加一条:
{"key": "ctrl+k ctrl+i", "command": "unset"}
或者换成你想要的新命令:
{"key": "ctrl+k ctrl+i", "command": "editor.action.addCommentLine"}
注意:扩展自带的快捷键也参与这个排序,且默认优先级低于用户配置。如果某扩展命令始终抢在你前面执行,说明它的绑定被写进了工作区或扩展自己的 keybindings.json,得去对应位置查或加更严格的 when 限定。
真正容易被忽略的是系统级拦截——比如 Ctrl+Alt+Del 在 Windows 上根本到不了 VSCode;还有中文输入法状态下,Ctrl+/ 常被转成全角斜杠或触发输入法菜单,这类问题得换键位,不是调 JSON 能解决的。


















