现已推出!阅读有关 11 月的新功能和修复的信息。

2021 年 5 月(1.57 版本)

1.57.1 更新:此更新解决了这些问题

工作区信任功能解决了 CVE-2021-34529

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


欢迎使用 Visual Studio Code 的 2021 年 5 月版本。此版本中有许多更新,我们希望您会喜欢,其中一些主要亮点包括

如果您想在线阅读这些发行说明,请访问 更新(位于 code.visualstudio.com)。

观看 VS Code 团队发布会上此版本新功能的亮点。您可以在我们的 YouTube 频道上找到该活动的录像

内部人员:想要尽快尝试新功能吗?您可以下载每日的 Insiders 版本,并尝试最新的更新(一旦可用)。

工作台

工作区信任

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

Trust this folder dialog

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

安全的代码浏览

公共存储库和文件共享上提供了如此多的源代码,这真是太好了。无论编码任务或问题是什么,都可能已经存在一个不错的解决方案。但是,使用开源代码和工具确实存在风险,您可能会让自己面临恶意代码执行和漏洞利用的风险。

工作区信任通过在工作区以受限模式打开时防止自动代码执行,从而在使用不熟悉的代码时提供额外的安全层。

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

受限模式

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

Workspace Trust Restricted Mode banner

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

Workspace Trust Restricted Mode Status bar badge

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

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

Workspace Trust editor

信任工作区

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

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

在受限模式下

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

您也可以随时使用

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

Manage Workspace Trust command in the Manage gear context menu

选择文件夹

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

Workspace Trust editor Trusted Folders and Workspaces list

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

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

启用扩展

如果您想使用受限模式但您最喜欢的扩展不支持工作区信任,该怎么办?如果扩展虽然有用且功能齐全,但没有得到积极维护并且尚未声明其工作区信任支持,则可能会发生这种情况。为了处理这种情况,您可以使用 extensions.supportUntrustedWorkspaces 设置覆盖扩展的信任状态。

注意:请谨慎覆盖扩展的工作区信任支持。可能扩展作者有充分的理由在受限模式下禁用其扩展。

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

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

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

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

设置

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

  • 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 扩展提供了一个包含指南的演练,以帮助您了解图像编辑器的每个组件。

New welcome page, showing some of the walkthroughs core and extensions can contribute

此外,一旦您完成(或关闭)所有演练,VS Code 就会重新排列内容,使您可以通过单击访问最近工作区的数量翻倍。

New welcome page with all walkthroughs dismissed, showing extra recent workspaces entries

设置

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

在我们将现有的欢迎页面完全淘汰之前,新页面将被称为入门

远程存储库

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

简单回顾一下,远程存储库扩展允许您直接从 VS Code 中即时浏览、搜索、编辑和提交到任何 GitHub 存储库,而无需克隆或在本地拥有存储库。

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

Remote Repositories Remote Explorer view

主题:紫水晶深色主题

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

改进了跨窗口的编辑器拖放

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

Improved editor drag and drop across windows

主题:GitHub 浅色主题

注意:如果您经常使用此功能,请确保启用自动保存 (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 来禁用该工具栏。

Notebook toolbar

输出工具栏

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

Notebook output toolbar

聚焦单元格在装订线上的高亮显示

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

Notebook focus indicator on gutter

鼠标悬停时显示折叠图标

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

Notebook show focus icon on mouse over

本月实施的笔记本布局设置的完整列表为

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

下图显示了其中几个设置的效果(顶部的工具栏、装订线高亮显示、输出 ... 按钮)

Notebook layout changes

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

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

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

Quick Pick style in light theme

Suggest style in light theme

图标主题:Fluent 图标

更新了 macOS 的触控栏图标

我们更新了 macOS 触控栏图标,使其与我们更新的图标风格对齐。

macOS 触控栏图标 默认视图

调试时具有更多控件的 macOS 触控栏图标 调试时

Webview 的上下文菜单

VS Code 现在支持在 Webview 中显示一个简单的上下文菜单,例如 Markdown 预览、发行说明和扩展详细信息页面

A context menu in a webview

此上下文菜单当前包含用于复制和粘贴文本的操作。我们将来可能会向菜单中添加其他操作。

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

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

编辑器

建议预览

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

Suggestion preview showing smart completions for the letter 'i'

主题:Dark+(默认深色)

隐藏已弃用的建议

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

集成终端

终端选项卡

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

Single inlined terminal tab, terminal tabs with status, and collapsed terminal tabs

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

  • 可以更改选项卡的颜色,以便快速导航和区分它们。
  • 可以拖放选项卡以允许重新排列。
    drag and drop
  • 将终端组中的选项卡拖动到空白区域会将其从组中删除(取消拆分终端,也可以通过上下文菜单实现)。
    unsplit
  • 将选项卡拖动到主终端区域允许加入一个组(也可以通过上下文菜单实现)。
    dragging a terminal tab to join a tab group
  • 现在,在单击选项卡、+ 按钮或单个选项卡时,Alt 会拆分终端。鼠标中键单击以关闭终端的效果相同。
    split terminal buttons
  • 除非选项卡列表足够大,否则不会显示内联操作,以避免意外拆分/关闭终端。
  • 在关闭终端以致只有一个终端时,选项卡列表不会隐藏,直到鼠标离开视图。

如果您不喜欢新的用户体验,可以通过将 "terminal.integrated.tabs.enabled": false 设置回下拉列表,我们计划继续将此作为一种选项来支持。

终端配置文件改进

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

  • 如果在启动 VS Code 时还原终端,则将遵守 defaultProfile,并将其用于任务和调试。
  • Intellisense 现在可以在 settings.json 中用于 icondefaultProfile
  • overrideName 现在适用于默认配置文件。
  • 现在可以在工作区设置中设置 defaultProfile。这也现在受新的工作区信任功能控制。
  • 如果使用了 defaultProfileshellshellArgs 设置,现在会要求您将已弃用的设置迁移到配置文件系统中。
  • 现在可以在配置文件上设置 color

标题序列支持

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

Running 'git show' will result in the terminal's title changing to 'git'

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

The oh-my-zsh default prompt will show the computer's name and current working directory

改进了使用干净环境启动

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

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

Windows 上的原生换行支持

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

任务

终端选项卡上的任务状态

任务的状态现在显示在其终端选项卡中。对于后台任务,仅当存在关联的问题匹配器时才显示状态。

Task status on a terminal tab

自动关闭任务终端

任务的 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、样式和网络检查器,可以通过调试工具栏中的新“检查”图标访问。

Debugger inspect button

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

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

如果您尚未将 Microsoft Edge 用于浏览器调试,您可以通过在 launch.json 中将 "type": "chrome""type": "pwa-chrome" 替换为 "type": "pwa-msedge" 来切换到它。这在 Blazor 应用程序中也支持,只需在其启动配置中设置 "browser": "edge" 即可。

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

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

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

变量视图、监视视图和调试控制台 REPL 中都支持重命名的变量。您可以通过查看其生成的源代码映射文件中是否有一个非空的 "names" 数组来检查您的工具是否发出重命名信息。

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

当命中断点时,VS Code 现在会在断点视图中选择并显示该断点。这应该更容易理解是哪个断点导致程序中断。

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

As the user steps in the program, a breakpoint that got hit is selected and revealed in the BREAKPOINTS view

语言

TypeScript 4.3.2

VS Code 现在附带 TypeScript 4.3.2。此主要更新包括许多 TypeScript 语言改进,以及针对 JavaScript 和 TypeScript 工具的许多改进和错误修复。

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

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

Navigating code using JSDoc @link tags

JSDoc @link 标签的写法为:{@link symbolName}。您还可以选择性地指定要在符号名称的位置呈现的文本:{@link class.property Alt text}

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

import 语句中的补全

当您接受建议时,JavaScript 和 TypeScript 中的自动导入会自动添加导入。使用 VS Code 1.57,它们现在在编写 import 语句本身时也有效。

Auto imports in an import statement

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

非 JS/TS 文件的转到定义

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

Navigating to a non-JS/TS import

当使用 Ctrl/Cmd 单击在代码中导航时,这可能最有用。

排序导入源代码操作

JavaScript 和 TypeScript 的 排序导入 代码操作对您的导入进行排序。但是,与 整理导入 不同,它不会删除任何未使用的导入。

您还可以通过设置在保存时启用导入排序

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

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

TypeScript 的 推断函数返回类型 重构为函数添加显式的返回类型注释。

The Infer function return type refactoring in action

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

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

如果您的 TypeScript 服务器日志记录已启用很长时间,VS Code 现在会提示您。

TS server logging enabled notification

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

对扩展的贡献

远程开发

我们继续在 远程开发扩展 上进行工作,该扩展允许您使用容器、远程计算机或 适用于 Linux 的 Windows 子系统 (WSL) 作为功能齐全的开发环境。

1.57 中的功能亮点包括

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

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

扩展创作

Notebook API

我们已经完成了大部分 Notebook API。该 API 分为三个不同的部分

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

一个简单的 Notebook 序列化程序和回显控制器的示例。序列化程序使用 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 文件的 Notebook 类型。此外,每当打开此类 Notebook 时,VS Code 将发出 onNotebook:echobook 激活事件。

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

状态栏项目“id”和“name”属性

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

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

Status bar item menu

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

在新终端中打印消息

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

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

Terminal displaying a custom message

内联值的新主题颜色

添加了新的颜色来为调试器内联值设置主题。

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

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

Debug inline values are shown with the foreground and background color customized

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 发送或从 webview 发送类型化数组存在一些怪癖。

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

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

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

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

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

调试会话中的 parentSession

不久前,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 日 0:00 UTC 或之后创建的任何 VS Code 1.56(或更新版本)构建。这使您可以安全地在即将发布的 Insiders 版本之前发布过期的扩展更新。

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

树形悬停支持命令 URI

TreeItem 具有受信任的 Markdown 工具提示时,该工具提示可以包含格式为 [这是一个链接](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 消息,并且修复了许多错误。

如果您使用 测试资源管理器 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,则扩展贡献的配置文件应显示在配置文件列表中

Extension contributed profile is displayed in the profiles list

终端选项中的 iconPath 支持

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

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

更改 Pseudoterminal 的标题

新的事件 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

文档

Build 2021 上的 VS Code

如果您错过了 Microsoft Build 2021 开发者活动,您仍然可以按需观看会议。请查看 Build 2021 上的 Visual Studio Code 博客文章,我们在其中汇总了我们认为 VS Code 用户会感兴趣的会议列表。

What's New in VS Code Build 2021 session on YouTube

浏览器调试

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

PyTorch

有一个新主题介绍如何在 VS Code 中使用 PyTorch 机器学习框架。在 VS Code 中的 PyTorch 支持文章中,您将了解如何使用 PyTorch 和 TensorFlow 数据类型扩展 Jupyter Notebook。

PyTorch logo

值得注意的修复

  • 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 的贡献