VSCode快捷键的when子句:创建上下文感知的快捷键

18次阅读

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

VSCode快捷键的when子句:创建上下文感知的快捷键

VSCode 的快捷键可以通过 when 子句限定触发条件,让同一个按键组合在不同编辑场景下执行不同操作——比如 Ctrl+Enter 在普通编辑器中换行,在调试控制台中提交命令,在 markdown 预览中则什么也不做。

什么是 when 子句

when 是 VSCode 键绑定(keybindings.json)中的一个可选条件字段,值为字符串形式的“上下文键表达式”。它不判断代码内容,而是检查当前 UI 状态:焦点在哪、打开的是什么文件、是否处于调试中、编辑器有没有选中文本等。

例如:"when": "editorTextFocus && !inDebugRepl" 表示“编辑器有文本焦点,且不在调试控制台中”。

常用上下文键与组合逻辑

VSCode 内置数百个上下文键(如 editorTextFocusinQuickOpenexplorerViewletVisible),多数见名知意。它们支持布尔运算:

  • && 表示“且”,如 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,少猜,效率高很多。

text=ZqhQzanResources