现已发布!阅读 10 月份的新功能和修复。

2021 年 5 月(版本 1.57)

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

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

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


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

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

观看亮点 此版本中的新功能在 VS Code 团队的发行派对中。您可以在我们的 YouTube 频道上找到 事件记录

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

工作区

工作区信任

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 设置覆盖扩展的信任状态。

注意:谨慎覆盖扩展的工作区信任支持。可能是扩展作者出于充分的理由在受限模式下禁用了他们的扩展。

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

  "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 市场安装它。

简单回顾一下,远程仓库扩展允许您直接在 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 Touch Bar icons 默认视图

macOS Touch Bar icons while debugging with more controls 调试时

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.inheritEnv` 自 v1.36 版本起可用,但其实现存在一些缺陷,可能会导致 Linux 上因权限问题而失败,并且在 macOS 上可能无法按预期工作。

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

Windows 上的原生换行符支持

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

任务

终端选项卡上的任务状态

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

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 中受支持。您可以通过查看其生成的源映射文件中的非空“名称”数组来检查您的工具是否发出重命名。

在 BREAKPOINTS 视图中显示命中断点

当断点命中时,VS Code 现在将在 BREAKPOINTS 视图中选择并显示它。这应该使您更容易理解哪个确切的断点导致程序中断。

目前只有 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 现在支持 JSDoc @link 标签 在 JavaScript 和 TypeScript 注释中。这些允许您创建指向文档中符号的可点击链接

Navigating code using JSDoc @link tags

JSDoc `@link` 标签写为:`{@link symbolName}`。您还可以选择指定文本以替换符号名称:`{@link class.property Alt text}`。

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

导入语句中的自动完成

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

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 Server 日志记录

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

TS server logging enabled notification

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

对扩展的贡献

远程开发

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

1.57 中的功能亮点包括

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

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

扩展编写

笔记本 API

我们已经完成了大多数笔记本 API。API 分为三个独立的部分

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

一个简单的笔记本序列化器和回声控制器的示例。序列化器使用 `JSON.parse` 和 `stringify`,并对空文件进行特殊处理。控制器返回单元格文本的大写变体 - 一次作为纯文本,一次作为 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` 本身动态更改。

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

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.inlineValues` 为 `true`。

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

vscode-webview.d.ts

新发布的 `@types/vscode-webview` 包为 VS Code 在 Web 视图中公开的 API 添加了类型。

您可以使用 `npm install --save-dev @types/vscode-webview` 安装这些类型。如果您的项目中没有选择 Web 视图类型,请尝试将它们添加到 `jsconfig` / `tsconfig` 的 `typeAcquisition` 部分

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

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

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

改进的 Web 视图数组缓冲区传输

在以前的 VS Code 版本中,向 Web 视图发送或从 Web 视图接收类型化数组存在一些怪癖

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

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

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

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

如果扩展针对 VS Code 1.57+,则应在接收端重新创建类型化数组,并且将大型类型化数组传输到 webview 和从 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 工具提示时,该工具提示可以包含格式为 [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 消息,并且修复了许多 bug。

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

Extension contributed profile is displayed in the profiles list

终端选项中的 iconPath 支持

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

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

更改伪终端的标题

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

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