不能直接删插件快捷键,因会引发连锁失效;应通过精准 when 表达式在特定上下文中优先命中,或改用 chord 组合键避免冲突。

冲突时为什么不能直接删掉插件的快捷键?
直接禁用插件快捷键看似简单,但容易引发连锁问题:比如禁掉 Prettier 的 Ctrl+Shift+I,可能同时让它的自动保存格式化失效;禁掉 vscode-neovim 的 Esc,Normal 模式就退不出去。VSCode 的快捷键优先级不是“谁先注册谁赢”,而是“谁的 when 条件更精确、更晚加载谁生效”。盲目删除,等于放弃控制权。
如何用 when 表达式把冲突命令“挤出去”?
核心思路是:不跟插件抢键位,而是让自己的绑定在更具体的上下文中“先命中”。关键靠 when 字段组合条件,常见有效组合包括:
-
editorTextFocus && !editorReadonly:只在可编辑的普通代码文件中生效,避开终端、只读文档、设置页等场景 -
editorTextFocus && editorLangId == 'typescript':仅对 TypeScript 文件生效,避免影响 JSON 或 Markdown -
textInputFocus && !terminalFocus:确保光标在编辑器里而非终端输入框中(很多冲突来自终端劫持) -
editorHasSelection && editorTextFocus:有选中文本才触发,防止误操作覆盖全局命令
示例:你想用 Ctrl+D 做“添加下一个匹配项”,但 Vim 插件也绑了它。加这条进 keybindings.json:
[{
"key": "ctrl+d",
"command": "editor.action.addSelectionToNextFindMatch",
"when": "editorTextFocus && !vim.mode == 'Insert'"
}]
注意:vim.mode 是 vscode-neovim 提供的上下文变量,不是所有 Vim 插件都支持——得查对应插件文档确认变量名。
when 条件写错会导致什么?
写错 when 最常见的后果不是报错,而是“看起来没反应”:VSCode 静默忽略不满足条件的按键。容易踩的坑有:
- 拼错上下文变量名,比如把
editorLangId写成languageId(后者无效) - 混淆
textInputFocus和editorTextFocus:textInputFocus范围更广(含搜索框、输入框),editorTextFocus仅限编辑器主区域 - 用错逻辑运算符:多个条件必须用
&&连接,不能用逗号或空格 - 依赖插件变量却没装对应插件,比如写
gitlens:enabled却没装 GitLens,整个条件恒为 false
验证方式很简单:打开命令面板,运行 Developer: Toggle Developer Tools,在 Console 里输入 vscode.workspace.getConfiguration().get('workbench.contextKeys')(部分版本支持),或直接在设置里搜 “context key” 查文档。
什么时候该放弃 when,改用 chord 组合键?
当两个命令必须共存、且无法用 when 区分上下文时(比如都在编辑器里,都要处理光标),硬凑条件反而增加维护成本。这时推荐用 VSCode 原生支持的 chord 键序列,例如:
- 把“格式化文档”从
Shift+Alt+F改成Ctrl+K Ctrl+F,天然避开几乎所有插件占用的单次按键 - 把“切换终端”设为
Ctrl+` Ctrl+T,而不是单独的Ctrl+`(常被终端插件抢占)
chord 键的优先级高于普通单键绑定,且 VSCode 不会把它和插件默认键冲突——因为插件几乎从不注册整套序列。唯一代价是多按一次,但换来的是确定性。
真正难的不是写对 when,而是想清楚你到底要它在哪种状态下生效。很多人反复修改却无效,问题不在语法,而在没理清“这个快捷键,我究竟希望它在什么时刻、对什么内容起作用”。


















