尝试以扩展 VS Code 中的代理模式!

2021 年 4 月 (版本 1.56)

更新 1.56.1:本次更新解决了这些安全问题

更新 1.56.2:本次更新解决了这些问题

下载:Windows:x64 Arm64 | Mac:通用 Intel Apple 芯片 | Linux:deb rpm tarball Arm snap


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

如果您想在线阅读这些发行说明,请访问 code.visualstudio.com 上的更新页面。

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

内测版:想尽快尝试新功能?您可以下载每晚的内测版构建,并尽快尝试最新的更新。

工作台

改进的操作悬停反馈

我们更改了工作台中操作的鼠标悬停反馈,以便在可点击操作周围提供更好的用户体验。

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 选择粘贴命令

Linux 上提供了新命令workbench.action.terminal.pasteSelection,用于从选择剪贴板粘贴到终端。

终端工作区 Shell 权限已更改

为了支持与配置文件相关的传入更改,如果.vscode/settings.json中存在终端设置,则显示的提示已被删除,取而代之的是一个设置,用于选择工作区设置的使用。请注意,这在不受信任的工作区中可能很危险。

"terminal.integrated.allowWorkspaceConfiguration": true

当默认启用工作区信任时,我们将删除此功能并使用该系统。

任务

升级后删除任务 0.1.0

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

Tasks upgrade notification

终端选项卡中没有“任务”前缀

使用新的终端选项卡功能时,“任务”前缀将不再添加到终端名称中。相反,任务由“工具”图标指示,以便更好地利用可用空间。

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 改进

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

调试会话通常通过调试:停止调试:断开连接命令停止。如果调试会话是launch类型,则停止命令不仅会停止会话,还会终止调试对象。对于attach类型调试会话,有一个断开连接命令,它会停止调试并恢复调试对象的执行。

在此版本中,现在可以通过在调试工具栏中触发命令时按住Alt修饰符来反转此行为。更改行为可以使launch类型调试会话的调试对象保持运行,并终止attach类型调试会话的调试对象。除了将Alt与默认命令一起使用之外,还可以从命令面板中访问调试:停止调试:断开连接命令,用于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时,对于具有“改进的内联值”支持的语言,内联值会自动启用。

Java 调试器扩展是首批采用该 API 的调试器扩展之一。在下面的屏幕截图中,Java 变量的准确值显示在其使用位置旁边。

Java extension displaying inline values in the editor while debugging

您可以使用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

切换行号

您现在可以从单元格工具栏暂时切换当前会话中单元格的行号,或者通过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 预览中启用智能引号和简单的排版替换

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

Smart quotes and text replacement in the Markdown preview

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

更多文件被识别为 shellscript

带有.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版本中可用。

入门

要开始使用,请从命令面板运行打开远程存储库...命令。从那里,您可以粘贴任何 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,或打开拉取请求。
  • 在另一个环境中继续 - 通过在...中继续命令(可从命令面板或远程指示器快速选择菜单访问)。
    • 在本地克隆存储库
    • 将存储库克隆到容器中 - 需要开发容器扩展
  • 提供类似于本地存储库的熟悉用户界面(*见下面的“限制”)。
    • 资源管理器 - 打开、复制、移动、重命名和删除文件和文件夹
    • 搜索 - 快速全文搜索*
    • 源代码管理 - 暂存和提交您的更改,以及许多其他源代码管理操作
    • 时间线视图 - 查看文件历史记录并支持差异
    • 快速打开 - 快速查找要打开的文件
    • 远程指示器 - 显示远程存储库连接到的提供程序(例如 GitHub)
  • 同时处理不同的分支 - 每个远程分支都被视为一个单独的工作树(在 Git 术语中),这意味着您所做的任何更改都隔离到该分支。您无需暂存更改即可切换到新分支以检出 PR 或开始新的工作项。当您返回到上一个分支时,您的更改仍将存在。
  • 安装GitHub 拉取请求和问题扩展,并快速查看、浏览和检出拉取请求,查看并开始处理问题。

限制

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

告诉我们您的想法

我们非常高兴您能使用远程存储库 (RemoteHub),并迫不及待地期待您的想法和反馈。我们才刚刚开始这段旅程,因此随着我们继续开发,功能集预计会增加,限制会缩小。我们还将扩展支持的提供程序集。GitHub 只是我们支持的第一个提供程序,Azure Repos 即将推出。

TypeScript 4.3

此版本继续改进我们对即将发布的 TypeScript 4.3 版本的支持。您可以在TypeScript 博客上阅读有关 TypeScript 4.3 中新语言功能和改进的更多信息。以下是它启用的一些编辑器改进

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

要开始使用 TypeScript 4.3 每夜构建,只需安装TypeScript Nightly 扩展。请分享您的反馈,并让我们知道您是否遇到 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。

您可以在远程开发发布说明中了解新的扩展功能和错误修复。

GitHub 拉取请求和议题

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

要了解所有新功能和更新,您可以查看扩展 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 都使用 iframes

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

我们一直在探索将 VS Code 的桌面版本迁移到使用<iframe>支持的 Webview,因为此更改将为扩展提供桌面和 Web 之间更一致的 Webview 环境。从<webview>迁移也将有助于我们的 Electron 沙盒工作。

此次迭代,我们已将大多数 Webview 切换为使用 iframes。现在<webview>标签仅用于启用查找小部件的 Webview,我们计划在进行更多工程工作后也将其迁移为使用 iframes。

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

更轻松地检查 Webview

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

如果您以前使用过 Webview,您可能还记得必须使用开发人员:打开 Webview 开发人员工具命令来检查 Webview 的内容。这将为您的 Webview 打开一个新的开发人员工具面板。

Inspecting a webview in its own developer tools window

使用<iframe>支持的 Webview,您可以改用 VS Code 的标准开发人员工具(开发人员:切换开发人员工具)来检查 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 的开发工具后,打开控制台,然后从上下文选择器中选择您的 Webview 的active-frame

Selecting the current scope of the debug console

总而言之,能够使用 VS Code 的标准开发人员工具应该为 Webview 提供更好的开发体验。

CodeActionTriggerKind

CodeActionContext上的新triggerKind属性跟踪为什么从CodeActionProvider请求代码操作。此属性的可能值为

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

提供程序可以使用triggerKind返回不同的结果集,具体取决于代码操作的请求方式。例如,自动触发的重构代码操作提供程序可能只返回当前精确选择的重构,以限制代码操作灯泡显示的频率。但是,当明确请求代码操作时,同一个提供程序可能会自动扩展当前选择,以尝试显示用户在当前位置可能感兴趣的所有重构。

更新的 codicons

我们已将以下新图标添加到我们的 codicon 库中:

  • 箭头交换
  • 复制
  • 逐行调试
  • 已填充筛选器
  • 添加人员
  • 终端 bash
  • 终端 cmd
  • 终端 debian
  • 终端 linux
  • 终端 powershell
  • 终端 tmux
  • 终端 ubuntu
  • 魔杖

List displaying updated codicons with their names

键绑定标签颜色

当命令关联有键绑定时,将显示键绑定标签。键绑定标签的用法包括(但不限于)

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

以下自定义可用

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

工作区信任扩展 API

上个里程碑,我们提到了我们一直在进行的工作区信任功能。我们要求扩展作者关注问题 #120251以获取更新,我们也将继续这样做。以下信息和更新也可以在该问题中找到。

在此里程碑中,我们将工作区信任扩展 API 从提议状态转移到稳定状态。这使我们能够发布将您的扩展引入工作区信任的指南的第一个版本。API 很小,所以快速看一下。

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

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

"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>;
}

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

行动号召:请查看问题 #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 的一部分,但我们专注于优化并将最终确定推迟到下个月,跟踪在问题 #122208中。此迭代中进行的 API 更改主要是

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

随着这些更改,还增加了一些额外功能,例如显示原始测试输出的能力以及扩展指示加载测试中的错误的能力。我们相信这些更改为将来的附加功能奠定了坚实的基础,并且与我们现有的扩展 API 更紧密地对齐。

我们还创建了一个测试适配器转换器扩展,该扩展允许与现有测试资源管理器 UI扩展一起工作的任何适配器自动插入到原生 VS Code 测试中。转换器扩展今天可以手动安装,很快它将与测试资源管理器 UI 集成,为现有用户和适配器提供无缝迁移路径到原生测试。

改进了 ArrayBuffer 与 Webview 之间的数据传输

在当前版本的 VS Code 中,向或从 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请求现在接受一个新的可选参数arguments,客户端可以在其中传递启动或附加配置的最新版本。通过此添加,调试适配器可以使用调试配置中的最新值重新启动会话。

断开调试器并使调试对象暂停

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

实现此功能的调试适配器必须通过supportSuspendDebuggee能力宣布其支持。客户端可以通过向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用于自定义编辑器,通过在某些情况下有选择地启用iframe
  • 我们能够将渲染器中一些原生模块或 Node.js 要求移动到其他进程或完全删除它们。
  • 我们使windows-process-tree具有上下文感知能力。

服务工作者现在用于在 Webview 中加载资源

在桌面版 VS Code 中,Webview 现在使用服务工作者加载本地资源。Web 版 VS Code 始终为此使用服务工作者,但以前桌面版 VS Code 使用Electron 协议

在桌面版中使用服务工作者,可以使桌面和 Web 之间的 Webview 行为更好地对齐。它还帮助我们修复了一些棘手的错误,并让我们删除了大约 1000 行代码。

虽然此更改不应对大多数 Webview 扩展产生影响,但在某些极端情况下可能会导致问题

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

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

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

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

    服务工作者无法看到此请求,因此我们不再支持此功能。Web 上已经如此,我们认为这种模式并不常见。

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

代码库中未启用隐式重写

即将发布的 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 Package Manager发布管道,以发布我们的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 不使用工作区设置中的指定集成终端错误
  • 118282:调试器单步跳过进入 skipFiles
  • 118731:研究如何避免在异步打开浏览器窗口和选项卡时 Safari 的弹出窗口阻止程序
  • 119340:如果启用未捕获异常断点,则无调试运行永远不会终止
  • 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 的贡献