when子句是VSCode键绑定中用于限定快捷键触发条件的上下文键表达式,通过检查UI状态(如焦点、文件类型、调试模式等)实现场景化操作,支持布尔运算和字符串匹配。

VSCode 的快捷键可以通过 when 子句限定触发条件,让同一个按键组合在不同编辑场景下执行不同操作——比如 Ctrl+Enter 在普通编辑器中换行,在调试控制台中提交命令,在 Markdown 预览中则什么也不做。
什么是 when 子句
when 是 VSCode 键绑定(keybindings.json)中的一个可选条件字段,值为字符串形式的“上下文键表达式”。它不判断代码内容,而是检查当前 UI 状态:焦点在哪、打开的是什么文件、是否处于调试中、编辑器有没有选中文本等。
例如:"when": "editorTextFocus && !inDebugRepl" 表示“编辑器有文本焦点,且不在调试控制台中”。
常用上下文键与组合逻辑
VSCode 内置数百个上下文键(如 editorTextFocus、inQuickOpen、explorerViewletVisible),多数见名知意。它们支持布尔运算:
-
&&表示“且”,如editorTextFocus && resourceExtname == '.py' -
||表示“或”,如editorTextFocus || inZenMode -
!表示“非”,如!editorReadonly - 用括号分组,如
(editorTextFocus || inDebugRepl) && !inDiffEditor
注意:字符串比较需加单引号,如 resourceLangId == 'typescript';扩展名匹配用 resourceExtname,语言模式用 resourceLangId。
如何查到当前可用的上下文键
最直接的方式是打开命令面板(Ctrl+Shift+P),运行 Developer: Toggle Developer Tools,然后在 Console 中输入:
vscode.debug.activeDebugSession ? console.log('debug active') : console.log('not debugging');
更系统的方法是启用上下文查看器:在设置中搜索 Developer: Enable Context Keys Explorer 并勾选,重启后侧边栏会出现「Context Keys」视图,实时显示当前所有激活的上下文键及其值。
实战:定义一个 Markdown 专属快捷键
想让 Ctrl+M 在 Markdown 文件中插入数学公式($$...$$),其他地方保持原功能(比如注释),可以这样写:
{
"key": "ctrl+m",
"command": "editor.action.insertSnippet",
"args": { "snippet": "$$${1:equation}$$" },
"when": "editorTextFocus && resourceLangId == 'markdown'"
}
关键点:
• 必须确保 resourceLangId 值准确(不是 .md,而是 markdown)
• 若同时想支持 .mdx,可改用 resourceExtname == '.md' || resourceExtname == '.mdx'
• 不要遗漏 editorTextFocus,否则光标不在编辑器时也可能触发
基本上就这些。when 子句不复杂但容易忽略细节,多查 Context Keys Explorer,少猜,效率高很多。










