2021年5月(版本1.57)

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

Workspace Trust 功能解决了 CVE-2021-34529

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


欢迎来到2021年5月发布的Visual Studio Code。此版本中有许多更新,我们希望您会喜欢,一些关键亮点包括:

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

观看亮点,了解此版本中的新功能,在VS Code团队的发布派对上。您可以在我们的YouTube频道上找到活动的录制

内部人员:想要尽快尝试新功能吗?您可以下载每晚的内部人员版本,并在更新可用时立即尝试最新更新。

工作台

工作区信任

Visual Studio Code 非常重视安全性,并希望帮助您安全地浏览和编辑代码,无论其来源或作者如何。工作区信任功能让您决定是否允许或限制项目文件夹中的自动代码执行。

信任此文件夹对话框

注意:如果有疑问,请将文件夹保持在受限模式。您可以随时启用信任

安全代码浏览

在公共仓库和文件共享上有如此多的源代码可用,这真是太棒了。无论是什么编码任务或问题,可能已经有一个很好的解决方案在某处可用。然而,使用开源代码和工具确实存在风险,你可能会让自己暴露在恶意代码执行和利用的风险中。

工作区信任在您处理不熟悉的代码时提供了一层额外的安全性,通过在受限模式下打开工作区时防止自动代码执行。

注意: 如果你想禁用工作区信任功能,你可以将security.workspace.trust.enabled设置为false。只有在你确信你知道你正在处理的文件的来源和完整性时,才禁用工作区信任。

受限模式

当工作区信任对话框提示时,如果您选择不,我不信任作者,VS Code 将进入受限模式以防止代码执行。工作台将在顶部显示一个横幅,其中包含通过工作区信任编辑器管理您的文件夹的链接,以及了解更多的链接,带您前往工作区信任用户指南。

工作区信任限制模式横幅

您还将在状态栏中看到一个受限模式徽章。

工作区信任限制模式状态栏徽章

受限模式尝试通过禁用或限制多个VS Code功能的操作来防止自动代码执行:任务、调试、工作区设置和扩展。

要查看受限模式下禁用的完整功能列表,您可以通过横幅中的管理链接或点击状态栏中的受限模式徽章来打开工作区信任编辑器。

工作区信任编辑器

信任一个工作区

如果您信任项目的作者和维护者,您可以信任本地机器上的项目文件夹。例如,通常可以信任来自知名GitHub组织的仓库,如github.com/microsoft或github.com/docker。当您打开一个新文件夹时,初始的工作区信任提示允许您信任该文件夹及其子文件夹。

您还可以调出工作区编辑器并快速切换文件夹的受信任状态。有几种方法可以调出工作区编辑器对话框。

当处于受限模式时:

  • 受限模式横幅 管理 链接
  • 受限模式状态栏项

你也可以随时使用:

  • 工作区:管理工作区信任 命令来自命令面板 (⇧⌘P (Windows, Linux Ctrl+Shift+P))
  • 从活动栏中的管理齿轮管理工作区信任

在管理齿轮上下文菜单中的管理工作区信任命令

选择文件夹

当你信任一个文件夹时,它会被添加到工作区信任编辑器中显示的受信任的文件夹和工作区列表中。

工作区信任编辑器 受信任的文件夹和工作区列表

您可以手动从此列表中添加、编辑和删除文件夹,并且启用信任的活动文件夹将以粗体突出显示。

您还可以选择信任父文件夹。这将把信任应用到父文件夹及其所有子文件夹。如果您有许多包含可信内容的文件夹位于一个文件夹下,这可能会有帮助。

启用扩展

如果你想使用受限模式,但你最喜欢的扩展不支持工作区信任,会发生什么?如果一个扩展虽然有用且功能齐全,但没有被积极维护,也没有声明其工作区信任支持,这种情况可能会发生。为了处理这种情况,你可以使用extensions.supportUntrustedWorkspaces设置来覆盖扩展的信任状态。

注意: 在覆盖扩展的工作区信任支持时要小心。扩展作者可能有充分的理由在受限模式下禁用他们的扩展。

下面你可以看到Prettier扩展的用户settings.json条目。

  "extensions.supportUntrustedWorkspaces": {
    "esbenp.prettier-vscode": {
      "supported": true,
      "version": "6.4.0"
    },
  },

您可以使用supported属性来启用或禁用工作区信任支持。version属性指定适用的确切扩展版本,如果您想为所有版本设置状态,可以移除版本字段。

如果您想了解更多关于扩展作者如何评估和确定在受限模式下限制哪些功能的信息,您可以阅读Workspace Trust Extension Guide

设置

以下是可用的工作区信任设置:

  • security.workspace.trust.enabled - 启用工作区信任功能。默认值为 true。
  • security.workspace.trust.startupPrompt - 是否在启动时显示工作区信任对话框。默认情况下,每个不同的文件夹或工作区只显示一次。
  • security.workspace.trust.emptyWindow - 是否始终信任空窗口(没有打开的文件夹)。默认值为 true。
  • security.workspace.trust.untrustedFiles - 控制如何处理工作区中的松散文件。默认是提示。
  • extensions.supportUntrustedWorkspaces - 覆盖扩展的工作区信任声明。可以是 true 或 false。

要了解更多关于工作区信任的信息,您可以阅读工作区信任用户指南。

新入门体验

在过去的几次迭代中,我们一直在努力更新VS Code的欢迎页面,我们很高兴地宣布,从这个迭代开始,我们的新欢迎页面(入门指南)默认对所有用户启用。在这个新体验中,VS Code的核心和已安装的扩展都可以为欢迎页面贡献“教程”,这些教程旨在帮助您开始使用VS Code本身或新扩展。例如,Luna Paint扩展提供了一个教程,帮助理解图像编辑器的每个组件。

新的欢迎页面,展示了一些核心和扩展可以提供的教程

此外,一旦您完成(或忽略)所有演练,VS Code 会重新排列内容,使一键访问的最近工作区数量翻倍。

新的欢迎页面,所有教程已关闭,显示额外的最近工作区条目

设置

  • workbench.startupEditor - 控制启动时显示的默认编辑器。新值 gettingStarted 替换了旧的默认值 welcome。其他可用的选项包括 readmegettingStartedInEmptyWorkbenchnewUntitledFilenone
  • workbench.welcomePage.walkthroughs.openOnInstall - 是否在安装后自动打开扩展贡献的演练。

新页面将被称为入门指南,直到我们完全淘汰现有的欢迎页面。

远程仓库

远程仓库扩展作为1.56版本中的内置预览功能引入,现已公开可用,但它不再内置在VS Code中,因此您需要从VS Code市场安装它。

快速回顾一下,Remote Repositories 扩展允许您直接从 VS Code 内即时浏览、搜索、编辑和提交到任何 GitHub 仓库,而无需克隆或本地拥有该仓库。

在此次迭代中,虽然我们主要专注于修复错误和为发布进行扩展的优化,但我们还是添加了一些新功能。您现在可以在远程资源管理器中查看您的远程仓库,以快速打开或比较您可能有的任何未提交的更改。此外,您可以从同一仓库应用更改到当前的远程仓库,使您能够快速轻松地将未提交的更改从一个分支移动到另一个分支。

远程仓库远程资源管理器视图

主题: Amethyst Dark Theme

要了解更多关于远程仓库的信息,您可以查看远程仓库博客文章YouTube视频

改进的编辑器跨窗口拖放功能

在此版本中,对将编辑器拖动到其他窗口的支持得到了改进。您现在可以将差异编辑器、自定义编辑器以及整个编辑器组拖动到另一个窗口,以在那里打开这些编辑器。

改进的编辑器跨窗口拖放功能

主题: GitHub Light Theme

注意: 如果您经常使用此功能,请确保启用自动保存(files.autoSave),以便在一个窗口中的更改自动反映在另一个窗口中。

移除了在没有编辑器打开时关闭窗口的Cmd+W / Ctrl+W快捷键绑定

我们收到了反馈,用户在使用快速Cmd+W / Ctrl+W关闭最后一个编辑器后,VS Code窗口(实例)突然关闭时感到沮丧。团队中的快速调查也显示,许多人已经取消了关闭窗口的键绑定,因此我们决定在没有打开编辑器时移除Cmd+W / Ctrl+W作为关闭窗口的键绑定。

你可以通过在用户keybindings.json文件中进行如下配置,轻松恢复键绑定:

macOS

{
  "key": "cmd+w",
  "command": "workbench.action.closeWindow",
  "when": "!editorIsOpen && !multipleEditorGroups"
}

Windows/Linux

{
  "key": "ctrl+w",
  "command": "workbench.action.closeWindow",
  "when": "!editorIsOpen && !multipleEditorGroups"
}

注意:在所有平台上,都有一个专用的指定键绑定来关闭窗口:

  • macOS: Cmd+Shift+W
  • Linux: Alt+F4
  • Windows: Alt+F4

笔记本布局自定义

本月我们添加了几个笔记本布局设置,以允许用户根据他们的工作流程自定义笔记本编辑器。默认启用的自定义设置包括:

笔记本工具栏

我们在编辑器中添加了一个笔记本工具栏,您可以轻松访问插入单元格、运行所有单元格或切换内核等操作。可以通过将notebook.globalToolbar设置为false来禁用工具栏。

笔记本工具栏

输出工具栏

清除单元格输出操作和选择不同输出渲染器或mimetype的按钮现在合并到单元格输出旁边的单个...省略号菜单中。可以通过将notebook.consolidatedOutputButton设置为false来禁用此功能。

笔记本输出工具栏

聚焦单元格高亮显示在边栏

VS Code 现在支持在单元格的装订线区域渲染聚焦单元格的高亮显示,这有助于在笔记本包含许多单元格时识别哪个单元格被聚焦。设置 notebook.cellFocusIndicator 可以是 gutter(新的默认值),也可以是 border 以高亮显示整个单元格的边框。

笔记本焦点指示器在边栏

鼠标悬停时显示折叠图标

Markdown单元格上的折叠图标现在仅在鼠标悬停时可见,而不是一直可见。您可以通过将notebook.showFoldingControls设置为mouseover(默认)或always来自定义此行为。

鼠标悬停时显示笔记本焦点图标

本月实施的笔记本布局设置的完整列表如下:

  • notebook.cellFocusIndicator: 添加了选项,使单元格可以通过在单元格侧面(gutter)显示彩色条来指示其聚焦状态,类似于Jupyter。
  • notebook.cellToolbarVisibility: 确定当单元格被聚焦或悬停时,单元格工具栏是否应该出现。默认情况下,只有当单元格被聚焦时才会显示。
  • notebook.compactView: 当启用时,单元格将以更紧凑的样式呈现,减少空白空间。默认情况下是启用的。
  • notebook.consolidatedOutputButton: 清除单元格输出操作和选择不同输出渲染器或mimetype的按钮已合并为单元格输出旁边的单个...省略号菜单。可以通过此设置禁用新菜单。
  • notebook.consolidatedRunButton: 有两个新的操作,执行上方单元格执行当前单元格及下方单元格。它们默认会出现在单元格工具栏中,但启用此设置会将它们移动到执行按钮旁边的新上下文菜单中。
  • notebook.dragAndDropEnabled: 禁用单元格的拖放功能。你仍然可以使用命令(默认情况下为Alt+上/Alt+下)重新排列单元格。
  • notebook.globalToolbar: 在笔记本编辑器的顶部添加一个工具栏。
  • notebook.insertToolbarLocation: 控制插入新单元格的按钮是显示在单元格之间、工具栏中、两者都显示,还是隐藏。
  • notebook.showCellStatusBar: 此设置有一个新选项,visibleAfterExecute,它将在单元格执行前隐藏单元格状态栏以节省空间。一旦单元格被执行,状态栏将变为可见,以便用户可以查看执行详情。
  • notebook.showFoldingControls: 控制出现在Markdown标题上的折叠箭头是否始终可见,或仅在鼠标悬停时可见。
  • notebook.editorOptionsCustomizations: 允许用户在笔记本中自定义单元格编辑器设置。

下图显示了这些设置中的几个效果(顶部的工具栏,边距高亮,输出...按钮):

笔记本布局变化

更新了快速选择和建议小部件颜色

我们已经更新了快速选择和建议小部件中的焦点状态,以更好地与我们的树小部件样式对齐。这引入了一些新的颜色标记,用于控制焦点前景:

  • list.focusHighlightForeground
  • quickInputList.focusForeground
  • editorSuggestWidget.selectedForeground

浅色主题中的快速选择样式

浅色主题中的建议样式

图标主题: Fluent Icons

更新了macOS的Touch Bar图标

我们已经更新了macOS Touch Bar图标,使其与我们更新的图标风格保持一致。

macOS Touch Bar 图标 默认视图

调试时macOS Touch Bar图标显示更多控制选项 调试时

Webviews的上下文菜单

VS Code 现在支持在 webview 中显示简单的上下文菜单,例如 Markdown 预览、发布说明和扩展详情页面:

网页视图中的上下文菜单

此上下文菜单目前包含用于复制和粘贴文本的操作。我们将来可能会在菜单中添加更多操作。

如果此上下文菜单干扰了您的扩展中的webview,您可以通过在contextmenu事件上调用preventDefault来阻止其显示:

document.body.addEventListener('contextmenu', e => {
  e.preventDefault(); // cancel the built-in context menu
});

编辑器

建议预览

启用新设置editor.suggest.preview后,所选建议或代码段的预览将显示在光标位置。

建议预览显示字母'i'的智能补全

主题:深色+(默认深色)

隐藏已弃用的建议

有一个新的设置 editor.suggest.showDeprecated,默认值为 on,但当设置为 off 时,建议将不会显示标记为已弃用的项目。

集成终端

终端标签

终端标签作为1.56版本中的预览功能引入,现在默认启用。新的标签视图默认只会在至少有两个终端时显示。对于单个终端,标签会“内联”到面板标题中。这也引入了终端状态的概念,例如任务是否正在运行、成功或失败:

单个内联终端标签、带有状态的终端标签和折叠的终端标签

以下是此版本中的一些亮点:

  • 标签的颜色可以更改,以便快速导航和区分它们。
  • 标签可以拖放以允许重新排列。
    拖放
  • 将终端组中的标签拖动到空白区域将将其从组中移除(取消拆分终端,也可以通过上下文菜单进行操作)。
    unsplit
  • 将标签页拖入主终端区域可以加入一个组(也可以通过上下文菜单实现)。
    拖动终端标签页以加入标签组
  • Alt 现在在点击标签、+ 按钮或单个标签时会将终端拆分。同样的操作也适用于中键点击以关闭终端。
    拆分终端按钮
  • 除非标签列表足够大以避免意外拆分/终止终端,否则内联操作将不会显示。
  • 当关闭终端导致只剩下一个时,标签列表不会隐藏,直到鼠标离开视图。

如果你不喜欢新的用户体验,你可以通过设置"terminal.integrated.tabs.enabled": false返回到下拉菜单,计划是继续支持这一选项。

终端配置文件改进

终端配置文件系统在此版本中有许多改进,以下是一些亮点:

  • defaultProfile 将在启动 VS Code 时恢复终端时被尊重,并将用于任务和调试。
  • Intellisense 现在在 settings.json 中适用于 icondefaultProfile
  • overrideName 现在适用于默认配置文件。
  • defaultProfile 现在可以在工作区设置中进行设置。这也由新的工作区信任功能控制。
  • 如果使用了defaultProfileshellshellArgs设置,现在将要求您将已弃用的设置迁移到配置文件系统。
  • color 现在可以在个人资料上设置了。

标题序列支持

设置 terminal.integrated.experimentalUseTitleEvent 已升级为稳定版,命名为 terminal.integrated.titleMode。默认情况下,此设置将为 executable,它根据检测到的前台进程命名终端:

运行 'git show' 将导致终端标题更改为 'git'

当设置为sequence时,标题将基于shell设置的内容。这需要shell支持才能工作,一个实际的例子是oh-my-zsh的默认提示符,它显示了关于会话的额外信息:

oh-my-zsh 默认提示将显示计算机的名称和当前工作目录

改进的启动方式,使用干净的环境

设置 terminal.integrated.inheritEnvv1.36 起可用,但实现中存在一些缺陷,在 Linux 上可能由于权限问题而失败,并且在 macOS 上可能无法按预期工作。

由于VS Code改进了其底层环境的设置方式,现在可以访问其启动时的初始环境,这是大多数终端的工作方式。当inheritEnv设置为true时,VS Code将使用初始环境,而当false时,将使用来源的“shell环境”。此设置可以帮助终端更像常规终端一样工作。然而,如果您的profile/rc配置未正确设置,您可能会遇到问题。

Windows 上的原生换行支持

终端中的换行会影响任务问题匹配器和链接检测。历史上,Windows终端使用了一种启发式方法来标记换行,因为模拟Unix pty的仿真技术不支持换行。这在最近的Windows版本中发生了变化,当更新到Windows 10 21376+(目前仅限Insiders)时,这种启发式方法将被禁用,换行应该像在Windows终端中一样正常工作。

任务

终端标签上的任务状态

任务的状态现在显示在其终端标签中。对于后台任务,只有在有相关的问题匹配器时才会显示状态。

终端标签上的任务状态

自动关闭任务终端

任务 presentation 属性有一个新的 close 属性。将 close 设置为 true 将在任务退出时关闭终端。

{
  "type": "shell",
  "command": "node build/lib/preLaunch.js",
  "label": "Ensure Prelaunch Dependencies",
  "presentation": {
    "reveal": "silent",
    "close": true
  }
}

调试

JavaScript 调试

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

Edge 开发者工具集成

JavaScript 调试器与 Microsoft Edge 开发者工具集成,为浏览器调试提供了 DOM、样式和网络检查器,可通过调试工具栏中的新“检查”图标访问。

调试器检查按钮

下面的短视频演示了如何选择“检查”按钮并在Edge DevTools中导航元素。

演示点击“检查”图标并在Edge中点击元素 主题: Codesong

如果您还没有使用Microsoft Edge进行浏览器调试,您可以通过在launch.json中将"type": "chrome""type": "pwa-chrome"替换为"type": "pwa-msedge"来切换到它。在Blazor应用程序中,也可以通过在其启动配置中设置"browser": "edge"来支持这一点。

支持在源映射中重命名的标识符

一个长期被请求的功能,JavaScript 调试器现在支持在源映射中重命名的标识符。这在调试压缩代码时特别有用:

一张在断点处暂停的截图。正在运行压缩后的代码,但变量、监视和调试控制台视图显示变量可以通过原始名称访问。 主题: Codesong

在变量视图、监视视图和调试控制台REPL中支持重命名的变量。您可以通过查看工具生成的源映射文件中是否存在非空的“names”数组来检查您的工具是否发出重命名。

在BREAKPOINTS视图中显示命中的断点

当断点被触发时,VS Code 现在会在 BREAKPOINTS 视图中选择并显示它。这应该有助于更容易理解是哪个确切的断点导致程序中断。

目前只有JS调试扩展支持此功能,但我们预计其他调试扩展很快也会跟进。

当用户进入程序时,命中的断点会被选中并在BREAKPOINTS视图中显示

语言

TypeScript 4.3.2

VS Code 现在搭载了 TypeScript 4.3.2。这个重大更新包括了许多 TypeScript 语言的改进,以及许多针对 JavaScript 和 TypeScript 工具的改进和错误修复。

你可以在TypeScript博客上阅读更多关于TypeScript 4.3的信息。

VS Code 现在支持在 JavaScript 和 TypeScript 注释中使用 JSDoc @link 标签。这些标签允许你在文档中创建可点击的符号链接:

使用JSDoc @link标签导航代码

JSDoc @link 标签的写法是:{@link symbolName}。你也可以选择性地指定替代符号名称显示的文本:{@link class.property 替代文本}

@link 在悬停、建议和签名帮助中受支持。我们还更新了 VS Code 扩展性类型声明文件 vscode.d.ts 以使用 @link

导入语句中的补全

在JavaScript和TypeScript中自动导入功能会在你接受建议时自动添加导入。随着VS Code 1.57的发布,现在在编写导入语句本身时也能使用这一功能:

导入语句中的自动导入

如果您需要手动添加导入,这可以节省时间。

转到非JS/TS文件的定义

许多现代的JavaScript打包工具和框架使用import语句来导入资源,如图像和样式表。我们现在支持通过转到定义来导航这些导入:

导航到非JS/TS导入

这在使用Ctrl/Cmd点击浏览代码时可能最为有用。

排序导入源操作

Sort imports 代码操作适用于 JavaScript 和 TypeScript,用于对您的导入进行排序。然而,与 Organize imports 不同的是,它不会删除任何未使用的导入。

您还可以通过设置以下内容来启用保存时对导入的排序:

"editor.codeActionsOnSave": {
    "source.sortImports": true
}

推断函数返回类型快速修复

推断函数返回类型 重构功能为 TypeScript 添加了显式的返回类型注解到函数中:

Infer函数返回类型重构的实际操作

如果您想添加更明确的类型,这将非常有用。当您希望将返回类型提取到命名类型/接口时,或者如果您需要修改函数的返回类型时,此重构也可以节省时间。

提示禁用TS服务器日志记录

VS Code 现在会在您长时间启用 TypeScript 服务器日志记录时提示您:

TS服务器日志启用通知

日志记录可能会显著影响性能,因此除非您正在积极尝试诊断问题,否则最好保持其禁用状态。

对扩展的贡献

远程开发

工作仍在继续在远程开发扩展上,这些扩展允许您使用容器、远程机器或Windows Subsystem for Linux (WSL) 作为全功能的开发环境。

1.57版本的功能亮点包括:

  • 控制转发端口的所需协议。
  • 可选监视转发的端口冲突。
  • Dev Containers 支持工作区信任安全功能。
  • 在开发容器中更好地检测环境变量。

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

扩展开发

Notebook API

我们已经完成了大部分笔记本API的定稿。该API分为三个独立部分:

  1. NotebookSerializer API 与 notebooks 贡献点结合使用,使 VS Code 能够打开、修改和保存笔记本文档。
  2. 用于呈现单元格输出的Notebook渲染器。它们通过扩展的package.json文件中的notebookRenderer贡献点添加。
  3. NotebookController API 用于为代码单元格生成输出。

一个简单的笔记本序列化器和回显控制器的示例。序列化器使用JSON.parsestringify,并对空文件进行特殊处理。控制器返回单元格文本的大写变体 - 一次作为纯文本,一次作为html。

// serialize/deserialize notebook
vscode.workspace.registerNotebookSerializer(
  'echobook',
  new (class implements vscode.NotebookSerializer {
    // serializer is relying on JSON.parse/stringify
    deserializeNotebook(content: Uint8Array) {
      return JSON.parse(new TextDecoder().decode(content) || '{"cells":[]}');
    }
    serializeNotebook(data: vscode.NotebookData) {
      return new TextEncoder().encode(JSON.stringify(data));
    }
  })()
);

// notebook controller
vscode.notebooks.createNotebookController(
  'myId',
  'echobook',
  'Echo',
  (cells, _notebook, controller) => {
    for (let cell of cells) {
      // execution means to echo in upper-case, once as plain text and once as html
      const execution = controller.createNotebookCellExecution(cell);
      execution.start();
      const echo = cell.document.getText().toUpperCase();
      const textItem = vscode.NotebookCellOutputItem.text(echo, 'text/plain');
      const htmlItem = vscode.NotebookCellOutputItem.text(`<b>${echo}</b>`, 'text/html');
      const output = new vscode.NotebookCellOutput([textItem, htmlItem]);
      execution.replaceOutput(output);
      execution.end(true);
    }
  }
);

该示例静态注册了*.echobook文件的笔记本类型。此外,每当打开此类笔记本时,VS Code 将发出onNotebook:echobook激活事件。

"contributes": {
  "notebooks": [{
      "type": "echobook",
      "displayName": "Echobook",
      "selector": [{
        "filenamePattern": "*.echobook"
      }]
  }]
}

状态栏项的 'id' 和 'name' 属性

我们最终确定了StatusBarItem的API,包括标识符和名称属性。标识符可以通过createStatusBarItem方法的新重载传递,而name属性可以在StatusBarItem本身上动态更改。

这些新属性用于状态栏上的上下文菜单,为各个条目提供名称,并允许用户显示和隐藏条目。如果您不提供这些属性,菜单将把所有来自一个扩展的状态条目聚合在一个条目下。

状态栏项目菜单

如果您的扩展对状态栏有贡献,请考虑更新到新的API。

在新终端中打印消息

当使用window.createTerminal创建终端时,现在可以通过TerminalOptions.message设置一条消息,该消息将打印在终端的顶部。此消息支持ANSI转义序列以启用文本样式:

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

终端显示自定义消息

内联值的新主题颜色

调试器内联值的主题添加了新颜色:

  • editor.inlineValuesBackground: 调试内联值前景文本的颜色
  • editor.inlineValuesForeground: 调试内联值背景的颜色。

作为提醒,对于已注册内联值提供程序的调试扩展,或者如果设置debug.inlineValuestrue,则在调试期间会显示内联值。

调试内联值显示为自定义的前景色和背景色

vscode-webview.d.ts

新发布的@types/vscode-webview包为VS Code在webview中暴露的API添加了类型定义。

你可以使用npm install --save-dev @types/vscode-webview安装这些类型。如果在你的项目中未检测到webview类型,请尝试将它们添加到jsconfig / tsconfigtypeAcquisition部分:

"typeAcquisition": {
  "include": [
    "@types/vscode-webview"
  ]
}

或者在您的代码中添加一个三斜杠引用:

///<reference types="@types/vscode-webview"/>

改进的webview数组缓冲区传输

在之前的VS Code版本中,向或从webview发送类型化数组有一些奇怪的地方:

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

虽然这两个问题都是错误,但我们也不能在不破坏依赖现有行为的扩展的情况下修复它们。同时,新编写的扩展没有任何理由想要当前这种令人困惑且低效的行为。

因此,我们决定保留现有扩展的现有行为,但将新扩展转移到更正确的行为上。这是通过查看扩展的package.json中的engines值来实现的。

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

如果扩展目标为VS Code 1.57+,则应在接收端重新创建类型化数组,并且与webviews之间传输大型类型化数组的效率应大大提高。

调试会话中的父会话

不久前,VS Code 增加了对分层调试会话的支持,但在扩展 API 中并未公开有关层次结构的信息。为了解决这个问题,DebugSession 接口上新增了一个属性,用于引用父会话(如果有的话)。会话的父会话永远不会改变。

export interface DebugSession {
  /**
    * The parent session of this debug session, if it was created as a child.
    * @see DebugSessionOptions.parentSession
    */
  readonly parentSession?: DebugSession;

  // ...

改进的 VS Code Insiders 版本定位

在使用提议的API进行扩展开发时,可能会遇到新的Insiders版本发布并带来破坏性更改。为了为用户提供更无缝的过渡,您现在可以使用日期标签精确地定位Insiders版本。例如,将engines.vscode设置为^1.56.0-20210428将定位到任何在2020年4月28日UTC时间0:00或之后创建的VS Code 1.56(或更新)版本。这使您可以在即将发布的Insiders版本之前安全地发布延期的扩展更新。

"engines": {
  "vscode": "^1.56.0-20210428",
}

树形悬停支持命令URI

当一个TreeItem有一个可信的Markdown工具提示时,该工具提示可以包含格式为[this is a link](command:workbench.action.quickOpenView)的命令。这与Markdown中支持命令链接的所有其他地方的格式相同。

提议的扩展API

每个里程碑都伴随着新的提议API,扩展作者可以尝试使用它们。一如既往,我们希望得到您的反馈。以下是您尝试提议API需要做的事情:

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

你不能发布使用提议API的扩展。在下一个版本中可能会有破坏性的更改,我们从不希望破坏现有的扩展。

测试

我们计划在本迭代中完成测试API的第一部分,但由于其他正在开发的功能数量较多,这一计划被推迟了。虽然本迭代中没有对测试API进行重大更改,但我们继续在其编辑器体验方面取得了进展。例如,Peek视图增加了一个分屏视图,允许您浏览当前和过去测试运行的结果。

右侧显示引用风格树的分割视图中的Peek视图图像 主题: Codesong

测试获得了一组新的快捷键组合,以Ctrl+;开头,Peek视图现在对Markdown消息有了更好的支持,并且修复了许多错误。

如果您使用Test Explorer UI扩展进行测试,您可以切换设置testExplorer.useNativeTesting以切换到新的原生UI。在下一个迭代中,我们计划增加此设置的社会化,并开始与合作伙伴扩展团队采用。

终端配置文件贡献

此API将使扩展能够为终端配置文件系统做出贡献。扩展需要做一些事情才能使其工作。首先在package.json中贡献配置文件:

"contributes": {
  "terminal": {
    "profiles": [
      {
        "title": "Profile from extension",
        "id": "my-ext.terminal-profile",
        "icon": "lightbulb"
      }
    ]
  },
}

然后在新的事件onTerminalProfile激活时激活扩展:

"activationEvents": [
  "onTerminalProfile:my-ext.terminal-profile"
]

最后,在激活事件中注册提供者:

vscode.window.registerTerminalProfileProvider('my-ext.terminal-profile', {
  provideProfileOptions(token) {
    return {
      name: 'Profile from extension',
      shellPath: 'cmd.exe'
    };
  }
});

如果启用了提议的API,扩展贡献的配置文件应显示在配置文件列表中:

扩展贡献的配置文件显示在配置文件列表中

终端选项中的iconPath支持

标准iconPath类型在TerminalOptionsTerminalExtensionOptions上受支持,用于设置终端的图标,该图标显示在终端的标签上:

readonly iconPath?: Uri | { light: Uri; dark: Uri } | ThemeIcon;

更改伪终端标题

新事件 Pseudoterminal.onDidChangeName 启用了对基于 Pseudoterminal 的终端的控制:

const writeEmitter = new EventEmitter<string>();
const nameEmitter = new EventEmitter<string>();
const pty = {
  onDidWrite: writeEmitter.event,
  open: () => writeEmitter.fire('Type to change the title of the terminal'),
  close: () => {
    /* noop*/
  },
  handleInput: (data: string) => nameEmitter.fire(data)
};
const terminal = vscode.window.createTerminal({
  name: `My Terminal`,
  pty
});
terminal.show();

使文件系统提供者能够将文件声明为只读

文件系统提供者现在可以通过在FileStat上设置一个新的permissions属性,将单个文件标记为只读,方法是将该属性的值设置为FilePermission.Readonly。只读文件不可编辑。

注意: 如果所有文件都应被视为只读,你可以在调用 registerFileSystemProvider 时使用现有的 isReadonly 选项。

在asExternalUri中支持工作区URI

现有的 vscode.env.asExternalUri API 现在支持 处理工作区 URI。这使得扩展作者可以创建系统范围的 URI,直接打开给定的工作区。

例如:

const uri = await vscode.env.asExternalUri('file:///Users/john/work/code');

生成的 uri 可以被操作系统打开,VS Code 将打开该工作区。

工程

Electron沙箱支持的进展

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

具体来说:

  • 我们从渲染器中使用的更多代码中移除了Node.js依赖。
  • 我们继续研究完全放弃使用webview,并切换到iframe用于我们的自定义视图和编辑器。

文档

VS Code 在 Build 2021

如果您错过了Microsoft Build 2021开发者活动,您仍然可以按需观看会议。查看Visual Studio Code at Build 2021博客文章,我们整理了一份我们认为VS Code用户会感兴趣的会议列表。

VS Code Build 2021 新功能 YouTube 视频

浏览器调试

一个新主题在VS Code中进行浏览器调试描述了VS Code对Edge和Chrome浏览器的内置调试支持。您可以配置VS Code以启动新的浏览器调试会话(通过调试:打开链接命令)或附加到正在运行的浏览器。

PyTorch

有一个关于如何在VS Code中使用PyTorch机器学习框架的新主题。在VS Code中的PyTorch支持文章中,您将学习如何通过PyTorch和TensorFlow数据类型扩展Jupyter Notebooks。

PyTorch 徽标

显著的修复

  • 71966: 经常遇到整个窗口卡住的问题
  • 85332: Windows: 文件删除时冻结
  • 95077: 终端“单词”链接提供程序不支持换行
  • 108804: 在打开窗口之前不要等待shell环境解析
  • 120004: VS Code 集成终端中的字母间距异常
  • 125035: 调试控制台过滤文本应在重新加载时保留
  • iOS/iPadOS: 为iOS/iPadOS平台进行了多项修复

感谢您

最后但同样重要的是,向本月为VS Code做出贡献的以下人员表示衷心的感谢

对我们问题跟踪的贡献:

vscode 的贡献:

vscode-css-languageservice 的贡献:

vscode-eslint 的贡献:

vscode-js-debug 的贡献:

vscode-languageserver-node的贡献:

vscode-pull-request-github 的贡献:

vscode-vsce 的贡献:

language-server-protocol的贡献:

monaco-languages的贡献:

monaco-typescript的贡献: