本站点文档内容均翻译自code.visualstudio.com,仅供个人学习,如有差异请以官网为准。

当子句上下文

Visual Studio Code 根据 VS Code 用户界面中可见和活动的元素设置各种上下文键和特定值。这些上下文可以用于有选择地启用或禁用扩展命令和用户界面元素,例如菜单和视图。

例如,VS Code 使用 when 子句来启用或禁用命令键绑定,这在 Default Keybindings JSON 中可以看到 (偏好设置:打开默认键盘快捷键 (JSON)):

{ "key": "f5",  "command": "workbench.action.debug.start",
                   "when": "debuggersAvailable && !inDebugMode" },

上面,内置的开始调试命令有键盘快捷键F5,只有在有合适的调试器可用时才会启用(上下文键调试器可用是真实的) 并且编辑器不是在调试模式下 (上下文键在调试模式是错误的)。

条件运算符

A when 子句可以由上下文键组成(例如,在调试模式) 或者可以使用各种运算符来表达更复杂的编辑状态。

逻辑运算符

逻辑运算符允许组合简单的上下文键或包含其他逻辑、相等、比较、匹配的when子句表达式输入:/不在操作符或括号内的表达式。

操作员 符号 示例
"!editorReadonly""!(editorReadonly || inDebugMode)"
&& "textInputFocus && !editorReadonly"
或者 输入:|| "是Linux"输入: || isWindows"

关于逻辑运算符优先级的说明:上表列出了从最高到最低优先级的运算符。示例:

写成 解释为
!foo && bar (!foo) && bar
!foo || bar (!foo) || bar
foo || bar && baz foo || (bar && baz)
!foo && bar || baz (!foo && bar) || baz
!(foo || bar) && baz (保持不变) !(foo || bar) && baz

相等运算符

您可以检查上下文键的值是否与指定的值相等。请注意,右侧是一个值,而不是被解释为上下文键,这意味着它不会在上下文中进行查找。

操作员 符号 示例
平等 输入:== "editorLangId == typescript""editorLangId == 'typescript'"
不平等 不等于 "资源扩展名不等于.js""resourceExtname != '.js'"

笔记:

  • 如果右侧的值是一个包含空白字符的字符串,它必须用单引号括起来 -"resourceFilename == 'My New File.md'"输入:.
  • 输入:===具有相同的行为输入:==,和!==具有相同的行为不等于

比较运算符

您可以将上下文键的值与一个数字进行比较。请注意,操作符的左右两侧必须用空格分隔。foo < 1,但不是foo<1输入:.

操作员 符号 示例
大于 >>= "git打开仓库计数 >= 1"但是不是"git打开仓库计数>=1"
少于 输入:<输入:<= "工作区文件夹计数 < 2"但是不是"工作区文件夹计数<2"

匹配运算符

(以前的名称:键值对匹配运算符)

操作员 符号 示例
比赛 输入:=~ "resourceScheme =~ /^untitled$|^file$/"

有一个匹配运算符 (输入:=~) 用于 when 子句。 表达式键 =~ 正则表达式字面量将右侧视为正则表达式字面量,以匹配左侧。例如,要为所有Docker文件贡献上下文菜单项,可以使用:

   "当""资源文件名 =~ /docker/"

笔记:

  • 右侧输入:=~ 操作符遵循与正则表达式字面量 (参考) 在JavaScript中的相同规则,但字符需要遵循JSON字符串和正则表达式的转义规则。例如,一个匹配子字符串的正则表达式字面量 文件://将会是/文件:\/\//在JavaScript中但是/文件:\\:\\//在 when 子句中,因为JSON字符串中需要转义反斜杠,而在正则表达式模式中需要转义斜杠。
  • 不存在一个操作符输入:!=~,但你可以否定匹配表达式 -!(foo =~ /baz/)输入:.

正则表达式标志

可以使用标志与正则表达式字面量。例如,资源文件名 =~ /json/imyContextKey =~ /baz/si输入:.

支持的标志:输入:s输入:m输入:u输入:.

被忽略的标志:输入:g输入: y

'in' 和 'not in' 条件运算符

当子句的运算符允许在另一个上下文键的值中动态查找上下文键的值。例如,如果您希望为包含某种类型文件的文件夹(或无法静态知道的内容)添加上下文菜单命令,现在您可以使用操作符来实现它。你可以使用不在操作符以检查相反的条件。

操作员 符号 示例
"支持文件夹中的 resourceFilename"
不在 不在 "资源文件名不在支持的文件夹中"

首先,确定哪些文件夹应该支持该命令,并将文件夹名称添加到一个数组中。然后,使用设置上下文 命令 将数组转换为上下文键:

vscode.commands.executeCommand('setContext', 'ext.supportedFolders', [
  'test',
  'foo',
  'bar'
]);

// or

// 在这种情况下(使用对象),值并不重要,重要的是对象中键的存在
// 值必须是简单类型
vscode.commands.executeCommand('setContext', 'ext.supportedFolders', {
  test: true,
  foo: 'anything',
  bar: false
});

然后,在package.json你可以添加一个菜单贡献用于探索者/上下文菜单:

// 注意,这假定你已经定义了一个名为ext.doSpecial的命令
"menus": {
  "explorer/context": [
    {
      "command": "ext.doSpecial",
      "when": "explorerResourceIsFolder && resourceFilename in ext.supportedFolders"
    }
  ]
}

在那个例子中,我们正在采取的值是资源文件名(这是该文件夹的名称)并检查其在值中的存在ext.supportedFolders如果存在,将显示菜单。这个强大的操作符应该能够允许更丰富的条件和动态贡献,以支持条目,例如菜单、视图等。

可用上下文键

以下是可用的上下文密钥中的一些,它们评估为布尔值 true/false。

这里的列表并不完整,您可以通过在键盘快捷键编辑器(偏好设置:打开键盘快捷键)中搜索和筛选,或查看默认快捷键JSON文件(偏好设置:打开默认键盘快捷键(JSON))来找到其他when clause上下文。您还可以使用检查上下文键工具来识别您感兴趣的上下文键。

上下文名称 当……时为真
编辑上下文
编辑器焦点 编辑器有一个焦点,要么是文本,要么是小部件。
编辑器文本焦点 编辑器中的文本获得焦点(光标在闪烁)。
文本输入焦点 任何编辑器都有焦点(普通编辑器、调试REPL等)。
输入焦点 任何文本输入区域都有焦点(编辑器或文本框)。
编辑器标签移动焦点 是否Tab会将焦点移出编辑器。
编辑器有选区 文本已在编辑器中被选中。
编辑器有多个选择 多个文本区域被选中(多个光标)。
编辑器只读 编辑器为只读。
编辑器语言ID 当编辑器相关的语言ID匹配时为真。
示例:"editorLangId == typescript"输入:.
是否在差异编辑器中 当前活动的编辑器是一个差异编辑器。
是否在嵌入编辑器中 当焦点在嵌入式编辑器内时为真。
操作系统上下文
是Linux 当操作系统是Linux时为真。
是否是Mac 当操作系统是 macOS 时为真。
是Windows 当操作系统是Windows时为真。
是否为网页 当从网络访问编辑器时为真。
列表上下文
列表焦点 列表有焦点。
列表支持多选 列表支持多选。
列表有选择或焦点 列表有选择或聚焦。
列表双选 列表包含2个选定的元素。
列表多选 列表可以选择多个元素。
模式上下文
在片段模式中 编辑器处于片段模式。
快速打开 快速打开下拉菜单已获得焦点。
资源上下文
资源方案 当资源 Uri 方案匹配时为真。
示例:"resourceScheme == file"
资源文件名 当资源管理器或编辑器的文件名匹配时为真。
示例:"资源文件名 == gulpfile.js"
资源扩展名 当资源管理器或编辑器的文件名扩展名匹配时为真。
示例:"resourceExtname == .js"
资源目录名 当资源绝对文件夹路径匹配时为真。
示例:"resourceDirname == /users/alice/project/src"
资源路径 当资源绝对路径匹配时为真。
示例:"resourcePath == /users/alice/project/gulpfile.js"
资源语言ID 当资源管理器或编辑器标题语言ID匹配时为真。
示例:"resourceLangId == markdown"
是否是文件系统资源 当资源管理器或编辑器文件是一个可以从文件系统提供者处理的文件系统资源时为真。
资源集 当设置为探索者或编辑文件时为真。
资源 资源管理器或编辑器文件的完整 Uri。
探索上下文
explorerViewletVisible 如果资源管理器视图可见则为真。
探索者视图let聚焦 如果资源管理器视图具有键盘焦点,则为真。
文件资源管理器焦点 如果文件资源管理器部分具有键盘焦点,则为真。
打开编辑器焦点 如果“打开编辑器”部分具有键盘焦点,则为真。
探索者资源是文件夹 如果在资源管理器中选择了文件夹,则为真。
编辑器小部件上下文
查找控件可见性 编辑器查找小部件可见。
建议小部件可见 建议小部件(IntelliSense)可见。
建议小部件多个建议 显示多个建议。
重命名输入可见 重命名输入文本框可见。
参考搜索可见 查看引用 查看Windows已打开。
在参考文献搜索编辑器中 Peek References peekWindows编辑器获得了焦点。
配置.编辑器.稳定窥视 保持峰值编辑器打开(由控制)编辑器.稳定查看设置)。
代码操作菜单可见 代码操作菜单是可见的。
参数提示可见 参数提示是可见的(由控制)编辑器.参数提示.启用设置)。
参数提示多个签名 显示多个参数提示。
调试器上下文
调试器可用 有一个合适的调试器扩展。
在调试模式 调试会话正在运行。
调试状态 活动调试器状态。
可能的值是 不活跃初始化停止跑步输入:.
调试类型 当调试类型匹配时为真。
示例:"debugType == 'node'"输入:.
在调试器中 焦点在调试控制台REPL。
集成终端上下文
终端焦点 集成终端获得了焦点。
终端已打开 打开一个集成终端。
时间线视图上下文
时间线跟随活动编辑器 如果时间轴视图正在跟随活动编辑器,则为真。
时间轴视图项目上下文
时间轴项目 当时间线项目的上下文值匹配时为真。
示例:"timelineItem =~ /git:file:commit\\b/"输入:.
扩展上下文
扩展 当扩展的ID匹配时为真。
示例:"extension == eamodio.gitlens"输入:.
扩展状态 当扩展已安装时为真。
示例:"extensionStatus == installed"输入:.
扩展有配置 如果扩展有配置,则为真。
全局UI上下文
通知焦点 通知获得了键盘焦点。
通知中心可见 通知中心在 VS Code 右下角可见。
通知通知可见 通知提示在 VS Code 右下角可见。
搜索视图可见 搜索视图已打开。
侧边栏可见 侧边栏显示。
侧边栏焦点 侧边栏获得焦点。
面板焦点 面板获得焦点。
在专注模式 Windows处于全屏模式。
是否居中布局 编辑器处于居中布局模式。
工作台状态 可以文件夹(1 个文件夹),或工作区输入:.
工作区文件夹计数 工作区文件夹数量。
替换活动 搜索视图替换文本框已打开。
视图 对于查看/标题查看/项目/上下文,显示命令的视图。
示例:"视图 == 我的视图浏览器ID"输入:.
查看商品 对于查看/项目/上下文, ,上下文值 从树项。
示例: "viewItem == someContextValue"输入:.
网页视图ID 对于网页视图/上下文,用于在其中显示命令的WebView ID。
示例:"webviewId == catCoding"输入:.
是否全屏 当Windows处于全屏模式时为真。
聚焦视图 当前聚焦视图的标识符。
可以返回导航 如果可以返回导航,则为真。
可以向前导航 如果可以向前导航则为真。
可以导航到上次编辑位置 如果可以导航到最后编辑的位置则为真。
全球编辑器用户界面上下文
文本比较编辑器可见 至少有一个 diff(比较)编辑器是可见的。
文本比较编辑器活动 一个差异(比较)编辑器正在活动。
编辑器是否打开 如果有一个编辑器打开,则为真。
群组编辑人数 一个小组中的编辑人数。
活动编辑器组为空 如果活动编辑组没有编辑器,则为真。
活动编辑器组索引 一个从开始的数字1 反映编辑网格中编辑组的位置。
索引为 1将位于左上角。
活动编辑组最后 将会是为编辑网格中的最后一个编辑组。
多个编辑器组 当存在多个编辑器组时为真。
活动编辑器 组中活动编辑器的标识符。
活动编辑器脏了 当组中活动编辑器脏时为真。
活动编辑器不是预览 当组中的活动编辑器不在预览模式时为真。
活动编辑器是否固定 当组中的活动编辑器被固定时为真。
在搜索编辑器 当焦点在搜索编辑器内时为真。
活动的Web视图面板ID 当前活动的 webview面板的ID。
活动自定义编辑器ID 当前活动的自定义编辑器的ID。
配置设置上下文
配置编辑器启用迷你地图 当设置为真时编辑器.小地图.启用输入:.

注意:您可以在此使用任何以为前缀的布尔值评估的用户或工作区设置"配置."输入:.

可见/聚焦视图当子句上下文

您可以有一个when子句来检查特定的视图是否可见或聚焦。

上下文名称 当……时为真
视图.${viewId}.可见 当特定视图可见时为真。
示例:&view工作台资源管理器文件视图可见
聚焦视图 当特定视图聚焦时为真。
示例:"focusedView == 'workbench.explorer.fileView'"

查看标识符:

  • 工作台.资源管理器.文件视图- 文件资源管理器
  • 工作台.资源管理器.打开编辑器视图- 打开编辑器
  • 大纲- 大纲视图
  • 时间线- 时间线视图
  • 工作台.scm- 源代码管理
  • workbench.scm.repositories- 源代码控制库
  • 工作台.调试.变量视图- 变量
  • 工作台调试观察表达式视图- 观看
  • 工作台调试调用堆栈视图- 调用栈
  • 工作台.调试.已加载脚本视图- 已加载脚本
  • 工作台调试断点视图- 停止点
  • 工作台.调试.反汇编视图- 拆解
  • 工作台.视图.扩展.已安装- 已安装的扩展
  • extensions.recommendedList- 推荐的扩展
  • 工作台.面板.标记.视图- 问题
  • 工作台.面板.输出- 输出
  • 工作台.面板.交互式解释器视图- 调试控制台
  • 终端- 集成终端
  • 工作台.面板.评论- 评论

可见视图容器当子句上下文

您可以有一个when子句来检查特定的视图容器是否可见

上下文名称 当……时为真
活动视图 当视图容器在侧边栏中可见时为真。
示例: "activeViewlet == 'workbench.view.explorer'"
活动面板 当视图容器在面板中可见时为真。
示例:"activePanel == 'workbench.panel.output'"
活跃辅助 当视图容器在次侧侧边栏中可见时为真。
示例: "activeAuxiliary == 'workbench.view.debug'"

查看容器标识符:

  • 工作台.视图.资源管理器- 文件资源管理器
  • 工作台.视图.搜索- 搜索
  • 工作台.视图.源代码管理- 源代码管理
  • 工作台.视图.调试- 运行
  • 工作台.视图.扩展- 扩展
  • 工作台.面板.标记- 问题
  • 工作台.面板.输出- 输出
  • 工作台.面板.交互式编程语言环境- 调试控制台
  • 终端- 集成终端
  • 工作台.面板.评论- 评论

如果你想要一个仅在特定视图容器获得焦点时才启用的when子句,请使用侧边栏焦点面板焦点辅助栏焦点结合活动视图活动面板活跃辅助上下文键。

例如,下面的 when 子句仅在文件资源管理器获得焦点时为真:

"sideBarFocus && activeViewlet == 'workbench.view.explorer'"

检查 when 子句中的一个设置

在 when 子句中,您可以通过在其前加上 来引用配置(设置)值配置。例如配置编辑器的自动完成功能config.breadcrumbs.enabled输入:.

添加自定义when子句上下文

如果你正在编写自己的 VS Code 扩展,并且需要使用 when 子句的上下文来启用/禁用命令、菜单或视图,而现有的键无法满足你的需求,你可以添加自己的上下文键设置上下文命令。

下面的第一个示例将键设置为myExtension显示我的命令to true,您可以在此处用于启用命令或与属性。第二个示例存储一个值,您可以使用when子句来检查冷却打开事物的数量是否大于2。

vscode.commands.executeCommand('setContext', 'myExtension.showMyCommand', true);

vscode.commands.executeCommand('setContext', 'myExtension.numberOfCoolOpenThings', 4);

检查上下文密钥实用工具

如果您希望在运行时查看所有当前活动的上下文密钥,您可以使用开发者:检查上下文密钥命令从命令面板(⇧⌘P(Windows, Linux Ctrl+Shift+P)。检查上下文密钥将在VS Code开发者工具控制台标签中显示上下文密钥及其值(帮助 > 切换开发者工具)。

当你运行开发者:检查上下文键时,你的光标将高亮显示 VS Code 用户界面中的元素,当你点击一个元素时,当前的上下文键及其状态将作为一个对象输出到控制台。

检查上下文密钥输出

活动上下文密钥的列表是广泛的,可能包含自定义上下文密钥,这些密钥来自您已安装的扩展。

注意:一些上下文密钥是VS Code内部使用,可能会在未来更改。