when子句用于控制VS Code中快捷键的生效时机,其基本结构包含key、command和when条件,如"editorTextFocus && !editorReadonly"表示仅在编辑器聚焦且非只读时生效;支持常见上下文变量如editorTextFocus、textInputFocus及逻辑操作符&&、||、!;高级用法包括终端中限定Ctrl+C复制、区分补全建议与换行的Enter行为、禁用特定语言(如Markdown)的Tab缩进;插件开发者可使用setContext创建自定义上下文并在when中调用;调试时可通过“Developer: Inspect Context Keys”检查当前激活的上下文状态,确保条件正确匹配。

在 VS Code 中,when 子句用于控制快捷键、菜单项或命令的启用条件。它常出现在 keybindings.json 和 package.json(扩展开发)中,决定某条快捷键何时生效。掌握其高级用法,能让你更精准地定制操作行为。
1. when 子句的基本结构
在 keybindings.json 中,每条快捷键可以包含一个 when 条件:
"key": "ctrl+d",
"command": "editor.action.addSelectionToNextFindMatch",
"when": "editorTextFocus && !editorReadonly"
}
这个例子表示:仅当编辑器获得焦点且未只读时,Ctrl+D 才触发“添加下一个匹配项”操作。
2. 常见上下文变量与逻辑组合
when 支持多种内置上下文(context)变量,还可通过逻辑运算组合:
- editorTextFocus:编辑器正在输入文本
- editorHasSelection:有选中文本
- textInputFocus:任意输入框聚焦(包括搜索框)
- inQuickOpen:正在使用快速打开(Ctrl+P)
- panelFocus:焦点在底部面板(如终端、输出)
- sideBarFocus:侧边栏聚焦
- !editorReadonly:编辑器非只读
支持的逻辑操作符:
- &&:与
- ||:或
- !:非
3. 高级场景示例
场景一:仅在终端中启用 Ctrl+C
{ "key": "ctrl+c", "command": "workbench.action.terminal.copySelection", "when": "terminalFocus && terminalTextSelected" }这样,在终端有选中文本且获得焦点时,Ctrl+C 才执行复制,避免与编辑器冲突。
场景二:区分编辑器与搜索框中的 Enter 行为
{ "key": "enter", "command": "acceptSelectedSuggestion", "when": "suggestWidgetVisible && textInputFocus" }, { "key": "enter", "command": "editor.action.insertLineAfter", "when": "editorTextFocus && !suggestWidgetVisible" }第一个绑定让 Enter 在代码补全弹窗出现时确认建议;第二个确保无补全时正常换行。
场景三:禁用特定语言下的快捷键
{ "key": "tab", "command": "editor.action.indentLines", "when": "editorTextFocus && !editorReadonly && resourceLangId != 'markdown'" }在 Markdown 文件中按下 Tab 不再整体缩进行,可配合其他方式处理列表缩进。
4. 自定义上下文(扩展开发专用)
如果你是插件开发者,可通过 API 注册自定义上下文,然后在 when 中使用:
之后可在快捷键中写:
"when": "myExtension.inSpecialMode"这适合实现模式切换类功能,比如进入“审查模式”后启用一组专属快捷键。
5. 调试 when 条件
如果快捷键不生效,可能是 when 条件未满足。使用以下方法排查:
- 打开命令面板 → “Developer: Inspect Context Keys”
- 实时查看当前所有激活的上下文变量
- 检查你依赖的条件是否为 true
基本上就这些。合理使用 when 子句,能让快捷键更智能、更安全,避免误触发。关键是理解当前编辑环境的状态,并用上下文精确描述它。










