在 VS Code 中尝试

二月 2021 (版本 1.54)

更新 1.54.1:此更新解决了扩展依赖项的问题

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

更新 1.54.3:此更新解决了此问题

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


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

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

欢迎参加美国太平洋时间 3 月 11 日星期四上午 8 点(伦敦时间下午 4 点)举行的 VS Code 团队直播,观看此版本中新功能的演示,并向我们现场提问。

Insiders 版本:想尽快试用新功能?您可以下载每晚发布的 Insiders 构建版本,并尽快尝试最新的更新。

Apple Silicon

我们很高兴在本迭代中发布首个 Apple Silicon 的稳定构建版本。使用 M1 芯片的 Mac 用户现在无需通过 Rosetta 模拟即可使用 VS Code,并且在运行 VS Code 时会注意到更好的性能和更长的电池续航时间。感谢社区使用 Insiders 构建版本进行自托管并在迭代早期报告问题。

适用于 macOS 的默认 VS Code 下载现在是一个通用构建版本,可在所有 Mac 上原生运行。在下载页面上,您可以找到针对 Intel 或 Apple Silicon 的特定架构构建版本的更多链接,与通用包相比,这些下载文件更小。

Website showing the new downloads view for Apple Silicon builds

Website showing the default download for macOS

可访问性

工具栏和选项卡占用一个 Tab 停靠点

工作台中的所有工具栏现在都遵循标准导航行为,因此工具栏在 Tab 键顺序中仅占用一个位置,并且可以使用箭头键进行导航。焦点位于工具栏上后,应使用箭头键将焦点移动到工具栏中的特定项。由于此更改,工作台的 Tab 停靠点大大减少,从而更容易在所有部分之间导航。

为了保持一致性,也对选项卡区域应用了相同的更改。因此,整个选项卡区域只有一个 Tab 停靠点,选项卡之间的键盘导航应使用左箭头键和右箭头键完成。

Windows 上的单词导航

我们改进了 Windows 上执行单词导航的方式,使其与 Windows 上的屏幕阅读器对基于 Electron 的应用程序的预期一致。现在,使用单词导航时,屏幕阅读器将正确读出每个单词。

由于此更改,我们将弃用以下命令。它们仍然有效,但我们将来可能会将其删除。

  • cursorWordAccessibilityLeft
  • cursorWordAccessibilityLeftSelect
  • cursorWordAccessibilityRight
  • cursorWordAccessibilityRightSelect

非 Windows 平台已经按预期工作,因此我们没有做任何更改。

改进了视图和按钮的角色

根据用户反馈,我们改进了工作台中多个视图和按钮的角色。活动栏侧边栏面板现在具有 role:none,这将使屏幕阅读器更加简洁。活动栏中的管理帐户按钮现在可以正确地播报它们具有弹出窗口。

集成终端

在窗口重新加载时保留终端进程

本地终端进程现在在窗口重新加载时恢复,例如扩展安装需要重新加载时。终端将重新连接,并且终端的 UI 状态将恢复,包括活动选项卡和拆分终端相对尺寸。

In a local window, two split terminals are created and resized. On reload, the layout appears unchanged.

可以通过将 terminal.integrated.enablePersistentSessions 设置为 false 来禁用此功能。

Windows 性能改进

得益于新的终端进程布局,现在可以更快地处理来自终端进程的频繁 pty 数据事件。由于 Windows 上的 conpty 提供较小的事件,预计这将对 Windows 的影响大于其他平台。

自动重新启动需要更改环境的终端

最近推出了一项新功能,使扩展能够影响终端的环境。各种语言扩展和内置的 Git 扩展都使用此功能,以使 VS Code 作为 Git 身份验证提供程序,从而无需登录。以前,此功能的 UX 是在右上角显示一个微妙的 ⚠️ 图标,指示终端的环境已过期。该指示符很微妙,因为环境更改可能重要也可能不重要。

我们对此进行了调整,以便在终端尚未进行交互时自动重新启动环境已过期的终端。这可能会导致一些闪烁,但现在的扩展终端集成更加无缝。例如,WSL 窗口中的第一个终端不应再显示 Git 身份验证错误,前提是重新启动在终端中输入之前发生。

工作台

Emmet

Wrap with Abbreviation (使用缩写包裹)Wrap Individual Lines with Abbreviation (使用缩写包裹单行) 命令已合并为一个 Wrap with Abbreviation (使用缩写包裹) 命令,以减少关于使用哪个包裹命令的困惑。此外,Wrap with Abbreviation (使用缩写包裹) 命令现在可以正确显示预览空白。

emmet.extensionsPath 设置现在也可以接受路径数组,而不仅仅是字符串。因此,结合设置同步,可以根据所在的机器指向不同的代码片段文件,而无需每台机器更新设置。

产品图标主题

首批产品图标主题已在扩展市场中可用。感谢主题作者的出色工作!

要选择或查找主题,请使用命令面板或设置齿轮中的首选项:产品图标主题命令。

Product icon themes in the Extension Marketplace

上下文键的 IntelliSense

VS Code 使用 when 子句来启用和禁用按键绑定。扩展也使用 when 子句来控制菜单视图贡献点。现在编写这些 when 子句要简单得多,因为编辑器为它们提供了补全功能。

keybindings.json 中上下文键的 IntelliSense 主题:GitHub Light Theme,字体:FiraCode

打开的编辑器新建无标题文件操作

现在在打开的编辑器视图标题区域有一个新建无标题文件操作。

New untitled file in Open Editors view

更新了应用程序菜单设置

用于应用程序菜单可见性的 window.menuBarVisibility 设置已更新,以更好地反映选项。主要进行了两项更改。

首先,设置中的 default 选项已重命名为 classic

其次,应用程序菜单栏中的显示菜单栏条目现在可以在 classiccompact 选项之间切换。要完全隐藏它,您可以更新设置,或在 compact 模式下使用活动栏的上下文菜单。

应用程序菜单中的显示菜单栏条目 主题:GitHub Light Theme

Webview 缓存改进

我们改进了 webview 中本地文件的缓存。如果 webview 从磁盘重新加载文件,那么我们现在使用 ETags 来避免在文件未更改时再次读取文件。这可以减少数据传输,并提高响应时间,特别是对于远程工作空间。

此缓存目前仅适用于现有 webview 重新加载资源时。它不适用于新创建的 webview,即使该 webview 属于之前创建过类似 webview 的扩展。

工作空间搜索操作的更改

我们已修改了现有的 workbench.view.search,使其不再将选定的文本放入搜索输入框中,而是直接打开输入框。要使用选定的文本创建新的搜索并遵守 search.mode 设置,应使用 workbench.action.findInFiles

仅修饰符按键绑定

现在可以为重复的修饰符定义按键绑定,例如 shift shiftalt altctrl ctrlcmd cmd / meta meta / win win。这些按键绑定可以在 keybindings.json 中手动输入,例如

{ "key": "shift shift", "command": "workbench.action.quickOpen" }

更新了列表/树状 UI

我们已更新列表/树状样式,以匹配原生的焦点和选择指示符:现在将使用轮廓颜色渲染焦点元素。

List/tree UI showing focused element

突破性更改

建议主题发布者也采用这种样式,只需将 list.focusBackground 颜色的自定义更改为 quickInput.list.focusBackground 颜色即可。要查看示例,请查看此提交

表格小组件

我们引入了一个新的表格小组件,它构建在现有列表小组件之上,因此我们可以以与渲染列表元素相同的性能渲染表格数据。目前,它用于我们远程功能的端口视图中。

Table widget view of remote Ports

入门

我们正在试验一种在启动时显示的新编辑器,称为入门编辑器。此编辑器旨在使 VS Code 的某些功能对新用户更易于上手。一些 Insiders 用户可能已经看到它了,并将在此迭代过程中缓慢地向更多 Stable 用户推出。您始终可以通过修改 workbench.startupEditor 设置为 gettingStarted 或从其更改来选择加入或退出新行为。

Getting Started experience walkthrough

时间线视图

您现在可以使用选择进行比较与所选内容比较命令比较 Git 历史时间线条目之间的更改——这类似于在资源管理器视图中比较文件。此功能可让您快速查看 Git 文件历史中任意两个提交之间的所有更改。

Select for Compare command in context menu

默认的面板分隔条悬停边框颜色

1.52 版本中,我们引入了面板分隔条的悬停边框颜色令牌 (sash.hoverBorder),但未设置默认值。我们现在默认在所有主题上显示此颜色。

Sash hover border color

调试

断点视图改进

删除断点的新内联操作

我们在断点视图中添加了一个内联操作 X 来删除断点。此操作应使删除断点更加容易。

Breakpoints view showing X next to selected breakpoint

对异常过滤器的帮助文本支持

最近,我们添加了在断点视图中编辑异常过滤器条件的选项。

为了使这些条件更易于发现且其语法不言自明,VS Code 现在在异常过滤器上显示悬停提示,并在条件文本框中显示占位符文本。

由于这两项信息都由底层的调试扩展提供,因此它比某些通用消息更具体(也更有帮助)。

由于此新功能基于调试适配器协议(见下文)的补充,因此需要调试扩展选择加入。在此版本中,只有 VS Code 的内置 JavaScript 调试器支持此新功能。

Breakpoint placeholder

新设置和其他改进

在调试控制台中折叠相同行

新增设置 debug.console.collapseIdenticalLines,用于控制调试控制台是否折叠相同行并使用徽章显示多次出现。默认值为折叠。

控制调试前保存哪些编辑器

新增设置 debug.saveBeforeStart,用于控制在调试开始前保存哪些编辑器。此设置具有以下值

  • allEditorsInActiveGroup:保存活动组中的所有编辑器。默认值。
  • nonUntitledEditorsInActiveGroup:保存活动组中的所有编辑器,但不包括无标题编辑器。
  • none:不保存任何编辑器。

此设置对于 PowerShell 调试非常有用,因为 PowerShell 调试器支持调试未保存的文件。

改进了重新启动帧操作的启用方式

通过对调试适配器协议的新增内容,调试扩展现在可以向 VS Code UI 通信选定的堆栈帧上是否可用“重新启动帧”操作。VS Code 现在在调用堆栈视图中为无法重新启动的堆栈帧禁用重新启动帧的内联操作。

例如,JS-Debug 扩展已采用此方法,现在异步堆栈跟踪会禁用重新启动帧操作。

语言

TypeScript 4.2

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

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

快速修复声明缺失函数

新的添加缺失函数声明快速修复可以为缺失函数生成存根。例如,如果调用了缺失函数 add

const x: number = add(1, 2);

add 上使用添加缺失函数声明的结果是

const x: number = add(1, 2);
function add(arg0: number, arg1: number): number {
  throw new Error('Function not implemented.');
}

在编写代码时可以使用此快速修复,根据调用签名快速生成函数存根。

要在 JavaScript 中使用此快速修复,必须启用类型检查

JS Doc 模板现在生成 @returns

JS Doc 模板现在在被注释的函数包含 return 语句时自动包含 @returns。例如,对于函数 getViz

function getViz(el) {
  return el?.viz;
}

生成的 JSDoc 模板是

/**
 *
 * @param {*} el
 * @returns
 */
function getViz(el) {
  return el?.viz;
}

您可以使用 javascript.suggest.jsdoc.generateReturnstypescript.suggest.jsdoc.generateReturns 在 JSDoc 注释中禁用 @returns

现已标记已弃用的 DOM API

现在在建议和代码中已将已弃用的 DOM 方法标记为已弃用

document.clear being marked as deprecated in code

您可以通过设置 editor.showDeprecated: false 来禁用在编辑器中显示已弃用的属性和函数。

Notebooks

自动重新加载 Notebooks

Notebooks 现在在文件在磁盘上更改且没有未保存更改时自动重新加载。这应该会使处理处于版本控制下的 Notebooks 变得更加简单。

改进了大型单元格的焦点显示

当焦点位于大型 Notebook 单元格上时,当单元格的顶部和底部超出视图时,您可以更好地判断哪个单元格处于焦点。我们现在在焦点单元格的左侧和右侧显示边框。

Notebook focus for a large cell

CSS/LESS/SCSS 和 HTML 中的悬停提示

您现在可以微调 HTML 和 CSS 中悬停提示的内容,以

  • 不显示 MDN 的文档
  • 不显示指向 MDN 页面的链接

使用设置 css.hover.documentationcss.hover.references 更改 CSS 的悬停提示。将 css 替换为 htmlcssscssless 以更改这些语言的设置。

预览功能

Notebooks 的可扩展 Markdown 渲染器

在本次迭代中,我们探索了如何使 Notebook 单元格的 Markdown 渲染器可扩展。例如,在下面的屏幕截图中,我们扩展了 VS Code 的 Markdown 渲染器,以支持在 Notebook 单元格中显示数学公式

A math formula being rendered in a notebook cell

为了使我们的 Markdown 渲染器可扩展,我们探索了使用 Markdown It 来渲染所有 Notebook Markdown。我们还探索了将渲染的 Markdown 移动到 Notebook 的后层 webview 中。

虽然我们尚未准备好为此开放官方 API,但我们计划在 3 月份继续进行此探索。您今天也可以使用未记录的 notebook.experimental.useMarkdownRenderer: true 设置试用新的可扩展 Markdown 渲染器。

对扩展的贡献

Brackets

来自 Brackets 源代码编辑器的开发者可以使用 Brackets 按键映射扩展在 VS Code 中继续使用他们相同的键盘快捷方式。还有一个 Brackets 扩展包,它捆绑了用于处理 CSS 和创建实时预览的扩展。

Brackets Extension Pack in the Marketplace

GitHub Pull Requests 和 Issues

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

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

远程开发

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

1.54 版本的功能亮点包括

  • 端口视图表格布局
  • 远程 - SSH:X11 转发
  • WSL:改进了 WSL 2 支持

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

扩展创作

编辑器标题菜单和“运行”子菜单的限制

编辑器工具栏 (editor/title) 中的空间有限。因此,我们已采取以下措施:

  • 实现了溢出行为。当主要组(即使用图标渲染的操作组)超过九个命令时,所有附加命令将溢出到 ... 菜单中。
  • 添加了 editor/title/run 子菜单。我们请求扩展作者将运行和调试命令贡献到此菜单中,而不是像我们在上一版本中建议的那样贡献到 editor/title 菜单中。此外,为了使命令显示在正确的位置,不再需要使用魔术分组值 1_run@101_run@20

Run dropdown menu

另请注意,运行子菜单是动态的,当它是唯一子菜单时,它将用其第一个子菜单替换自身。

身份验证提供程序 API

您现在可以注册一个身份验证提供程序,其他扩展可以使用该提供程序对服务执行身份验证。

扩展市场的新反馈渠道

针对扩展市场相关问题,新增了一个 公共仓库。如果您遇到技术问题、想要提供反馈或有功能需求,请提交议题

更新了 codicons

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

  • debug-rerun
  • gather
  • git-pull-request-create
  • notebook-template
  • run-above
  • run-below
  • type-hierarchy
  • type-hierarchy-sub
  • type-hierarchy-super
  • variable-group

Codicons for tasks

我们还更新了以下图标以保持一致性

  • debug-alt-small
  • debug-alt
  • debug-rerun
  • play-circle
  • play
  • run-above
  • run-all
  • run-below

Consistent codicons

提议的扩展 API

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

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

您不能发布使用提议 API 的扩展。下个版本可能存在突破性更改,我们绝不希望破坏现有扩展。

图标贡献点

图标贡献点允许扩展通过 ID 定义一个新图标,以及一个默认图标。然后,该图标 ID 可以由扩展(或依赖于该扩展的任何其他扩展)在可以使用 ThemeIcon 的地方使用:在 Markdown 字符串中(例如,"$(distro-ubuntu)" Ubuntu 20.04")以及所有接受 ThemeIcon 的地方(例如,new ThemeIcon("distro-ubuntu"))。

产品图标主题可以重新定义图标(如果它们知道图标 ID)。

更多信息请参阅议题 114942,以获取详细信息并提供反馈。

内联值提供程序 API

目前,VS Code 调试器的显示内联值功能基于 VS Code 内核中的通用实现,并且不通过设置或扩展提供可定制性。因此,它并不完全适用于所有语言,有时会显示不正确的值,因为它不理解底层源代码语言。因此,我们正在开发一个扩展 API,允许完全替换内置实现或用自定义代码替换部分实现。

在此里程碑中,我们已提供了 提议 API 的首个实现。

内联值提供程序 API 简述如下:

  • 必须为一种语言注册一个 InlineValuesProvider
  • 对于给定的文档,InlineValuesProvider 必须定位应显示内联值的所有语言元素。
  • 对于每个元素,必须返回一个 InlineValue 描述符对象,该对象指示 VS Code 要显示哪些信息。目前支持三种类型的 InlineValue 对象:
    • InlineValueText:要显示的完整文本,
    • InlineValueVariableLookup:VS Code 将尝试在“变量”视图中查找以找到其值的变量名称。名称和值将以“name = value”的形式显示,
    • InlineValueEvaluatableExpression:VS Code 将发送给调试器进行评估的表达式。表达式和结果将以“expression = result”的形式显示。

以下代码片段(来自 Mock Debug)展示了一个针对“markdown”文件的最小内联值提供程序,它使用正则表达式定位“变量”,然后指示 VS Code 通过变量视图查找它们的值。

vscode.languages.registerInlineValuesProvider('markdown', {
  provideInlineValues(
    document: TextDocument,
    viewport: Range,
    context: InlineValueContext
  ): ProviderResult<InlineValue[]> {
    const allValues: InlineValue[] = [];
    for (let l = 0; l <= context.stoppedLocation.end.line; l++) {
      const line = document.lineAt(l);
      var regExp = /local_[ifso]/gi; // match variables of the form local_i, local_f, Local_i, LOCAL_S...
      do {
        var match = regExp.exec(line.text);
        if (match) {
          const varName = match[0];
          const varRange = new Range(l, match.index, l, match.index + varName.length);
          allValues.push(new InlineValueVariableLookup(varRange, varName));
        }
      } while (match);
    }
    return allValues;
  }
});

以下是内联值提供程序在实际使用中的示例

Debugger shows inline values

如果您想为此提议的 API 提供反馈,请在此议题中添加评论。

测试

我们继续在 VS Code 中的测试方面取得进展。本月,我们专注于完善 VS Code 中的基本体验和扩展 API。我们还发布了一些关于测试的临时文档,随着 API 的不断稳定,这些文档将得到充实。

语言服务器协议

即将发布的 3.17 版本已实现 诊断拉取模型 的首个提议。该提议可在 VS Code LSP 库 的后续版本中获得。

调试适配器协议

ExceptionBreakpointsFilter 的更多帮助文本属性

已向 ExceptionBreakpointsFilter 添加了两个可选的 UI 属性 descriptionconditionDescription

使用这些属性,客户端可以显示有关异常断点的附加信息。description 属性可以显示在悬停提示中,conditionDescription 可以用作可编辑条件的文本框的占位符文本。

改进了 setExceptionBreakpoints 请求的描述

我们通过添加关于用户输入无效异常断点条件时适配器应如何做的指南,改进了 setExceptionBreakpoints 请求的描述。

堆栈帧的新 canRestart 属性

栈帧中新增了一个可选的布尔属性 canRestart。它指示栈帧是否可以使用 restart 请求重新启动。根据此信息,客户端可以启用或禁用 **Restart Frame** 上下文菜单操作。

工程

Electron 沙箱的进展

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

具体来说

  • 我们能够将渲染器中的一些原生模块需求转移到其他进程中。
  • 实现了 MessagePort 通信通道,以便在启用沙箱时工作。

新终端进程布局

终端进程现在在新的“pty host”进程下生成,而不是在窗口进程下。这一更改不仅是 Electron 沙箱的一部分,还应该提高终端的稳定性和性能。

Windows 安装程序发布到 Windows 包管理器

x86x64 架构的 Windows 用户和系统安装程序现在正在发布到 Windows 包管理器。您可以使用 winget 工具搜索所有 Visual Studio Code 安装程序 - winget search vscode,并安装任何已发布的安装程序。

使用 TypeScript 4.3 构建 VS Code

VS Code 现在使用 TypeScript 4.3 的每夜构建进行构建。这使我们能够验证 TypeScript 团队的最新工作,并对新更改提供反馈。

最新的 TypeScript 版本已经帮助我们发现了几个 在条件语句中遗漏 await 的情况。

防止修改 yarn.lock

我们现在有 CI 来阻止针对 yarn.lock 文件的拉取请求,以提高供应链安全性。

默认分支:main

我们已开始将所有仓库的默认分支重命名为 main,包括 microsoft/vscode。这项工作已完成大约 60%。

文档

VS Code 和 Python 在课堂教学中的应用

阅读 Harvey Mudd 学院一位计算机科学教授的案例研究,他在使用 Python 的计算机科学入门课程中使用了 VS Code。了解他为学生推荐的设置,以及有用的扩展和免费的自定进度 Python 和数据科学课程。

扩展故障排除博客文章

人人都喜欢安装和使用 VS Code 扩展。但是,当你安装了许多扩展时,有时编辑器可能会开始表现得“怪异”,了解这种行为是否由某个特定扩展引起将非常有帮助。如果你错过了之前关于 扩展二分查找 工具的公告,你可以阅读这篇 《使用二分查找解决扩展问题》 博客文章,它描述了如何快速排除“有问题”的扩展,甚至可以帮助扩展作者提供反馈。

值得注意的修复

  • 100151: 菜单键在文件资源管理器中应用到错误的项
  • 112055: 调试时每个 Python 会话都打开一个新的集成终端
  • 114881: 复制文件夹或文件时保留符号链接
  • 114933: “任务无法跟踪”的困扰
  • 115922: 在文件资源管理器中过滤时方向键不起作用
  • 116037: 调试控制台的输出中没有显示链接悬停
  • 116101: 在命令搜索中找不到目标命令,因为英文描述已消失
  • 116932: 从贡献的命令执行中抛出自定义异常时显示神秘的错误弹出窗口

感谢

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

对问题跟踪的贡献

vscode 项目的贡献

language-server-protocol 项目的贡献

vscode-languageserver-node 项目的贡献

vscode-emmet-helper 项目的贡献

vscode-html-languageservice 项目的贡献

vscode-js-debug 项目的贡献

vscode-textmate 项目的贡献

vscode-vsce 项目的贡献