在 VS Code 中试试

2021 年 7 月 (版本 1.59)

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

此版本还解决了CVE-2021-26437

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


欢迎阅读 Visual Studio Code 2021 年 7 月更新。此版本包含许多您可能会喜欢的更新,其中主要亮点包括

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

加入我们直播:太平洋时间 8 月 10 日星期二上午 8 点(伦敦时间下午 4 点),观看 VS Code 团队直播,了解本次版本中的新功能演示,并向我们提出您的问题。

Insiders:想尽快试用新功能?您可以下载每夜构建的 Insiders 版本,并在最新更新发布后立即体验。

工作台

扩展

改进了调整大小时的扩展视图。在下面的短视频中,默认宽度的扩展视图显示所有详细信息(以前图标、评分和安装次数不显示)。当视图缩小后,显示更小的扩展图标;宽度进一步缩小时,则隐藏图标和评分。

Dynamic Extensions view

主题:GitHub Light Theme

扩展视图现在会显示扩展的自定义悬停提示。这个丰富的悬停提示包含扩展的完整描述以及其他有用信息,例如为什么扩展被禁用或推荐。

Custom Extension hover

主题:GitHub Light Theme

您现在可以在扩展面板的新运行时状态选项卡中查看扩展的运行时状态。状态信息包括其激活时间、是否在启动时激活以及是否有任何警告或错误。部分信息显示在扩展视图及其悬停提示中(如上图所示)。

Extension Runtime Status

主题:GitHub Light Theme

扩展面板的详细信息选项卡现在显示类别、资源链接以及其他信息,例如扩展的发布和更新日期。选择一个类别将在扩展视图中显示该类别的其他扩展。

Extension Details

主题:GitHub Light Theme

设置编辑器

设置编辑器现在支持对象验证。验证会检查直接编辑 JSON 文件时可能引入的类型错误。

Object setting showing validation errors

数组设置在非编辑模式下现在支持拖放。此外,设置了属性 uniqueItemstrue 的枚举数组设置现在只显示剩余的选项,而不是下拉列表中的所有选项。

Drag and drop for array settings

设置编辑器现在还支持多行字符串设置,其中值会显示在多行文本区域中,而不是单行输入框中。

An example of a multiline string setting

扩展的主题自定义语法

以下颜色自定义设置允许用户自定义当前主题的颜色

  • workbench.colorCustomizations
  • editor.tokenColorCustomizations
  • editor.semanticTokenColorCustomizations

现在可以使用新语法一次自定义多个主题

    "workbench.colorCustomizations": {
        "[Abyss][Red]": {
            "activityBar.background": "#ff0000"
        },
        "[Monokai*]": {
            "activityBar.background": "#ff0000"
        }
    },

可以列出多个主题,也可以在名称的开头和结尾使用 * 通配符。

支持 Jupyter Notebook

本月,我们将处理读取 *.ipynb 文件的代码从 Jupyter Notebook 扩展移到了一个新的内置扩展中。这意味着您现在可以在干净安装的 VS Code 中打开 Jupyter Notebook,而无需安装完整的 Jupyter 扩展。但是,如果您想执行单元格或查看使用 ipywidgets 或其他复杂渲染器类型的输出,则需要安装 Jupyter 扩展。

Notebook 布局改进

本次迭代我们对 notebook 布局进行了一些改进

  • 折叠单元格时现在会渲染单元格输入的第一行。
  • 当窗口宽度不足以渲染所有主要操作时,notebook 编辑器工具栏上的操作将移至溢出菜单 (...) 中。
  • notebook.undoRedoPerCell 的默认值现在已更改为 true

notebook layout improvements

我们还更新了代码单元格的默认样式,现在显示背景颜色以帮助区分单元格。主题可以使用 notebook.cellEditorBackground 来自定义此颜色。

Example of updated notebook code cells

最后,您现在可以使用设置 notebook.globalToolbarShowLabel 切换 notebook 工具栏上的文本标签。

Example of notebook toolbar text

配置复制相对路径的路径分隔符

一个新的设置 explorer.copyRelativePathSeparator 允许您在调用复制相对路径操作时明确设置路径分隔符。

可用的分隔符选项有

  • auto (默认) - 使用特定于操作系统的路径分隔符。
  • / - 使用斜杠作为路径分隔符。
  • \\ - 使用反斜杠作为路径分隔符。

跨编辑器组共享视图状态

添加了一个新的设置 workbench.editor.sharedViewState,用于配置编辑器视图状态(例如,编辑器中的滚动位置)如何在编辑器组之间共享。

默认情况下,此设置处于禁用状态,以保留当前行为。如果您在侧边打开编辑器,稍后关闭该编辑器组,然后再次在侧边打开编辑器,则不会恢复视图状态,因为您打开了一个新的编辑器组。但是,当您启用此设置时,最近的编辑器视图状态会在所有编辑器组之间保留,并将被使用,除非找到更特定于该编辑器组的视图状态。

下图中,当在侧边重新打开 package.json 文件时,选择状态得以保留。

Shared editor group view state

编辑器

在折叠区域间导航

有一些新命令可以将光标位置设置到相应的折叠处

  • 转到下一个折叠 (editor.gotoNextFold)
  • 转到上一个折叠 (editor.gotoPreviousFold)
  • 转到父级折叠 (editor.gotoParentFold)

这些命令目前没有默认的键盘快捷方式,但您可以通过首选项:打开键盘快捷方式 (⌘K ⌘S (Windows, Linux Ctrl+K Ctrl+S)) 添加您自己的键盘快捷方式。

自动折叠导入

使用设置 editor.foldingImportsByDefault 可以自动折叠导入语句。文件首次打开后,折叠状态就会被存储。此功能适用于 TypeScript、JavaScript、Java、C#、C++ 以及所有具有折叠范围提供程序并将导入语句标注为 FoldingRangeKind.Imports 的语言。

从选择中填充搜索字符串

查找控件设置 editor.find.seedSearchStringFromSelection 已扩展,支持仅从非空选择中填充搜索字符串。默认情况下,当显示查找控件时,编辑器将使用选择内容或空选择附近单词作为搜索关键词。

行内建议改进

我们改变了行内建议的渲染方式。这不仅修复了许多 Bug,还使得换行时也能感知行内建议。

此外,现在支持非尾随位置的多行行内建议。

嵌入提示改进

我们也改变了嵌入提示的渲染方式。通过使用与行内建议相同的机制,嵌入提示现在也被考虑用于换行。这种机制还支持在嵌入提示周围设置单独的光标停止点。

终端

跨窗口拖放终端

将终端从一个窗口的选项卡列表或编辑器区域拖放到另一个窗口的选项卡列表、编辑器区域或面板中。

Drag and drop terminal across windows

子进程跟踪和关闭警告

现有的设置 terminal.integrated.confirmOnExit 和新的设置 terminal.integrated.confirmOnKill 使用子进程跟踪功能,当尝试关闭一个在 shell 进程下有子进程的终端时,会显示警告。默认情况下,此跟踪只影响编辑器区域的终端,但现在可以配置为对所有终端或面板区域的终端显示警告。

将贡献的终端配置文件设置为默认

扩展贡献的终端配置文件现在可以设置为默认配置文件。默认终端配置文件在终端下拉列表中用默认后缀表示。

The terminal profile dropdown displays indicates the extension terminal profile is set as the default

下划线和删除线支持

集成终端现在支持下划线和删除线属性。例如,可以配置 Git 使用这些新属性

Git output in terminal with underline and strikethrough text

主题:Sapphire Theme

以上示例在 .gitconfig 中使用了以下设置

[color "status"]
  added = green bold
  changed = red bold strike
  untracked = cyan
  branch = yellow black bold ul

在编辑器区域侧边创建终端

新增命令 workbench.action.createTerminalEditorSide,可在活动编辑器旁边的编辑器区域创建终端。

活动终端选项卡指示器

主题现在可以使用主题键 terminal.tab.activeBorder 设置垂直线的颜色,以指示活动的终端选项卡。

Highlighted active terminal

如果未设置 terminal.tab.activeBorder,则颜色将回退到 tab.activeBorder

禁用终端选项卡图标动画

新的设置 terminal.integrated.tabs.enableAnimation 将禁用终端选项卡图标的动画。对于任务,将使用播放按钮,而不是旋转动画。

Terminal tab without animation and play button displayed

调试

改进编辑器标题中的运行/调试按钮

在二月版本中,我们在编辑器标题区域的中心(且紧凑)位置引入了一个下拉按钮,用于分组运行和调试命令(请参阅1.54 版本说明)。根据用户反馈,我们尝试通过记住上次执行的操作来改进下拉按钮。下拉按钮现在有两个点击区域,一个用于默认操作(左侧),另一个用于下拉菜单(右侧),当选择右侧时,会运行操作并将其记住为新的默认操作。

Debug/run split button shown for Java

下拉按钮的行为

  • 如果只有一个运行或调试操作,则省略下拉菜单。
  • 如果存在多个运行或调试操作,所有操作都会出现在下拉菜单中,并将下拉菜单中的第一个操作设置为默认操作(前提是没有记住的操作)。
  • 默认操作会为特定工作区保留,跨 VS Code 重启生效;但不会按编辑器保留。

对扩展的贡献

实时预览

Live Preview 扩展,上月发布,包含一些令人兴奋的新功能。其中包括

  • 与内置 JavaScript 调试器兼容,用于外部预览。
    • 运行Live Preview: Show Debug Preview 命令来尝试一下!
  • 改进了嵌入式浏览器,例如支持“在页面中查找”以及快速访问 webview DevTools。
  • 对自动生成的文件进行文件系统监视。
  • 还有更多!🎉

要查看本月进展的更多详细信息,请参阅扩展的版本说明

Live Preview Debugging

Live Preview new browser features

主题:GitHub Dark Theme

GitHub 拉取请求和问题

我们持续改进 GitHub Pull Requests and Issues 扩展,该扩展允许您处理、创建和管理拉取请求和问题。本月的一大亮点是,开始处理问题的功能已扩展,允许您处理当前仓库之外的问题。

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

Jupyter

我们持续改进 Jupyter 扩展。要了解所有新功能和更新,您可以阅读扩展七月版本的完整变更日志

如果您想了解更多关于 VS Code 如何原生支持 notebook 的历程,可以阅读最近的博客文章 Notebook 的成熟

交互式窗口

Jupyter 交互式窗口提供了一种构建和使用 Jupyter Notebook 的替代方式,它使用文本文件而非 notebook 界面。上个月,我们预览了 Jupyter 交互式窗口的升级版本,其特点是更深入的工作台集成,包括支持主题、自定义键绑定、代码片段、与扩展兼容等。非常感谢用户通过 GitHub 问题就预览体验提供的反馈。内置交互式窗口现在是 1.59 版本中的默认界面。旧界面仍可通过设置 "jupyter.enableNativeInteractiveWindow": false 使用,并将在后续版本中移除。我们期待您的反馈

Shift+Enter to run code in the Interactive window

按行运行

我们一直在努力支持 Jupyter Notebook 中的“按行运行”功能。此功能本质上是一种简化的调试模式,可让您逐行单步执行单元格代码,而无需复杂的调试 UI。此功能仍处于实验阶段,但您可以通过设置 "jupyter.experimental.debugging": true、在您选择的内核中安装 ipykernel 版本 6,然后在单元格工具栏中选择按行运行按钮来尝试此功能。

Run by line

Python

Python 扩展中,我们改进了 Python 解释器列表的排序方式。过去,虚拟环境会显示在列表底部,导致需要大量滚动和/或搜索。现在位于项目根目录的虚拟环境会优先显示,其次是全局安装的环境。

List of Python interpreters

开发容器 devcontainer CLI

开发容器扩展用于在 VS Code 中使用 Docker 容器,现在包含一个 devcontainer 命令行界面,可让您在开发容器中打开文件夹 (devcontainer open) 或构建开发容器镜像 (devcontainer build)。

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

预览功能

无标题文件自动语言检测

我们很高兴宣布无标题文件自动语言检测的初步预览版,该功能使用机器学习来检测您正在使用的语言,并自动设置无标题文件的语言模式。此功能使用开源 ML 库 Tensorflow.js 和 GitHub 用户 @yoeoGuesslang ML 模型。

在此版本中,此功能默认关闭,但我们计划在下一次迭代中将其设为默认。要启用它,请应用以下设置

"workbench.editor.untitled.experimentalLanguageDetection": true

要看此功能实际效果,请打开无标题文件(文件 > 新建文件)并将源代码粘贴到编辑器中。

这是自动检测 Python 代码的示例

paste a code snippet right into VS Code and it will detect the language

主题:Panda Theme

此外,您可以通过打开语言选择器查看正在检测的语言。

the language picker also shows the detected languages if there are any

主题:Panda Theme

注意:如果语言检测置信度不够高,您将保持当前语言模式,并且在语言检测置信度更高之前,语言选择器中不会显示结果。

此设置还允许您提供语言覆盖,以指定您不希望自动切换的语言模式。

这是一个不自动检测 Markdown 文件的示例

"workbench.editor.untitled.experimentalLanguageDetection": true
"[markdown]": { "workbench.editor.untitled.experimentalLanguageDetection": false }

使用以上设置,当您编辑无标题的 Markdown 文件时,自动语言检测不会运行。但是,如果您修改任何其他类型的无标题文件,自动语言检测会根据这些文件的内容运行。

我们将与 ML 模型交互的代码分离到自己的库中,并在 vscode-languagedetection 仓库中作为 npm 包发布。

请让我们知道无标题文件自动语言检测对您来说效果如何!

TypeScript 4.4

此版本包含对即将发布的 TypeScript 4.4 的支持。您可以在TypeScript 博客上阅读有关 TypeScript 4.4 中新语言特性和改进的更多信息。一些工具亮点:

  • JavaScript 和 TypeScript 文件中的参数名和类型嵌入提示。
  • 普通 JavaScript 文件中的基本拼写建议。这些建议仅在 TypeScript 语言服务对错误和修复具有足够的置信度时显示。

要开始使用 TypeScript 4.4 每夜构建版本,请安装 TypeScript Nightly 扩展。

请分享您的反馈,如果您在使用 TypeScript 4.4 时遇到任何 Bug,也请告知我们。

反汇编视图

感谢 Microsoft C++ 团队的巨大贡献,我们很高兴在本里程碑中提供调试反汇编视图的预览版。

反汇编视图可以从编辑器的上下文菜单中打开,以显示活动堆栈帧的反汇编源代码,并支持单步执行汇编指令以及在单个指令上设置断点。

反汇编视图仅在活动的调试会话中且底层调试扩展支持时可用。截至目前,只有 Microsoft 的 C++Mock Debug 扩展可以提供反汇编视图数据。

Disassembly view in Mock Debug extension

从技术角度来看,VS Code 实现的反汇编视图现在支持调试适配器协议的另外四个特性

  • 用于提供内存位置反汇编源代码的 disassembly 请求。
  • 堆栈帧上的 instructionPointerReference 属性。
  • 单步执行请求上的 granularity 属性。
  • 指令断点和 setInstructionBreakpoints 请求。

扩展创作

测试 API

去年秋天,我们开始着手为 VS Code 添加原生测试运行支持,本月第一批与测试相关的 API 已定稿。这些 API 提供了比现有扩展更强的灵活性、更好的性能和更丰富的用户体验。查阅编写测试扩展的指南来深入了解。

Image showing the test explorer and rich diff view experience

主题:codesong

Test Explorer UI 扩展的现有用户可以通过将 testExplorer.useNativeTesting 设置为 true 来获得原生体验。然而,此转换是 Test Explorer UI 扩展现有 API 的反映,因此不包含诸如丰富差异支持等某些功能。

首批采用测试 API 的扩展之一是包含在 Extension Pack for Java 中的 Microsoft Test Runner for Java

Java extension using the native test API in VS Code

新建文件菜单的贡献点

提供新建文件编辑器方式(例如 notebook 或自定义编辑器)的扩展现在可以向新的 file/newFile 菜单贡献点贡献命令。可以通过欢迎页或文件菜单中的新建文件...项访问此菜单。

New File menu in use via Welcome page

状态栏丰富悬停提示

状态栏项现在支持包含链接和图标的丰富悬停提示 StatusBarItem.tooltip: string | IMarkdownString

Rich Status bar hover

  • 如果 MarkdownString.supportThemeIcons 为 true,您可以使用 $(iconName) 语法使用图标。
  • 如果 MarkdownString 受信任,您还可以添加命令链接。语法:([test](command:vscode.newWindow))

状态栏警告颜色

表示警告的状态栏项可以使用新添加的颜色 statusBarItem.warningBackgroundstatusBarItem.warningForeground

没有 additionalProperties 的对象设置

对象设置必须将 additionalProperties 设置为 false 才能在设置编辑器中得到支持。否则,设置编辑器将把该设置解释为可以采用任何形状的复杂设置,并将用户引导至 settings.json 文件。

多行字符串设置

要在设置编辑器中添加对多行字符串设置的支持,请将 "editPresentation": "multilineText" 作为键值对添加到字符串设置中。将字符串设置更改为多行将导致设置编辑器在多行文本区域中渲染设置值,而不是在单行输入框中。

更新的 codicons

我们在 codicon 库中添加了以下新图标

List of updated icons

  • azure
  • compass-active
  • compass-active
  • compass-dot
  • compass
  • debug-all
  • debug-coverage
  • git-pull-request-closed
  • git-pull-request-draft
  • issue-draft
  • layers-active
  • layers-dot
  • layers

文本文档更改原因

当触发 workspace.onDidChangeTextDocument 事件时,事件对象上的新属性 reason 指示文本更改是否由撤消或重做操作引起。

语言服务器协议

新一代 语言服务器协议 及其相应的 npm 模块已发布。3.17 版本包含一个关于补全项标签详细信息的提案,这与 VS Code 本身的最新更改一致。

调试适配器协议

定稿 "writeMemory" 请求和 "memory" 事件提案

writeMemory 请求已定稿,现在可在 调试适配器协议 的 1.48 版本及相应的 npm 模块中使用。如果调试适配器具有 supportsWriteMemoryRequest 功能,客户端可以使用 writeMemory 请求向给定位置的内存写入字节。

memory 事件有一个提案,将在下一个里程碑中添加到 DAP。

建议的扩展 API

每个里程碑都会带来新的建议 API,扩展作者可以试用这些 API。一如既往,我们期待您的反馈。以下是试用建议 API 的步骤

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

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

TaskGroup 的 isDefault 属性

group 属性存在于 tasks.json 文件中定义的任务上,并通过 tasks API 公开。group 属性有一个 isDefault 属性,该属性在此之前在 API 中不可用。此提案将 isDefault 属性作为 TaskGroup 上的只读属性公开,以便扩展可以读取哪个任务是组的默认任务,但不能通过设置组的默认任务来覆盖用户的配置。

AuthenticationGetSessionOptions 的 forceRecreate 属性

到目前为止,用于获取身份验证会话对象的 getSession API 从未具有要求用户登录的能力。对于使用 SAML/单点登录 (SSO) 的身份验证服务(例如 GitHub),当 SSO 会话过期时,访问令牌最终会丢失对资源的访问权限,因此需要提示登录。此提案向 AuthenticationGetSessionOptions 添加了一个名为 forceRecreate 的新属性,允许您要求用户再次登录。将向用户显示类似于指定 createIfNone 时的模态体验。

工程改进

桌面端 everywhere 都使用基于 iframe 的 webview

本月,我们完成了从基于 Electron webview 标签元素的过渡,转而使用基于普通 <iframe> 元素的 webview。这更好地统一了 VS Code webview 在桌面端和 Web 端上的实现,也使我们能够删除许多现在冗余的代码。

Electron 13 更新

在此里程碑中,我们完成了将 Electron 13 打包到 VS Code 的探索工作,并感谢所有参与 Insiders 版本测试和自托管的人员。这是一个主要的 Electron 版本,附带 Chromium 91.0.4472.124。此版本中 Node.js 版本没有变化,仍将是 v14.16.0。

Electron 沙盒支持进展

随着我们继续使 VS Code 工作台为启用 Electron 的沙盒做好准备,我们希望在 Linux 上启用混合沙盒模式,并且不再在我们的分发包 deb、rpm、snap 和 tar 存档中捆绑 CLI 参数 --no-sandbox。Chromium 在 Linux 上有一个多层沙盒模型。如果 Chromium 无法使用命名空间沙盒作为第 1 层,它将尝试通过随应用程序二进制文件一起提供的辅助二进制文件 chrome-sandbox 使用setuid 沙盒。为了使 setuid 二进制文件正常工作,需要满足以下条件

  • 沙盒二进制文件必须可由 Chromium 进程执行。
  • 它必须是 SUID 且可供其他人执行。

我们能够为 deb 和 rpm 包保留这些条件。目前无法为 snap 实现这些权限,我们有一个跟踪问题 #127140,以便未来解决 snap 包的问题。

至于使用 tar 存档,如果应用程序无法使用命名空间沙盒(例如在容器内运行时),它将出现以下错误

FATAL:setuid_sandbox_host.cc(158)] The SUID sandbox helper binary was found, but is not configured correctly. Rather than run without sandboxing I'm aborting now. You need to make sure that chrome-sandbox is owned by root and has mode 4755.

如果发生这种情况,您可以使用以下两种选项之一使其工作

  • 修复 setuid 辅助文件的权限

    sudo chown root <path-to-vscode>/chrome-sandbox
    sudo chmod 4755 <path-to-vscode>/chrome-sandbox
    
  • 使用 --no-sandbox 标志运行

冒烟测试改进

我们在每次构建时都会触发一系列冒烟测试,这些测试会启动 VS Code(包括桌面和 Web),并检查各种 UI 元素以确保功能正常。在这个里程碑中,我们投入精力改进此基础架构,以便从发布检查表中移除手动冒烟测试。

冒烟测试现在在所有平台(macOS、Linux 和 Windows)上运行。此外,我们一个更复杂的冒烟测试套件(专门检查 VS Code 上一个稳定版本和新版本之间的回归问题)已自动化,可在每次提交时运行。

最后,得益于我们用于自动化 Web 冒烟测试的出色库 Playwright,我们启用了其跟踪功能,以便使用其跟踪查看器工具重放失败的冒烟测试。

重要修复

  • 26425:当没有更改时,不应显示打开更改按钮
  • 100815:连接到远程 WSL 时,外部终端损坏
  • 106981: 窗口缩放设置为 -1 时终端光标出现残影
  • 127959: 调试器暂停时打开调试窗格
  • 129059: 设置编辑器中的对象小部件未渲染描述
  • 129070: 仅按“确定”按钮无法更正下拉设置值
  • 129415: 用户任务无法在单文件模式下运行

感谢

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

对问题跟踪的贡献

vscode 的贡献

vscode-extension-samples 的贡献

vscode-languageserver-node 的贡献

vscode-pull-request-github 的贡献

vscode-vsce 的贡献

debug-adapter-protocol 的贡献

language-server-protocol 的贡献

monaco-editor 的贡献

monaco-languages 的贡献