在 VS Code 中试试

2021 年 4 月 (版本 1.56)

更新 1.56.1:本次更新修复了这些安全问题

更新 1.56.2:本次更新修复了这些问题

下载:Windows:x64 Arm64 | Mac:Universal Intel silicon | Linux:deb rpm tarball Arm snap


欢迎来到 Visual Studio Code 2021 年 4 月发布。VS Code 团队本月一直在忙于一些需要较长时间的更新,所以请查看预览功能部分了解即将推出的内容。以下是此版本中包含的一些重点内容

如果您想在线阅读这些版本说明,请访问 code.visualstudio.com 上的更新

加入我们的直播,在 5 月 11 日星期二太平洋时间上午 8 点(伦敦时间下午 4 点)观看VS Code 团队的直播,了解此版本的新功能演示,并在线提问。

Insiders:想尽快尝试新功能吗?您可以下载每夜的 Insiders 版本,并在最新更新发布后立即尝试。

工作台

改进的操作悬停反馈

我们改进了工作台各处操作的鼠标悬停反馈,以提供更好的可点击操作用户体验。

Actions hover feedback is improved with a background color.

无标题编辑器提示

我们注意到许多新用户不知道必须设置语言才能获得完整的 VS Code 语言支持。为了解决这个问题,我们为无标题编辑器引入了一个提示,帮助用户设置正确的语言模式。无标题提示可能对高级用户没有帮助,因此一旦您开始输入,它就会立即消失,或者您可以选择不再显示来永远不再显示该提示。

Untitled editor shows an untitled hint

默认自定义编辑器和笔记本解析

如果您有两个编辑器都声称应该是某个资源的默认编辑器(例如,一个图片查看器和一个图片编辑器),您将收到一个提示来解决冲突。

在下面的短视频中,用户打开了一个 PNG 文件,该文件与两个编辑器相关联。通知允许用户继续使用 Luna Paint 图像编辑器或配置新的默认编辑器,用户选择了配置新的默认编辑器并开始使用二进制 Hex Editor。

A image editor is opened and the user is prompted with a notification to configure their default editor or keep the current one

更新的自定义对话框

我们更新了自定义对话框样式,您可以通过设置 "window.dialogStyle": "custom" 来启用。VS Code 现在会调暗背景,以便更好地突出对话框,并且在有多个操作时使用次要按钮样式。

An example of a custom dialog with a dimmed background and secondary buttons

产品图标主题:Fluent Icons

您可以使用以下颜色标记来主题化次要按钮样式

  • button.secondaryBackground
  • button.secondaryForeground
  • button.secondaryHoverBackground

仅自动更新已启用的扩展

您现在可以将 VS Code 配置为仅自动更新当前已启用的扩展。

Auto update only enabled extensions

主题:GitHub Light Theme

终端

配置文件改进

上一个迭代,我们引入了终端配置文件。终端现在支持使用 terminal.integrated.defaultProfile.<platform> 设置来设定默认配置文件。

配置文件系统还添加了环境变量和图标支持

"terminal.integrated.profiles.windows": {
  "PowerShell": {
    "source": "PowerShell",
    "overrideName": true,
    "icon": "terminal-powershell",
    "env": {
      "TEST_VAR": "value"
    }
  }
},
"terminal.integrated.defaultProfile.windows": "PowerShell",

今后,这些设置是切换默认终端配置的推荐方式,而 terminal.integrated.shellterminal.integrated.shellArgs 设置已被弃用。

新的终端选择器

配置文件和设置快捷方式已从下拉菜单移出,移到了一个带有下拉菜单的新 + 按钮中。

When selected, the dropdown button displays a menu

这也支持基于非默认配置文件创建新的拆分终端。

新的键绑定

此版本终端有一些新的默认键绑定

  • 移动到上一个终端 - Ctrl+PageUp (macOS Cmd+Shift+])
  • 移动到下一个终端 - Ctrl+PageDown (macOS Cmd+shift+[)
  • 聚焦终端标签页视图 - Ctrl+Shift+\ (macOS Cmd+Shift+\) - 终端标签页预览

和往常一样,这些默认键绑定可以通过键绑定系统删除或添加自定义键绑定。

Linux 选中内容粘贴命令

新命令 workbench.action.terminal.pasteSelection 在 Linux 上可用,用于从选中剪贴板粘贴到终端。

终端工作空间 shell 权限已更改

为了支持与配置文件相关的即将到来的更改,如果 .vscode/settings.json 中存在终端设置,原来显示的提示已被移除,转而采用一个设置来选择是否使用工作空间设置。请注意,这在不受信任的工作空间中可能存在危险。

"terminal.integrated.allowWorkspaceConfiguration": true

当工作空间信任默认启用时,我们将移除此项并使用该系统。

任务

移除 Tasks 0.1.0 并进行升级

Tasks 2.0.0 已可用并运行良好三年多,而 Tasks 0.1.0 在此期间一直被弃用。鉴于我们的无 Node.js 渲染器目标,Tasks 0.1.0 已被删除,而不是移植到无 Node.js 环境。当您打开包含 0.1.0 任务的文件夹时,它们将自动为您升级到 2.0.0 版本。

Tasks upgrade notification

终端标签页中不再有“Task”前缀

使用新的终端标签页功能时,终端名称中将不再添加“Task”前缀。取而代之的是,任务通过“工具”图标表示,以更好地利用可用空间。

Tasks as terminal tabs

与 eslint-stylish 更好地匹配

$eslint-stylish 问题匹配器更准确地匹配多行问题。

调试

断点视图改进

数据断点显示访问类型

对于数据断点,VS Code 现在在断点视图中显示其名称旁边的访问类型(“读”、“写”或“访问”)。

The Breakpoints view shows the access types "Read", "Write" and "Access" being rendered next to the breakpoint name

更好的异常断点状态/错误报告

对于异常断点,VS Code 现在在断点视图中显示其单独的验证状态和详细原因。如果某个异常断点无法验证(例如,因为其条件包含语法错误),它将被灰显,并且在悬停时显示相应的错误消息。

The Breakpoints view shows disabled exception breakpoints that on hover show the error message

其他 UI 改进

停止和断开命令的替代行为

调试会话通常通过 Debug: StopDebug: Disconnect 命令停止。如果调试会话的类型是 launchStop 命令不仅会停止会话,还会终止被调试程序。对于 attach 类型的调试会话,有一个 Disconnect 命令,它会停止调试并恢复被调试程序的执行。

在此版本中,现在可以通过在调试工具栏中触发命令时按下 Alt 修改键来切换此行为。修改此行为使得对于 launch 类型的调试会话,可以保留被调试程序继续运行,而对于 attach 类型的调试会话,可以终止被调试程序。除了在默认命令中使用 Alt 键外,还可以从命令面板访问 Debug: StopDebug: Disconnect 这两个命令,适用于 launchattach 调试会话。

此替代行为仅适用于已选择加入此功能的调试扩展。

改进的安装缺失调试扩展流程

如果用户想开始调试但尚未安装提供调试支持的必需语言扩展(例如 Python 或 Java),我们改进了流程。当发生这种情况时,VS Code 现在会提示用户安装相应的扩展。

VS Code prompts to install the Python extension if it is missing

调用堆栈列停止指示器

VS Code 现在在被调试程序在某行停止时,每次都会渲染调用堆栈列指示器。这应该有助于识别程序当前在哪一行停止。

An code execution is stopped and a column indicator is rendered in the middle of a line

某些语言默认启用内联值

VS Code 的调试器 UI 支持内联值,可在逐行执行源代码时在编辑器中内联显示变量值。此功能基于 VS Code 核心的通用实现,因此可能并非适用于所有语言,有时甚至会显示不正确的值,因为通用方法不理解底层的源语言。由于这些原因,此功能默认未启用。

有了新的调试器扩展 API,语言扩展现在可以提供正确的内联值支持,并且我们默认启用了改进的内联值功能。

要启用此功能,debug.inlineValues 设置有一个新的(默认)值 auto。当设置为 auto 时,对于那些支持“改进的内联值”的语言,内联值将自动启用。

Debugger for Java 扩展是首批采用此 API 的调试器扩展之一。在下面的截图中,Java 变量的准确值显示在它们的使用位置旁边。

Java extension displaying inline values in the editor while debugging

您可以使用 Inline Values support for PowerShell 扩展,在调试 PowerShell 脚本时获取内联值。

停止时显示调试视图

debug.openDebug 设置的默认值现在是 openOnDebugBreak,这样在每次命中断点时,VS Code 都会打开调试视图。首次启动会话时也会显示调试视图。

JavaScript 调试

和往常一样,完整的更改列表可以在 vscode-js-debug 变更日志中找到。

改进的断点诊断工具可发现性

基于启发式算法,如果 VS Code 检测到用户在绑定断点时可能遇到问题,它会显示一条通知,建议打开断点诊断工具。

Notification that reads "It looks like you might be having trouble with breakpoints, would you like to open our diagnostic tool?"

在我们测试其有效性和侵扰性时,此提示最初仅对部分用户可见。

私有类字段支持

私有类字段现在可见,可以在调试器中检查。

笔记本

切换行号

您现在可以在当前会话中通过单元格工具栏临时切换单元格的行号显示,或者通过 notebook.lineNumbers 设置更改所有笔记本的行号可见性。

Toggle line number of a cell

按文件类型设置单元格工具栏位置

现在可以通过 notebook.cellToolbarLocation 设置按文件类型自定义单元格工具栏位置。例如,您可以将 GitHub Issue 笔记本的单元格工具栏放在右侧,而 Jupyter 笔记本的则放在左侧。

Markdown 单元格中的数学支持

您现在可以在笔记本 Markdown 单元格中使用数学公式

Math being rendered in a Jupyter notebook

VS Code 使用 KaTeX 渲染公式。有两种方法可以将数学公式嵌入到 Markdown 单元格中

  • 使用单美元符号:$...$。这将创建内联数学公式。
  • 使用双美元符号:$$...$$。这将创建居中、块级数学公式。

我们使用实验性的笔记本标记渲染 API 实现了数学支持,该 API 仍在开发中。我们此 API 的最终目标是也允许扩展来扩展笔记本中 Markdown 的渲染。

语言

Markdown 预览排版器支持

新的 markdown.preview.typographer 设置允许您在内置 Markdown 预览中启用智能引号和简单的排版替换

在下面的示例中,Markdown 文本(例如 (c))在预览中会自动替换为版权符号 ©

Smart quotes and text replacement in the Markdown preview

markdown.preview.typographer 设置默认禁用。

更多文件被识别为 shell 脚本

文件扩展名为 .xsession.xprofile 的文件将被自动识别为 shellscript。

预览功能

终端标签页

终端中的标签页作为预览功能提供,可以通过以下设置启用

"terminal.integrated.tabs.enabled": true

The tabs view is a split pane to the right of two split terminals. It contains icons and labels for each terminal instance.

启用后,新的标签页视图默认仅在至少有两个终端时显示。对于单个终端,标签页会“内联”到面板标题中,如下所示

Terminal tab inlined into the panel title for a single terminal

每个标签页都支持通过上下文菜单执行多项操作。

Right-clicking on a tab displays a menu

悬停时可执行拆分和终止终端操作。

Hovering the tab item shows inline action icons

我们尝试将新标签页的行为与资源管理器的工作方式对齐。以下是一些其他行为

  • 双击空白区域将创建一个新的终端。
  • 双击分隔线将切换标签页视图的宽度,可在显示所有标题而不截断的“理想”尺寸和仅显示图标的窄视图之间切换。
  • 可以使用 terminal.integrated.tabs.location 设置将标签页移动到左侧。
  • terminal.integrated.tabs 下提供了各种其他配置设置。

终端状态

除了标签页,我们还引入了终端的状态概念。一个终端可以有多个状态,每个状态都表示终端可能临时处于的某种状态,其中严重性最高的状态显示在标签页旁边。状态图标出现在标签页视图中终端标题的右侧。悬停时,会显示状态详细信息以及任何相关操作。

On a tab associated with a terminal that requires a relaunch, a yellow triangle with an exclamation mark is to the right of the terminal title

目前支持以下状态

  • 需要重新启动:如果扩展想要更改终端的环境,则使用警告图标状态。
  • 已断开连接:当终端与其进程失去连接时,使用插头图标状态。
  • 响铃:通过 terminal.integrated.enableBell 设置启用响铃且终端响铃触发时,会出现一个响铃图标。

我们计划很快支持任务状态,这样即使不激活标签页,也能一目了然地了解任务运行状态。

欢迎页导览

我们扩展了用于在入门页放置内容的 walkthroughs 贡献点,以允许在步骤描述和步骤主要内容中使用 Markdown。扩展对入门页的贡献是一个实验性功能,可以通过 "workbench.welcomePage.experimental.extensionContributions": true, 启用。

下面的短视频展示了一个示例导览,用于教用户了解 Luna Paint 扩展。

Stepping through the Luna Paint extension's walkthrough contribution

活动栏和面板中的自定义悬停支持

在这个里程碑中,我们添加了在活动栏和面板中对自定义悬停的实验性支持。您可以使用设置 workbench.experimental.useCustomHover 启用自定义悬停。

Custom hover in Activity Bar and Panel

主题:GitHub Light Theme 产品图标主题:Fluent Icons

远程仓库 (RemoteHub)

作为此版本的一部分,我们正在预览一个新的内置扩展:远程仓库 (RemoteHub),它允许您直接在 VS Code 中即时浏览、搜索、编辑和提交到任何 GitHub 仓库,而无需在本地克隆或拥有该仓库。目前,此功能仅在 VS Code 的 Insiders 版本中可用。

入门

要开始使用,请从命令面板运行 Open Remote Repository... 命令。然后,您可以粘贴任何 GitHub URL,或选择搜索特定的仓库或拉取请求。

Open Remote Repository picker

主题:Amethyst Dark Theme

输入 URL 或选择仓库或拉取请求后,VS Code 将为该仓库打开一个新的工作空间。状态栏左侧的远程状态指示器会显示远程仓库连接的远程提供程序名称,例如 GitHub。

Remote Repositories Demo showing various source control operations

主题:Amethyst Dark Theme

功能

  • 无需在本地克隆或拥有仓库,即可即时打开任何 GitHub 仓库。
  • 轻松编辑并贡献到任何 GitHub 仓库 - 直接将更改提交到 GitHub,或打开拉取请求。
  • 在其他环境继续 - 通过 Continue on... 命令(可从命令面板或远程指示器快速选择菜单访问)。
    • 在本地克隆仓库
    • 将仓库克隆到容器中 - 需要安装 开发容器 扩展
  • 提供与在本地仓库工作类似的熟悉用户界面(*参见下面的“限制”)。
    • 资源管理器 - 打开、复制、移动、重命名和删除文件和文件夹
    • 搜索 - 快速全文搜索*
    • 源代码管理 - 暂存和提交您的更改,以及许多其他源代码管理操作
    • 时间线视图 - 查看文件历史记录并支持 diff
    • 快速打开 - 快速查找要打开的文件
    • 远程指示器 - 显示远程仓库连接的提供程序(例如,GitHub)
  • 同时在不同的分支上工作 - 每个远程分支都被视为一个单独的工作树(在 Git 术语中),这意味着您所做的任何更改都与该分支隔离。您无需暂存更改即可切换到新分支以检出 PR 或开始新的工作项。当您返回到以前的分支时,您的更改仍然会保留在那里。
  • 安装 GitHub Pull Requests and Issues 扩展,快速查看、探索和检出拉取请求,查看并开始处理议题。

限制

  • 有限的语言智能 - 许多语言服务器尚不理解这种虚拟化环境。TypeScript 支持对远程仓库的单文件智能。
  • 有限的扩展支持 - 和语言服务器一样,许多扩展无法与远程仓库一起工作。扩展可以选择退出,并且不会为虚拟工作空间激活。有关更多详细信息,请参阅下面的扩展开发部分
  • 搜索 - 全文搜索需要预构建的索引才能进行精确文本匹配,否则将回退到 GitHub 的模糊默认分支本地搜索。
  • 终端 - 不支持。任何打开的终端都将位于您的本地文件系统上。
  • 调试 - 不支持。
  • 任务 - 不支持。

告诉我们您的想法

我们非常期待您试用 远程仓库 (RemoteHub),并迫不及待地想听听您的想法和反馈。我们才刚刚开始这段旅程,因此随着我们继续开发,功能集将不断增长,限制将不断减少。我们还将扩展支持的提供商集合。GitHub 只是我们支持的第一个提供商,Azure Repos 即将推出。

TypeScript 4.3

此版本继续改进我们对即将发布的 TypeScript 4.3 版本的支持。您可以在TypeScript 博客上阅读更多关于 TypeScript 4.3 中的新语言特性和改进。以下是它带来的一些编辑器改进

  • 支持 override。还有用于添加 override 关键字的快速修复。
  • 导入语句补全。这类似于自动导入,只是您是在输入导入语句本身。
  • JSDoc @link 标签支持。

要开始使用 TypeScript 4.3 每夜构建版本,只需安装 TypeScript 每夜构建扩展。请分享您的反馈,并告知我们您在使用 TypeScript 4.3 时遇到的任何错误。

工作空间信任

在上个里程碑的版本说明中,我们分享了专门针对扩展作者的工作空间信任相关工作。我们在本里程碑中在扩展 API 和用户体验方面都取得了很大进展。话虽如此,此版本仍将禁用工作空间信任功能,但我们非常希望您能尝试并提供反馈。

您可以使用以下设置 security.workspace.trust.enabled 启用此功能。启用后,在 VS Code 中打开文件夹时,您将看到以下对话框。

Workspace Trust startup dialog

这个对话框很重要,它可以让用户尽早做出决定并理解他们决定的影响。一旦您了解了该功能,您可能希望使用 security.workspace.trust.startupPrompt 设置来自定义何时显示该对话框。

您可以在问题 #106488 中关注工作空间信任的开发并提供反馈。

对扩展的贡献

远程开发

远程开发扩展的工作仍在继续,该扩展允许您将容器、远程机器或 适用于 Linux 的 Windows 子系统 (WSL) 用作功能齐全的开发环境。

1.56 版本的功能亮点包括

  • 在容器卷中克隆仓库时,新的卷视图。
  • 连接到远程时,本地终端警告。
  • 启动开发容器扩展时,提示安装 Docker Desktop。

您可以在远程开发版本说明中了解新的扩展功能和 bug 修复。

GitHub 拉取请求和议题

GitHub Pull Requests and Issues 扩展的工作仍在继续,该扩展允许您处理、创建和管理拉取请求和议题。

要了解所有新功能和更新,您可以查看该扩展 0.26.0 版本的完整变更日志

扩展开发

定义您的扩展是否支持虚拟工作空间

新的远程仓库扩展允许您直接从 GitHub 打开包含内容的文件夹。它通过提供一个虚拟文件系统并在其上打开一个工作空间来实现。其他扩展也做类似的事情。它们从 ftp 服务器、云存储或数据库提供内容,并无缝地将这些内容作为文件提供给 VS Code 中的用户。

虚拟文件系统功能已经存在一段时间了,但我们发现并非所有扩展都能支持在虚拟工作空间中运行,即工作空间文件物理上不存在于磁盘上。因此,我们增加了对扩展的支持,以便它们可以指示是否支持在虚拟工作空间中运行。当某个扩展选择退出时,它将不会为虚拟工作空间被 VS Code 激活,并且用户将不会看到来自此扩展的错误。

扩展在 package.json 中选择退出虚拟工作空间设置,如下所示

{
  "capabilities": {
    "virtualWorkspaces": false
  }
}

目标是让尽可能多的扩展支持在虚拟工作空间中运行。然而,这并非总是可行,特别是在扩展使用了假定文件物理存在的组件时。虚拟工作空间指南记录了扩展如何支持虚拟工作空间。

行动号召:请检查您的扩展是否可以处理虚拟工作空间,并在您的 package.json 中相应地设置 virtualWorkspaces 能力。

在扩展采用新的 virtualWorkspaces 属性之前会有一个过渡期。在此期间,我们维护一个内部列表,列出我们认为应将 virtualWorkspaces 能力设置为 false 的扩展。这是基于对扩展是否使用了 Node.js fs 模块并因此直接访问文件系统的分析得出的。然而,扩展作者更能准确评估扩展是否支持 virtualWorkspaces 能力。为了跟踪采用情况,我们创建了以下跟踪议题 #122836。如果您的扩展在此列表中并且您已采用 virtualWorkspaces 能力,请在上述议题中添加评论。

远程指示器菜单

扩展现在可以向远程指示器菜单贡献内容

Remote indicator on the left of the Status bar

statusBar/remoteIndicator 菜单贡献点向远程指示器菜单添加命令。

"contributes": {
    "menus": {
        "statusBar/remoteIndicator": [
        {
          "command": "remote-wsl.newWindow",
          "when": "!remoteName && isWindows",
          "group": "remote_10_wsl_0_local@1"
        }
    ]},
    "commands": [
      {
        "command": "remote-wsl.newWindow",
        "title": "New WSL Window",
        "category": "Remote-WSL"
      }
    ]
}

为了允许菜单根据提供程序对条目进行排序,group 需要遵循特定的语法

对于来自远程的命令:remote_${orderOfGroups}_${remoteName)_${internalGrouping}@${orderInGroup}

对于来自虚拟文件系统的命令:virtualfs_${orderOfGroups}_${fileScheme)_${internalGrouping}@${orderInGroup}

  • orderOfGroups 是一个两位数字,用于对组进行排序
  • remoteName 是 remoteAuthority 的第一部分 (wsl, ssh,...)
  • fileScheme 是虚拟文件系统的 URI 方案
  • internalGrouping 可供每个贡献自由使用
  • orderInGroup 用于对组内的条目进行排序

示例:remote_10_wsl_1-open@1

大多数 Webview 现在使用 iframe

自 webview API 首次引入以来,我们一直使用 Electron 的 webview 标签 实现 webview。然而,在网页上,VS Code 的 webview 则是使用标准的 <iframe> 元素实现,因为 <webview> 在网页上不可用。

一段时间以来,我们一直在探索将桌面版 VS Code 迁移到使用 <iframe> 支持的 webview,因为这一更改将为扩展提供更一致的桌面和网页之间的 webview 环境。弃用 <webview> 还有助于我们推进 Electron 沙盒化工作。

本次迭代中,我们将大部分 webview 切换为使用 iframe。现在,<webview> 标签仅用于启用查找小部件的 webview,我们计划在进行更多工程工作后也将它们迁移到使用 iframe。

此更改不应导致问题,但 <iframe><webview> 元素在某些极端情况下行为有所不同。请务必快速测试您的扩展,以验证一切是否按预期工作。

更容易检查 webview

<iframe> 支持的 webview 的一个明显好处是它们现在更容易检查了。

如果您之前使用过 webview,您可能记得需要使用 **Developer: Open Webview Developer Tools** 命令来检查 webview 的内容。这会打开一个新的开发工具面板,专门用于您的 webview。

Inspecting a webview in its own developer tools window

使用 <iframe> 支持的 webview,您可以使用 VS Code 的标准开发工具(**Developer: Toggle Developer Tools**)来检查 webview。

Inspect a webview in the main developer tools window

这使得检查多个 webview 变得容易。当您的 webview 关闭时,开发工具也不会再关闭。

此外,webview 内部发生的异常和控制台消息现在会打印在顶层开发工具控制台中。

Exceptions from a webview printed in the main developer tools

您还可以使用开发工具在 webview 的上下文中评估表达式。打开 VS Code 的开发工具(**Developer: Toggle Developer Tools**)后,打开控制台,然后从上下文选择器中为您的 webview 选择 active-frame

Selecting the current scope of the debug console

总的来说,能够使用 VS Code 的标准开发工具应该能为 webview 提供更好的开发体验。

CodeActionTriggerKind

CodeActionContext 上的新属性 triggerKind 用于跟踪从 CodeActionProvider 请求 Code Actions 的原因。此属性的可能值为

  • Invoke - Code Actions 是通过键盘快捷键或命令明确请求的。
  • Automatic - Code Actions 是在没有明确用户操作的情况下请求的。这包括在文档内容更改时请求 Code Actions。

提供者可以使用 triggerKind 根据 Code Actions 的请求方式返回不同的结果集。例如,一个自动触发的重构 Code Action 提供者可能只返回当前精确选区的重构结果,以限制 Code Action 灯泡出现的频率。然而,当 Code Actions 被明确请求时,同一个提供者可能会自动扩展当前选区,尝试显示用户在当前位置可能感兴趣的所有重构结果。

更新的 codicons

我们已向我们的 codicon 库 添加了以下新图标

  • arrow-swap
  • copy
  • debug-line-by-line
  • filter-filled
  • person-add
  • terminal-bash
  • terminal-cmd
  • terminal-debian
  • terminal-linux
  • terminal-powershell
  • terminal-tmux
  • terminal-ubuntu
  • wand

List displaying updated codicons with their names

键绑定标签颜色

当命令关联了键绑定时,会显示键绑定标签。键绑定标签的使用场景包括(但不限于)

  • 命令面板
  • 键盘快捷方式编辑器
  • 键盘快捷方式录制器模态框
  • 扩展市场页面的“功能贡献”部分

以下自定义设置可用

  • keybindingLabel.background: 键绑定标签背景色。键绑定标签用于表示键盘快捷方式。
  • keybindingLabel.foreground: 键绑定标签前景色。键绑定标签用于表示键盘快捷方式。
  • keybindingLabel.border: 键绑定标签边框颜色。键绑定标签用于表示键盘快捷方式。
  • keybindingLabel.bottomBorder: 键绑定标签下边框颜色。键绑定标签用于表示键盘快捷方式。

工作区信任扩展 API

在上一个里程碑中,我们提到了正在进行的名为“工作区信任”的功能工作。我们请扩展作者关注 issue #120251 以获取更新,并且我们将继续这样做。以下信息和更新也可以在该 issue 中找到。

在本里程碑中,我们将工作区信任扩展 API 从提议状态转为稳定状态。这使我们能够发布第一版关于如何使您的扩展适配工作区信任的指南。API 很小,所以这里快速浏览一下。

您可以使用 package.json 中的 untrustedWorkspaces capability 声明您的扩展在不受信任的工作区中提供完全、部分或不支持的功能。

以下示例声明扩展在不受信任的工作区中完全受支持。在这种情况下,扩展在不受信任的工作区中是启用的。

"capabilities": {
  "untrustedWorkspaces": {
    "supported": true
  }
}

下一个示例声明扩展在不受信任的工作区中不受支持。在这种情况下,扩展在不受信任的工作区中是禁用的。

"capabilities": {
  "untrustedWorkspaces": {
    "supported": false
  }
}

第三个选项是声明 limited 支持。当您选择 limited 选项时,为您提供了三种工具。

首先,如果您有一个可以在工作区中配置,但需要工作区受信任才能应用工作区值的设置,那么您可以使用 untrustedWorkspaces 对象中的 restrictedConfigurations 数组属性包含该设置。这样做,当您的扩展使用 VS Code 工作区配置 API 读取这些设置值时,VS Code 将忽略这些受限设置的工作区值。

以下示例声明了在不受信任的工作区中受限的设置。

"capabilities": {
  "untrustedWorkspaces": {
    "supported": "limited",
    "restrictedConfigurations": [
      "markdown.styles"
    ]
  }
}

接下来,您还可以使用以下 API 通过编程方式检查和监听当前工作区是否受信任

export namespace workspace {
  /**
   * When true, the user has explicitly trusted the contents of the workspace.
   */
  export const isTrusted: boolean;
  /**
   * Event that fires when the current workspace has been trusted.
   */
  export const onDidGrantWorkspaceTrust: Event<void>;
}

最后,您可以使用 when 子句中的 isWorkspaceTrusted 上下文键以声明方式隐藏命令或视图。

**行动号召**:请查阅 issue #120251 中的“工作区信任扩展指南”,并根据您的扩展设置适当的 untrustedWorkspaces.supported 值。

提议的扩展 API

每个里程碑都会带来新的提议 API,扩展作者可以试用它们。一如既往,我们需要您的反馈。要试用提议 API,您需要执行以下操作

  • 您必须使用 Insiders 版本,因为提议的 API 经常变化。
  • 您的扩展的 package.json 文件中必须包含此行:"enableProposedApi": true
  • 将最新版本的 vscode.proposed.d.ts 文件复制到您项目的源位置。

您不能发布使用提议 API 的扩展。下一个版本中可能会有重大变更,我们绝不希望破坏现有扩展。

原生笔记本

我们正在准备原生笔记本 API 的大部分内容的最终确定。我们进行了大量的微调以及一些重大更改。

笔记本序列化器

我们添加了 NotebookSerializer API。它提供了一种更简单的方式来将“字节”转换为 NotebookData,反之亦然。当您实现此 API 时,您的笔记本将免费获得备份、恢复、脏状态等功能。我们建议扩展作者采用此新 API,而不是使用之前基于内容提供者的 API。

笔记本控制器

笔记本控制器 API 替换了内核提供者 API。笔记本控制器提供笔记本的执行引擎,用于创建笔记本输出。笔记本可以提供多个控制器或不提供控制器,VS Code 允许用户选择控制器。作为回报,扩展可以根据其领域模型的需求自由创建、修改和删除控制器。

笔记本单元状态栏

NotebookCellStatusBarItemProvider API 替换了 createCellStatusBarItem 方法。它使扩展能够向每个单元格编辑器底部的状态栏贡献带有标签、图标和命令的项目。它遵循与许多其他 VS Code 扩展 API 相同的提供者模式。

测试

我们原本打算在本月最终确定一部分新的测试 API,但我们专注于完善,并将最终确定推迟到下个月,相关进展可在 issue #122208 中查看。本次迭代中进行的 API 更改主要包括

  • TestProvider 被重命名为 TestController,其方法也相应地重命名了。
  • TestItem 现在是由 vscode.test.createTestItem 调用的托管对象。
  • 测试结果现在通过标准方法 vscode.test.createTestResults 创建,该方法可以在 TestController.runTests 内部或外部调用。

这些更改带来了一些额外功能,例如显示原始测试输出的能力以及扩展指示加载测试中的错误的能力。我们相信这些更改为未来的附加功能提供了坚实的基础,并且更紧密地与我们现有的扩展 API 保持一致。

我们还创建了一个 Test Adapter Converter 扩展,它允许与现有 Test Explorer UI 扩展配合使用的任何适配器自动接入原生 VS Code 测试。转换器扩展现在可以手动安装,很快它将与 Test Explorer UI 集成,为现有用户和适配器提供无缝迁移到原生测试的路径。

改进了 ArrayBuffers 与 webview 之间的传输

在当前版本的 VS Code 中,向 webview 发送或从 webview 接收类型化数组有一些怪癖

  • 类型化数组(例如 UInt8Array)序列化效率非常低。当您需要传输数兆字节的数据时,这可能会导致性能问题。
  • 发送的类型化数组在接收端不会被重新创建为正确的类型。如果您发送一个 UInt8Array,接收方会得到一个包含 UInt8Array 数据值的通用对象。

尽管这两个问题都是 bug,但如果不这样做,我们可能破坏依赖现有行为的扩展。同时,新编写的扩展完全没有理由需要当前这种令人困惑且低效的行为。

因此,我们决定保留现有扩展的现有行为,但让新扩展选择更正确的行为。这是通过查看扩展的 package.json 中的 engines 来实现的。

"engines": {
  "vscode": "^1.57.0",
}

如果扩展面向 VS Code 1.57+,那么类型化数组应在接收端重新创建,并且大型类型化数组与 webview 之间的传输应更加高效。

请测试此行为,并告知我们它是否未按预期工作,或是否给您现有代码带来意外的回归问题。

TerminalOptions.message

这项新的提议允许扩展在进程启动前在终端中显示一条消息。

vscode.window.createTerminal({
  message: '\x1b[3;1mSome custom message\x1b[0m'
});

调试适配器协议

异常断点与常规断点更好地对齐

setExceptionBreakpoints 请求现在可以选择返回一个 Breakpoint 数组,类似于其他 set*Breakpoints 请求。这允许客户端为单个异常断点或过滤器显示验证错误消息。从本版本开始,VS Code 在“断点”视图中显示这些错误。

Restart 请求现在可以接收调试配置的更改

restart 请求现在接受一个新的可选参数 arguments,客户端可以在其中传递启动或附加配置的最新版本。有了此功能,调试适配器可以使用调试配置中的最新值重新启动会话。

断开调试器,保持被调试程序暂停

disconnect 请求用于结束调试会话,并可以继续执行被调试程序或终止它。现在有一个新选项可以在调试器断开连接后保持被调试程序处于暂停状态。这使得可以使用新的会话继续进行调试。

实现此功能的调试适配器必须通过 supportSuspendDebuggee capability 来宣布其支持。客户端可以通过向 disconnect 请求传递一个新的可选参数 suspendDebuggee 来使用此功能。

工程

Electron 12 更新

在本里程碑中,我们完成了将 Electron 12 集成到 VS Code 中的探索工作,感谢所有参与 Insiders 版本测试和自托管的人员。这是一个主要的 Electron 版本,附带 Chromium 89.0.4389.114 和 Node.js 14.16.0。

Electron 沙盒化进展

在本里程碑中,我们继续为 VS Code 窗口启用 Electron 的 沙盒化上下文隔离 功能做准备。

具体来说

  • 我们更改了沙盒化渲染器中访问 VS Code 窗口所需的所有环境属性。
  • 我们正在探索对于自定义编辑器,在某些可能的情况下选择性地启用 iframe,以替代 webview 元素。
  • 我们能够将渲染器中的一些原生模块或 Node.js 需求移至其他进程或完全移除。
  • 我们使 windows-process-tree 具备了上下文感知能力。

Service worker 现在用于在 webview 中加载资源

在桌面版 VS Code 中,webview 现在使用 service worker 来加载本地资源。VS Code 的网页版一直使用 service worker 完成此任务,但以前桌面版 VS Code 使用 Electron 协议

在桌面版中使用 service worker 使我们能够更好地协调桌面和网页之间 webview 的行为。它还帮助我们修复了一些棘手的 bug,并让我们删除了大约 1000 行代码。

虽然此更改不应对大多数 webview 扩展产生影响,但在少数边缘情况下可能会引起问题

  • 对 webview 如何加载资源做出假设的扩展

    如果您的扩展直接使用了 vscode-webview-resource: 协议或对资源 URI 硬编码了其他假设,它可能不再起作用。

    相反,请确保始终使用 .asWebviewUri 来创建资源的 URI。另请记住,返回的 URI 格式将来可能会改变。

  • 将 iframe 的 src 设置为指向磁盘上的 HTML 文件的扩展

    Service worker 无法看到此请求,因此我们不再支持此功能。网页上早已如此,我们认为这种模式并不常见。

    推荐的修复方法是不使用 iframe,而是将 HTML 文件的内容内联到 webview 中。

代码库中启用 no implicit override

即将发布的 TypeScript 4.3 版本引入了一个新的 override 关键字,它告诉编译器子类中的方法覆盖了其超类中的方法。还有一个新的 --noImplicitOverride 标志,用于强制所有覆盖超类中方法的方法必须使用 override 关键字。

class Foo {
   foo() {...}
}

class SubFoo extends Foo {
    foo() { ... } // Error when noImplicitOverride is enabled: missing override specifier
}

override 关键字有几个好处

  • 阅读代码时,它会提醒您某个方法覆盖了基类中的方法

  • 尝试覆盖基类中不存在的方法会引发错误。这有助于捕获由于重命名基类中的方法但忘记更新子类中的方法名称而导致的错误。

本次迭代中,我们在代码库中采用了 override 关键字,并为核心 VS Code 和所有内置扩展启用了 --noImplicitOverride。虽然我们自动化了大部分工作,但这一更改确实帮助我们发现了代码错误地重新声明属性或存在不清晰继承模式的情况。

这项新的严格性规则也应有助于我们在将来捕获一些常见的编程错误。

Windows 安装程序整合到 Windows 包管理器中

我们已更新 Windows 包管理器 发布流程,以发布 arm64 的用户和系统安装程序,并采用 v1 包清单架构,从而将 x86x64arm64 的用户和系统安装程序整合到一个清单中。用户在安装包时可以使用 --scope 参数,或使用 winget CLI 设置,来选择用户或系统安装程序。

文档

更新的入门视频

VS Code 的入门视频 已更新。这些视频涵盖从入门使用扩展到 VS Code 功能,如调试版本控制

Intro to Debugging in VS Code video

新的 C++ 视频

C++ 扩展 团队创建了一系列入门视频,讲解如何配置 IntelliSense、构建和调试您的 C++ 项目。

VS Code 背后的故事与技术

您可以在这篇采访中了解 VS Code 的历史和底层技术,受访者是 VS Code 工程师 Ben Pasero。Ben 谈论了 VS Code 的早期以及使用 Electron 作为应用程序框架使 VS Code 能够在 macOS、Windows 和 Linux 上运行的体验。

合作伙伴扩展

Azure 机器学习

Azure 机器学习 扩展使您能够为机器学习工作流创建和管理强大的云计算资源。凭借其远程能力,您可以以安全、可审计和合规的方式无缝连接到您的计算资源

Microsoft Azure Machine Learning extension

值得关注的修复

  • 108559: RunInTerminal 未使用工作区设置中指定的集成终端 bug
  • 118282: 调试器 Step Over 进入 skipFiles
  • 118731: 调查如何在异步打开浏览器窗口和标签时避免 Safari 的弹窗阻止器
  • 119340: 如果启用了未捕获异常断点,Run Without Debug 永不终止
  • 121347: 从备份恢复文件时出现乱码
  • 119059: 自定义文本编辑器:恢复备份时打开 2 个编辑器
  • 120245: CSS: !important 补全已损坏
  • 120393: 改进对 webgl 上下文丢失的处理
  • 120435: 移除 emmet.extensionsPath 有效路径检查
  • 120882: 在资源管理器中粘贴文件不再在编辑器中打开该文件
  • 121148: 调试下拉菜单中显示重复的启动配置
  • 120277: 在文件中查找窗格中的水平滚动条太小,且滚动方向错误

感谢

最后但同样重要的是,要非常感谢以下本月为 VS Code 做出贡献的人们

对我们的问题跟踪的贡献

vscode 的贡献

vscode-eslint 的贡献

vscode-json-languageservice 的贡献

vscode-vsce 的贡献

debug-adapter-protocol 的贡献

vscode-js-debug 的贡献

vscode-generator-code 的贡献