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

2022 年 9 月(版本 1.72)

下载:Windows:x64 Arm64 | Mac:通用 英特尔 | Linux:deb rpm tarball Arm snap

更新 1.72.1:此更新解决了这些安全 问题

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


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

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

内部人员:希望尽快尝试新功能?您可以下载 nightly 内部人员 版本,并在新功能可用时立即试用。

工作台

隐藏工具栏中的操作

您现在可以隐藏工具栏中的操作。右键单击工具栏中的任何操作,然后选择其隐藏命令或任何切换命令。隐藏的操作将移动到“...”更多操作菜单中,并且可以从那里调用。要还原菜单,请右键单击工具栏按钮区域,然后选择重置菜单命令。要还原所有菜单,请从命令面板运行重置所有菜单 (⇧⌘P (Windows、Linux Ctrl+Shift+P))。

在下面的视频中,GitLens 扩展的文件注释菜单已从编辑器工具栏中隐藏,然后通过重置菜单恢复。

合并编辑器

选择使用三方合并编辑器

在审查了我们收到的所有合并编辑器反馈,并对整体体验进行了思考之后,我们决定默认情况下不显示三方合并编辑器(git.mergeEditor 设置现在为 false),当检测到冲突时。此决定的原因可在 问题 #160806 中找到。

对于有冲突的文件,用户现在可以选择在合并编辑器中解决以打开三方合并编辑器。

A screenshot of a file with conflicts, showing the "Resolve in Merge Editor" button

CodeLens UI

用户反馈表明复选框存在一些 UX 问题。复选框的可发现性很差,并且由于没有正确地表示所有可能的状态而造成了混淆。在这次迭代中,我们切换到 CodeLens UI,它使用文本标签(接受传入接受当前接受两者)。

Merge editor before with checkboxes and after with CodeLens

我们将继续迭代此设计,并密切关注我们收到的所有反馈。

从头开始重新计算结果文件

在上次迭代中,我们尝试将合并编辑器设计为具有冲突文件的备用视图。它不是显示冲突标记,而是使用单独的编辑器窗格显示冲突的详细信息。此设计有一个优点,即打开合并编辑器不会修改磁盘上的文件,并且用户在打开合并编辑器之前所做的更改可以保留。不幸的是,这不仅令人困惑,而且在所有情况下都无法正常工作,因为我们的合并算法和 Git 合并算法没有完全一致。

在此版本中,如果在合并编辑器中打开带有冲突标记的文件,我们将首先使用我们的合并算法重新计算结果文件,而不插入任何冲突标记。单方面冲突会自动解决,而适当的冲突将重置为两个版本的共同祖先,并标记为未处理

基本视图

合并编辑器现在有一个单独的基本视图,可用于将任何一方与共同祖先进行比较。

树视图查找控件改进

您现在可以垂直移动树视图查找控件,以便访问它后面的 UI 元素。在树视图中按 ⌥⌘F (Windows、Linux Ctrl+Alt+F) 以显示查找控件。

Tree view Find control supports vertical movement

此外,树视图查找控件将在重新打开时记住上次搜索词。

Tree view Find control remembers last search text

某些音频和视频文件的内置预览

VS Code 现在支持预览某些音频和视频文件格式。

Previewing an MP4 video in VS Code

目前支持以下音频格式

  • WAV
  • MP3
  • Ogg
  • FLAC

并且可以预览以下视频格式

  • H.264
  • VP8

对于视频文件,请记住,视频和音频轨道的媒体格式必须都受支持。例如,许多 .mp4 文件使用 H.264 进行视频编码,使用 AAC 进行音频编码。VS Code 将能够播放 .mp4 文件的视频部分,但由于不支持 AAC 音频,因此不会发出任何声音。您需要使用 MP3 作为音频轨道。

禁用增量命名

您现在可以使用 explorer.incrementalNaming 设置的新 disabled 值在文件资源管理器中禁用增量文件命名。此值会禁用在文件资源管理器中粘贴时更改文件名的逻辑。如果文件名已存在,系统将提示您覆盖现有文件,类似于大多数本机资源管理器。

在 VS Code 应用程序文件夹内编辑时的警告

在 VS Code 应用程序文件夹内编辑文件时,编辑器中现在会显示警告。意外修改应用程序文件夹中的文件是一个常见错误,通常不是用户想要的操作。

VS Code warns when editing its application folder files

编辑器

改进的自动滚动行为

选择并拖动时,编辑器的滚动方式以前取决于显示器的每秒帧数 (FPS),有时会导致编辑器在鼠标到达编辑器边缘时立即快速滚动。现在,编辑器以更易于管理的速度自动滚动,大约每秒滚动一个视窗,当鼠标靠近边缘时,当鼠标远离编辑器时滚动速度更快,与 FPS 无关。

在下面的视频中,滚动速度随着鼠标光标向下远离编辑器而增加。

改进的悬停

编辑器悬停以前非常积极地隐藏自己,尤其是在鼠标经过编辑器的空区域时。这使得难以触及悬停中显示的某些操作。现在,只要鼠标朝着悬停移动,悬停就会保持可见。设置 "editor.hover.sticky": false 会恢复到之前的行为。

在右侧的“之后”视频中,更容易从悬停中选择快速修复。

新的代码操作组

代码操作控件 中有两个新的组可用,分别是 InlineMove

这些组对应于 refactor.inlinerefactor.move 代码操作种类。

新的代码操作颜色

您可能会注意到,代码操作控件 在这次迭代中也略有不同。其样式已更新,以使用更合适的主题颜色。最大的变化是控件主体现在使用editorWidget.* 颜色而不是menu.*

我们仍在完善这些颜色,如果您发现它们在特定主题中效果不佳或缺少任何颜色自定义选项,请告知我们。

扩展

最近更新的扩展

VS Code 现在在扩展视图的更新部分的最近更新部分中显示过去 7 天内更新的扩展。

Recently Updated section in the Extensions view

需要关注的扩展

VS Code 现在在扩展视图的默认已安装部分中将需要关注的扩展排序到顶部。这包括待更新的扩展,或者已更新或已禁用并需要 VS Code 重新加载的扩展。

Extensions requiring attention are displayed at the top of the Extensions view

活动栏中的扩展图标上的徽章现在显示需要关注的扩展数量。

Extensions badge showing that four extensions require attention

忽略扩展的更新

您现在可以通过单击更新下拉菜单中的忽略更新按钮来忽略扩展的更新。这将从需要关注的扩展列表中删除该扩展。

Ignore Updates option in Extensions view context menu

您可以通过取消选中相同的忽略更新按钮来撤消此操作。

Checked Ignore Updates option in Extensions view context menu

请注意,安装特定版本的扩展(通过安装其他版本)也会忽略该扩展的更新。

已安装扩展的排序

您现在可以按安装次数评级名称发布日期更新日期对已安装扩展列表进行排序。

Extensions view Sort By menu options

以树状视图显示结果

您现在可以以树状视图查看搜索结果!只需单击搜索视图右上角的列表/树图标,即可在列表和树状视图之间切换。

Search results shown as a tree view

主题:夜猫子浅色(在 vscode.dev 上预览)

文件装饰设置

在搜索结果中,现在可以打开或关闭反映文件状态的文件名徽章和颜色。设置是搜索> 装饰:徽章search.decorations.badges)和搜索> 装饰:颜色search.decorations.colors)。

Search results file decoration settings

主题:夜猫子浅色(在 vscode.dev 上预览)

源代码管理

发现嵌套的 Git 仓库

为了解决一个长期存在的特性请求,在这个里程碑中,我们对仓库发现进行了更改,以添加对嵌套 Git 仓库的支持。根据嵌套仓库的位置,您可能需要修改git.repositoryScanMaxDepth设置(默认值为 1 级)。

添加对带密码的 SSH 密钥的支持

当使用带密码的 SSH 密钥进行 Git 操作时,VS Code 现在将显示快速输入控件,以便您可以输入 SSH 密钥的密码。密码不会被缓存,每次执行 Git 操作时都必须输入。

检出前拉取

在这个里程碑中,我们添加了一个新设置git.pullBeforeCheckout,以简化切换分支的过程。启用此设置后,如果没有任何未推送的提交,我们将在检出分支之前从远程拉取并快进分支。

仓库获取改进

对于具有多个远程的 Git 仓库,调用获取命令现在将显示一个带有所有远程列表的快速选择。用户可以选择要获取的特定远程或从所有远程获取。

中止合并命令

有一个新的命令Git:中止合并,用于中止当前正在进行的合并操作。

终端

终端快速修复

我们开始推出一个由 shell 集成驱动的名为快速修复的新功能。此功能提供音频提示支持。使用audioCues.terminalQuickFix启用它,以便在有修复程序可用时发出声音提示。

当命令映射到用户可能采取的一组操作时,快速修复程序可用,并且可以通过与编辑器中使用的相同键绑定激活Ctrl+.Cmd+.

以下是最初支持的快速修复程序

类似的 Git 命令

当 Git 命令输入错误时,快速修复程序会建议类似的命令。

Run: git status is suggested after git sttatus is mistyped

Git 设置上游

当执行git push并且没有上游远程时,快速修复程序会建议使用上游远程参数进行推送。

Run: git push set upstream is suggested

Git 创建 PR

当分支第一次推送到远程时,快速修复程序会建议打开链接以创建 PR。

An open GitHub PR link action is offered

空闲端口

当使用已在使用的端口启动服务器时,快速修复程序会提供一个操作来终止进程并释放端口。

A server launch fails with a port 3000 in use error. An action to free port 3000 is offered.

Shell 集成改进

对 shell 集成进行了以下改进

  • 运行最近命令转到最近目录现在将在行中包含内容(或无法可靠地确定)时清除行。
  • 删除了 bash 脚本中对$PREFIX环境变量的使用,该变量可能会与某些构建工具发生冲突。
  • 完善了 zsh 脚本,以修复$ZDOTDIR周围的一些极端情况。
  • 在多个用户共享的机器上更好地处理 zsh shell 集成。

终端中运行的应用程序发送的超链接现在得到支持。这些允许显示指向 URL 的标签,并显示为带下划线的虚线

Hyperlinks appear in the terminal with dashed underlines, hovering the hyperlink reveals the URL

以下是如何编写一个标签为“VS Code”的链接,该链接指向https://vscode.js.cn的示例

printf '\e]8;;https://vscode.js.cn\e\\VS Code\e]8;;\e\\'

或者更一般地

\x1b]8;; <URL> \x1b\ <Label> \x1b]8;;\x1b\'

VT 功能支持

此版本支持以下 VT 转义序列

  • DECRQM:ANSI 和 DEC 私有模式报告(CSI Ps $ p) - 此序列允许程序查询终端处于的各种模式,例如回绕或方括号粘贴模式。
  • DECSCA:保护属性(CSI Ps " q) - 此属性确定DECSEDDECSEL是否可以擦除内容。

音频铃声

音频铃声现在可以在终端中使用,可以通过terminal.integrated.enableBell启用。

终端文档

终端文档已重构并移至VS Code 网站上的单独目录中。

现在有针对以下方面的主题

  • 终端基础 - 快速了解 VS Code 集成终端。
  • 终端配置文件 - 了解如何通过配置文件自定义终端。
  • Shell 集成 - VS Code 可以提供命令状态、历史记录和快速导航等功能。
  • 外观 - 修改终端文本和光标样式以及颜色。
  • 高级 - 对自定义键绑定以及 Unicode 和表情符号字符提供高级支持。

希望您在需要时能够轻松找到正确的文档。

任务

固定运行任务条目

可以在任务:运行任务列表中固定任务,以便更快更轻松地访问。

Pinned items are the top category in the Run Task list

任务完成声音

任务完成后会播放声音,以支持多任务处理并提高可访问性。可以通过audioCues.taskCompleted设置配置音频提示。

语言

在使用 Markdown 时,很容易错误地添加无效的文件链接或图像引用。也许您忘记了文件名使用了-(破折号)而不是_(下划线),或者您要链接到的文件已移动到不同的目录。通常您只有在查看 Markdown 预览或发布后才会发现这些错误。VS Code 的新 Markdown 链接验证可以帮助发现这些错误。

要开始使用,请设置"markdown.validate.enabled": true。VS Code 现在将分析指向标题、图像和其他本地文件的 Markdown 链接。无效链接将被报告为警告或错误。

A warning shown in the editor when linking to a file that does not exist

VS Code 甚至可以发现指向其他 Markdown 文件中特定标题的无效链接!

您可以使用一些设置来自定义链接验证

  • markdown.validate.fileLinks.enabled - 启用/禁用对指向本地文件的链接的验证:[link](/path/to/file.md)
  • markdown.validate.fragmentLinks.enabled - 启用/禁用对指向当前文件中的标题的链接的验证:[link](#_some-header)
  • markdown.validate.fileLinks.markdownFragmentLinks - 启用/禁用对指向其他 Markdown 文件中标题的链接的验证:[link](other-file.md#some-header)
  • markdown.validate.referenceLinks.enabled - 启用/禁用对引用链接的验证:[link][ref]
  • markdown.validate.ignoredLinks - 要跳过验证的链接通配符列表。如果您链接到磁盘上不存在但在 Markdown 发布后存在的文件,这将很有用。

试一试,让我们知道您对新功能的看法!

引用链接 使您能够轻松地在 Markdown 源中多次使用相同的链接

This [link][example-link] and [this link][example-link] both point to the same place!

[example-link]: http://example.com

这很方便,因为您只需更改文件中的一个位置,就可以更新这两个链接。

新的提取到链接定义重构有助于您将现有的 Markdown 链接转换为链接定义和引用链接。此重构将转换当前文档中链接的所有出现。例如,对于 Markdown 文档

[Markdown](https://daringfireball.net/projects/markdown/) and you: Adventures in [Markdown linking](https://daringfireball.net/projects/markdown/)!

https://daringfireball.net/projects/markdown/链接中的任一链接运行提取到链接定义将导致

[Markdown][md] and you: Adventures in [Markdown linking][md]!

[md]: https://daringfireball.net/projects/markdown/

运行重构后,VS Code 将提示您输入链接定义的名称。在上面的示例中,我们输入了md

新的组织链接定义代码操作source.organizeLinkDefinitions)用于 Markdown 文件,将所有链接定义分组到文件底部,按字母顺序对其进行排序,并删除任何未使用的定义。这可以使用源操作命令运行。

例如,在 Markdown 源中

Some [link][example] and an image:

![An image of a cat][cat-gif]

[example]: http://example.com
[cat-gif]: /keyboard-cat.gif
[some unused link]: http://example.com/file2

运行组织链接定义

Some [link][example] and an image:

![An image of a cat][cat-gif]

[cat-gif]: /keyboard-cat.gif
[example]: http://example.com

请注意,未使用的some unused link定义已被删除,其余定义已按字母顺序排序。

CSS / LESS / SCSS

CSS 语言支持现在了解@property@layer at-rules。

笔记本

笔记本 JavaScript 输出现在被评估为模块

笔记本中的 JavaScript 输出现在被视为模块。这意味着在输出中声明的变量将不再泄漏到其他输出中(在const变量的情况下,甚至可能会阻止其他具有冲突变量名称的输出运行)。

这也意味着您现在可以在 JavaScript 输出中使用import

%%javascript
import { myFunction } from './myModules.js';

console.log(myFunction());

笔记本大纲中支持的 HTML 标题

Markdown 单元格中的 HTML 标题现在可以在笔记本的 **大纲** 视图中检测到并呈现。

HTML headers in notebook Markdown cells

适用于 Web 的 VS Code

浏览器地址栏中的“code”

现在有一个 Chrome/Edge 浏览器扩展,可以更轻松地在 vscode.dev 中打开您的 GitHub 存储库。

入门

  1. 从 Chrome 网上应用店安装扩展。
  2. 在浏览器搜索栏中键入 code 以激活地址栏。
  3. 按名称搜索 GitHub 存储库并按 Enter。建议由您的浏览器搜索历史记录填充,因此如果您想要存储库未出现,您也可以键入完整的限定 <owner>/<repo> 名称来打开它,例如 microsoft/vscode

在下面的视频中,用户通过键入 code vscodevscode.dev 中打开 microsoft/vscode 存储库。

此扩展的灵感来自 Goto GitHub Repo Chrome 扩展,该扩展由 Pine Wu 创建,他是 VS Code 团队的前成员。

在切换开发环境时将更改带走

当您浏览 GitHub 或 Azure Repos 存储库(例如 https://vscode.dev/github/microsoft/vscode)时,您可以使用 继续使用 命令选择要与存储库一起使用的其他开发环境。

以前,如果您在虚拟工作区中有未提交的更改,则需要将它们推送到 GitHub 或 Azure Repos 才能在其他地方查看它们。在这个里程碑中,我们向 **继续使用** 功能添加了 **编辑会话** 集成,这样您的未提交的更改就会自动随您一起迁移到目标开发环境,例如 GitHub codespace。

在下面的视频中,用户在使用 VS Code for the Web 时对 JavaScript 文件所做的更改在他们创建并切换到新 GitHub codespace 中工作时被应用。

在此版本中,您第一次使用带有未提交更改的 **继续使用** 时,您将可以选择使用 **编辑会话** 将您的编辑带到您选择的开发环境,该会话使用 VS Code 服务来存储您的待处理更改。这些更改将在应用于目标开发环境后从我们的服务中删除。如果您选择在没有未提交的更改的情况下继续,您始终可以稍后通过配置 "workbench.editSessions.continueOn": "prompt" 设置来更改此首选项。

Prompt to bring working changes with you when using Continue Working On

当您使用 VS Code for the Web 时,您的未提交的更改将在您在以下情况下使用 **继续使用** 时随您一起迁移

  • GitHub Codespaces 中的新云托管环境
  • 您 GitHub 存储库的新本地克隆
  • 具有相同虚拟 GitHub 存储库的本地 VS Code 实例

当您使用带有 远程存储库 扩展的桌面 VS Code 时,您的未提交的更改将在您在以下情况下使用 **继续使用** 时随您一起迁移

  • GitHub Codespaces 中的云托管环境(可通过 GitHub Codespaces 扩展获得)
  • 您 GitHub 存储库的新本地克隆
  • 容器卷中您 GitHub 存储库的新克隆(可通过 Dev Containers 扩展获得)
  • https://vscode.dev
  • 包含您存储库克隆的现有本地文件夹

问题报告

将问题阈值提高到 7500 个字符

当使用内置问题报告器报告 VS Code 或扩展程序的问题时,用于在 github.com 上打开问题的 URL 中的字符数有限制。如果您达到此限制,您将在问题主体中看到一条消息,提示 由于数据太大而无法发送,我们已将必要数据写入剪贴板。请粘贴。。不幸的是,有些用户没有注意到这条消息,忘记将数据粘贴到问题主体中。

在这个里程碑中,我们将阈值提高到了 7500 个字符。这是因为

  1. 某些对 URL 中字符数有严格限制的浏览器不再受支持(EOL)。
  2. GitHub 对 URL 中的字符数也有自己的限制。

这几乎将 URL 中包含的字符数增加了两倍,对于大多数用户来说应该足够了,剪贴板消息将显示得更少。

问题报告器与运行扩展编辑器一起使用

如果您使用命令 **开发者:显示正在运行的扩展** 打开 **正在运行的扩展** 编辑器,然后选择 **报告问题** 按钮,它将显示内置问题报告器。以前,这会将您带到一个 GitHub 问题并要求您粘贴,并在扩展存储库中创建了许多不必要的和质量低劣的问题。扩展的 **报告问题** 按钮现在将通过内置问题报告器,并允许用户提交高质量的扩展问题。

对扩展的贡献

远程开发

远程开发扩展允许您使用开发容器、远程计算机或 Windows Subsystem for Linux (WSL) 作为功能齐全的开发环境。

我们已经收到了您关于 **远程 - WSL** 和 **远程 - 容器** 扩展命名的反馈。我们原本希望扩展名称中的 远程 表示您在“远程”或“独立”的 WSL 发行版或开发容器中进行开发,而不是传统的本地开发。但是,这与许多人使用的“远程”的用法不同,可能会造成混淆(例如,开发容器在我的机器上吗?)。

因此,我们已更新了这些扩展的命名和产品内命令,使其更加清晰,将其重命名为 WSLDev Containers。市场和文档中的扩展标识符等链接保持不变,因此您在当前使用这两个扩展时不应该看到中断。

WSL extension in the Marketplace

Dev Containers extension in the Marketplace

除了重命名之外,这些扩展的功能和修复工作也在继续。您可以在 远程开发版本说明 中了解更多信息。

Dev Container 功能

Dev Container 功能 使您可以轻松地将预打包的功能添加到您的开发容器中。无论是 Git 或 Docker 等工具,还是 Go 或 Java 等编程语言的支持,您都可以查看 可用功能 列表并将它们添加到您的 devcontainer.json 中。您还可以使用 功能模板 创建自己的功能以发布和与他人共享。

GitHub 拉取请求和问题

GitHub 拉取请求和问题 扩展有了更多进展,它允许您处理、创建和管理拉取请求和问题。此版本的亮点包括

  • 对 GitHub Enterprise Server 的支持得到改进。这包括
    • 借助 VS Code 内置的 GitHub Enterprise Server 身份验证提供程序实现无 PAT 身份验证。
    • 当您打开带有 Enterprise 存储库的文件夹时自动检测,以及设置的入门坡道。
    • 针对 GitHub Enterprise Server 错误的修复。
  • 用于将文件标记为已查看的复选框。

查看扩展 0.52.0 版本的变更日志,以了解其他亮点。

GitHub 问题笔记本

工作区编辑

GitHub 问题笔记本 扩展展示了笔记本 API,并且也证明非常方便。本着这种精神,我们采用了工作区编辑 API 的最新改进。有一些新的代码操作可以

  • 将单元格移动/复制到新的笔记本中。
  • 允许您使用 OR 语句拆分单元格。
  • 使用片段编辑将合格的值(如 label:bug)提取到变量中。
  • 针对值集错误的基于片段的快速修复。

Move cell into new notebook and Quick Fix for value set violation

本地化

该扩展现在已完全本地化为 VS Code 支持的 13 种语言。它也是第一个使用新的 本地化 API 本地化的扩展,这意味着本地化在桌面和网络上都适用。

Jupyter

单元格标签和幻灯片编辑支持

我们现在可以直接在笔记本编辑器中编辑单元格标签和幻灯片类型,而无需打开文档的 JSON 格式。

这使我们能够为 papermill 参数化笔记本或为 nbconvert 自定义笔记本。

Edit Jupyter notebook cell tags

我们现在还可以通过命令直接更新笔记本单元格的幻灯片类型,将笔记本转换为幻灯片以进行演示。

Edit Jupyter notebook slideshow

以上两个示例都使用 笔记本工作区编辑 API 编辑单元格元数据。如果您对如何支持编辑其他自定义单元格元数据感兴趣,可以从 GitHub 存储库 (cell-tagsslideshow) 中了解更多信息。

改进的交互式窗口命令交互

interactive.input.focus 命令现在将使最近使用的交互式窗口的输入框获得焦点。在下面的简短视频中,命令正在使用自定义键盘快捷键。

Interactive Window navigation using keyboard shortcuts

交互式窗口单元格的笔记本 **删除** 单元格命令已启用,现在可以撤消。

Python 文件单元格折叠

# %% 标记表示的 Python 文件中的“单元格”现在可以在编辑器中折叠。

GitHub Enterprise Server 身份验证支持

以前,GitHub Enterprise Server 用户需要手动创建一个个人访问令牌 (PAT) 才能登录 VS Code 中的 GitHub Enterprise Server(例如,用于 GitHub Pull Requests 和 Issues 扩展)。这是一个繁琐的过程,需要用户离开 VS Code 创建 PAT,确保他们以正确的权限创建了 PAT,然后复制并粘贴回 VS Code。

现在不再需要了。现在,GitHub Enterprise Server 登录流程与 github.com 登录流程相同,用户无需创建 PAT 即可登录 GitHub Enterprise Server。要查看此体验的实际操作,您可以从 Marketplace 获取 GitHub Pull Requests 和 Issues 扩展,将 github-enterprise.uri 设置设置为您的 GitHub Enterprise Server URI,然后尝试一下。以下视频演示了新的体验

主题:Panda Theme(在 vscode.dev 上预览)

Python

创建环境命令

添加了一个新的 **创建环境** 命令,该命令将自动为 VS Code 中的 Python 用户创建虚拟环境或 conda 环境。用户可以通过命令面板触发该命令,选择他们是否要使用 venv 创建新的虚拟环境或使用 Conda 创建环境,最后选择他们项目所需的解释器。该命令还会安装项目文件夹中 requirements.txt 文件中概述的必要包。我们希望此新功能可以简化环境创建过程,并鼓励用户利用环境来进行最佳编码实践。

Create new virtual environment with Create Environment command

供扩展作者使用的新的环境 API

Python API 现在为扩展提供了一种方法,使扩展可以与 Python 扩展找到的用户计算机中可用的 Python 环境一起使用。扩展还可以使用它访问 Python 扩展用来运行脚本的所选环境路径,或将其更新为他们首选的路径。

请随时在 issue #18888 中提供您的反馈。请注意,API 尚未最终确定,因此可能会根据反馈进行更改,并且不会提供向后兼容性。

Python 扩展模板

Python 扩展模板 可帮助您为最喜欢的 Python 工具(如 linter、格式化程序或代码分析工具)构建 Visual Studio Code 扩展。该 模板 提供了构建扩展所需的构建模块,这些扩展可以将您的工具集成到 VS Code 中。

预览功能

设置配置文件

在过去几个月里,我们一直在努力在 VS Code 中支持 **设置配置文件**,这是社区中最受欢迎的请求之一。此功能可以通过 workbench.experimental.settingsProfiles.enabled 设置进行预览。试用一下,并通过在 vscode 存储库 中创建问题或在 issue #116740 中发表评论来向我们提供您的反馈。

设置配置文件指示器

VS Code 在活动栏的底部显示一个设置配置文件指示器。默认情况下,指示器中会显示配置文件名称的前两个字符。您也可以将简短名称自定义为任意两个字符,或者自定义为表情符号或 codicon。可以使用 $(codicon-id) 语法引用 codicon。

Settings Profiles indicator

当您单击此指示器时,会显示一个菜单,其中包含一个 **更改简短名称** 选项。

Settings Profiles menu

同步设置配置文件

VS Code 现在支持在您的 VS Code 实例之间同步设置配置文件。

注意:此功能目前仅在 Insiders 版 VS Code 中可用。

WebAssembly 和 Python 在 Web 中的执行

在过去的几个月里,我们一直在努力将 WebAssembly (WASM) 引入 VS Code。为了启用支持,我们进行了两项工作

下面的屏幕截图显示了运行 Hello World 程序

Execute Python file in VS Code for the Web

您还可以使用命令 **Python WASM: Start REPL** 启动 Python REPL。

Python REPL running in VS Code for the Web

请注意,库和扩展都处于开发阶段,并作为预览提供。WebAssembly Python 解释器以及 VS Code 本身都存在一些限制。解释器的主要限制包括

  • 不支持 pip。
  • 不支持套接字。
  • 不支持线程。因此,也不支持异步。

但是,支持创建自己的 Python 环境,包括源轮 Python 包。有关详细信息,请查看扩展的 README

VS Code 的限制包括

  • 不支持调试。您只能运行 Python 文件。
  • 不支持本机 Python 模块。

但请继续关注。我们正在努力解决其中一些限制。

扩展开发

在干净的环境中调试扩展

调试扩展时,一直存在一个问题,即扩展是在扩展作者的开发环境(用户设置和已安装的扩展)中运行的,而不是在更适合扩展的目标用户的环境中运行的。

借助最近推出的“配置文件”功能,现在可以通过在扩展的调试配置中指定配置文件,在不同的环境中运行正在开发的扩展。启用 workbench.experimental.settingsProfiles.enabled 设置以启用配置文件功能。

支持两种场景

  • 在干净的环境中调试,方法是使用一个未命名的“空”配置文件,该配置文件将在扩展调试停止时自动删除。
  • 在受控的环境中调试,方法是使用一个已为正在开发的扩展专门创建的命名配置文件,该配置文件包含特定的用户设置和扩展。

此调试配置显示了如何使用 --profile-temp 开关在干净的环境中调试

{
  "name": "Extension",
  "type": "extensionHost",
  "request": "launch",
  "args": ["--profile-temp", "--extensionDevelopmentPath=${workspaceFolder}"],
  "outFiles": ["${workspaceFolder}/dist/**/*.js"],
  "preLaunchTask": "npm: watch"
}

以下是一个在使用名为“extensionContext”的先前创建的配置文件的受控环境中调试的调试配置

{
  "name": "Extension",
  "type": "extensionHost",
  "request": "launch",
  "args": ["--profile=extensionContext", "--extensionDevelopmentPath=${workspaceFolder}"],
  "outFiles": ["${workspaceFolder}/dist/**/*.js"],
  "preLaunchTask": "npm: watch"
}

请注意,在远程位置(通过 远程开发 扩展 Dev Containers、SSH 或 WSL)调试扩展时,使用 --profile-temp 标志将导致显示以下状态消息

Disconnected Status bar message

这是预期的,因为临时配置文件不包含任何扩展,这意味着远程开发扩展也不存在。对于远程场景,建议您创建一个空的命名配置文件,向其中添加远程开发扩展,然后使用 --profile=.... 命令行选项。

改进的工作区编辑 API

使用 WorkspaceEdit 编辑笔记本

WorkspaceEdit 现在可以使用 vscode.NotebookEdit 修改笔记本。vscode.NotebookEdit 类包含用于创建编辑的静态工厂函数,这些编辑可以插入、替换和删除笔记本中的单元格

const currentNotebook = vscode.window.activeNotebookEditor?.notebook;
if (currentNotebook) {
  const edit = new vscode.WorkspaceEdit();

  // Use .set to add one or more edits to the notebook
  edit.set(currentNotebook.uri, [
    // Create an edit that inserts one or more cells after the first cell in the notebook
    vscode.NotebookEdit.insertCells(/* index */ 1, [
      // ... new notebook cell data
    ])

    // Additional notebook edits...
  ]);

  await vscode.workspace.applyEdit(edit);
}

使用 WorkspaceEdit 执行片段编辑

新的 SnippetTextEdit 类型允许扩展使用 WorkspaceEdit 执行片段编辑。片段编辑类似于常规文本编辑,但它们允许用户在占位符之间切换,插入变量,从选择元素中选择等。了解有关片段的更多信息,请参阅 本指南

请注意,片段编辑需要代码或笔记本编辑器,并且只能支持单个编辑器的片段编辑,否则它们的行为将与常规文本编辑相同。

我们相信,将片段编辑和工作区编辑结合起来可以实现新的、更无缝的代码操作和重构,例如以下示例来自 GitHub Issue Notebooks 扩展。

使用 WorkspaceEdit 创建包含内容的文件

您现在可以使用 WorkspaceEdit 在创建文件时指定内容。为此,请使用其选项包传递内容

const edit = new vscode.WorkspaceEdit();
edit.createFile(newFileUri, { contents: new Unit8Array([1, 2, 3]) });

await vscode.workspace.applyEdit(edit);

贡献的 Webview 上下文菜单

新的 Webview 上下文菜单 API 使高级 Webview 可以轻松自定义用户在 Webview 中右键单击时显示的上下文菜单。此新的贡献点使用 VS Code 的普通上下文菜单,因此自定义菜单可以与编辑器的其他部分完美融合。Webview 还可以为 Webview 的不同部分显示自定义上下文菜单。

要向您的 Webview 添加新的上下文菜单项,请首先在 menus 下的 webview/context 部分添加新条目。每个贡献都接受一个 command(也是项目标题的来源)和一个 when 子句。when 子句 应包含 webviewId == 'YOUR_WEBVIEW_VIEW_TYPE' 以确保上下文菜单仅应用于您的扩展的 Webview

"contributes": {
  "menus": {
    "webview/context": [
      {
        "command": "catCoding.yarn",
        "when": "webviewId == 'catCoding'"
      },
      {
        "command": "catCoding.insertLion",
        "when": "webviewId == 'catCoding' && webviewSection == 'editor'"
      }
    ]
  },
  "commands": [
    {
      "command": "catCoding.yarn",
      "title": "Yarn 🧶",
      "category": "Cat Coding"
    },
    {
      "command": "catCoding.insertLion",
      "title": "Insert 🦁",
      "category": "Cat Coding"
    },
    ...
  ]
}

在 Webview 中,您还可以使用 data-vscode-context 数据属性(或在 JavaScript 中使用 dataset.vscodeContext)为 HTML 的特定区域设置上下文。data-vscode-context 值是一个 JSON 对象,它指定在用户在元素上右键单击时要设置的上下文。最终上下文是通过从文档根目录到单击的元素确定的。

例如,请考虑以下 HTML

<div class="main" data-vscode-context='{"webviewSection": "main", "mouseCount": 4}'>
  <h1>Cat Coding</h1>

  <textarea data-vscode-context='{"webviewSection": "editor", "preventDefaultContextMenuItems": true}'></textarea>
</div>

如果用户在 textarea 上右键单击,将设置以下上下文

  • webviewSection == 'editor' - 这将覆盖来自父元素的 webviewSection
  • mouseCount == 4 - 这是从父元素继承的。
  • preventDefaultContextMenuItems == true - 这是一个特殊的上下文,它隐藏了 VS Code 通常添加到 Webview 上下文菜单中的复制和粘贴条目。

如果用户在 <textarea> 内右键单击,他们将看到

Custom context menus showing in a webview

Webview 中活动主题的新主题变量

Webview 中的新 data-vscode-theme-id 数据属性存储当前活动主题的 ID。这将替换现在已弃用的 data-vscode-theme-name 属性,该属性跟踪主题的完整名称(并且也可能已本地化)

body[data-vscode-theme-id="One Dark Pro"] {
    background: hotpink;
}

如果您在 Webview 中使用 data-vscode-theme-name,请迁移到新的 data-vscode-theme-id 属性。

异步笔记本渲染器

现在,笔记本渲染器 API 更好地支持异步笔记本渲染器。虽然这在以前是隐式支持的,但现在 renderOutputItem 可以返回一个 Promise 来指示输出项正在渲染。renderOutputItem 函数现在也传递了一个 AbortSignal,如果渲染被取消,它将被中止。

renderOutputItem(outputItem: OutputItem, element: HTMLElement, signal: AbortSignal): void | Promise<void>;

如果您的渲染器执行任何异步工作,请采用这些 API 更新,以便 VS Code 可以更好地支持您的渲染器。

重构.move 代码操作种类

新的 refactor.move 代码操作种类可用于将代码移动到其他位置的重构操作(例如,将符号移动到新文件或在文件内重新排序代码)。

虽然扩展程序以前可以创建 refactor.move 种类的代码操作,但此种类现在已正式记录,并且 受新的代码操作控件支持

传递给视图/标题操作的选定树项

贡献给 view/title 菜单的命令将接收两个参数:第一个是聚焦的树节点,第二个是树中所有选定的项。

树视图 initialSize 贡献最终确定

package.json 中贡献视图的扩展程序可以使用 initialSize 属性来设置其视图的初始大小。initialSize 的工作原理与 CSS 的 flex-grow 类似。

对何时应用 initialSize 有一些限制

  • 它仅仅是初始大小。一旦视图被渲染,initialSize 将不再被应用。
  • 它只在扩展程序同时拥有视图和视图容器时应用。

树视图Badge最终确定

TreeView 具有一个可选的 viewBadge 属性,可用于在视图的视图容器上设置数字徽章。

View badge on a view in the Activity bar

未绑定断点的警告图标

调试扩展程序现在可以定义一个提示消息,当存在具有未绑定断点的活动调试会话时。它将出现在断点视图的标题中,以及将鼠标悬停在编辑器中的灰色断点图标上时。以下是如何在 js-debug 扩展程序中使用它的示例

Hovering the breakpoint warning icon

此消息可以在调试器贡献中的新 strings 属性中声明,如下所示

"strings": {
  "unverifiedBreakpoints": "Message text goes here"
}

VS Code 社区讨论

现在有一个 VS Code 社区讨论 网站,供扩展程序作者作为聚会场所,提出问题、与其他开发人员建立联系并展示出色的工作。在那里,您可以找到与 VS Code API 相关的 公告,发布问题或搜索现有答案,并查看 扩展展示和讲述

建议的 API

每个里程碑都伴随着新的 API 建议,扩展程序作者可以尝试使用它们。一如既往,我们希望收到您的反馈。以下是在尝试使用 API 建议的步骤

  1. 找到您想尝试的建议 并将它的名称添加到 package.json#enabledApiProposals 中。
  2. 使用最新的 vscode-dts 并运行 vscode-dts dev。它将下载相应的 d.ts 文件到您的工作区。
  3. 您现在可以使用该建议进行编程。

您不能发布使用 API 建议的扩展程序。下一个版本中可能会出现重大更改,我们不想破坏现有扩展程序。

可扩展的 JavaScript 笔记本渲染器

我们内置的 笔记本渲染器 现在公开了一个实验性 API,允许扩展程序自定义 JavaScript 内容的渲染。此 API 目前公开了一个钩子 preEvaluate,它在评估 JavaScript 内容之前被调用。

要尝试使用此实验性 API,您的扩展程序 需要扩展 vscode.builtin-renderer API

"contributes": {
  "notebookRenderer": [
    {
      "id": "vscode-samples.my-custom-js-extension",
      "displayName": "My custom javascript renderer extension",
      "entrypoint": {
        "extends": "vscode.builtin-renderer",
        "path": "./out/main.js"
      }
    }
  ]
}

然后,您的渲染器可以在 vscode-builtin-renderer 上注册一个渲染钩子

import type { RendererContext } from 'vscode-notebook-renderer';

export async function activate(ctx: RendererContext<void>) {
  const builtinRenderer = await ctx.getRenderer('vscode.builtin-renderer');
  if (!builtinRenderer) {
      throw new Error(`Could not load 'vscode.builtin-renderer'`);
  }

  builtinRenderer.experimental_registerJavaScriptRenderingHook({
    // Invoked before th js has been evaluated
    preEvaluate(outputItem: OutputItem, element: HTMLElement, script: string, signal, signal: AbortSignal): string | undefined | Promise<string | undefined> {
      // You can either modify `element` or return a new script source here
    }
  });
}

测试这个新的 API 并让我们知道您的想法!

用于 env.shell 更改的事件

新事件 env.onDidChangeShell 已被添加以补充 env.shell,即为扩展程序宿主检测到的默认 shell

env.onDidChangeShell(newShell => {
  console.log(newShell); // Same value as env.shell
});

树项复选框

提议的 checkboxState 允许您在树项中添加复选框。

Tree items with checkboxes

this.checkboxState = {
  state: vscode.TreeItemCheckboxState.Unchecked,
  tooltip: 'mark file as viewed'
};

API 中的本地化

在这个迭代中,我们引入了一个新的 API 来帮助扩展程序本地化字符串。这将替换以前用于本地化的 vscode-nlsvscode-nls-dev 模块。这些模块将继续工作,但不会再收到任何功能。新的 API 和工具旨在熟悉,但也更易于使用且更灵活。此外,将它作为 VS Code API 的一部分,使我们能够为台式机版 VS Code 和 Web 版 VS Code 的扩展程序提供本地化支持。

VS Code 扩展程序的本地化包含四个重要部分

新的 vscode.l10n API

declare module 'vscode' {
  export namespace l10n {
    /**
     * A string that can be pulled out of a localization bundle if it exists.
     */
    export function t(message: string, ...args: any[]): string;
    /**
     * A string that can be pulled out of a localization bundle if it exists.
     */
    export function t(options: {
      message: string;
      args?: any[];
      comment: string[];
    }): string;
    /**
     * The bundle of localized strings that have been loaded for the extension.
     */
    export const bundle: { [key: string]: string };
    /**
     * The URI of the localization bundle that has been loaded for the extension.
     */
    export const uri: Uri | undefined;
  }
}

提议的 vscode.l10n API 是一个新的命名空间,并提供一个名为 t 的单个函数,可用于声明应本地化字符串。该函数可以用字符串或具有 message 属性的对象调用。如果存在本地化包,该函数将返回本地化字符串,否则将返回原始字符串。该函数还支持用于格式化字符串的参数以及用于为翻译者提供上下文注释。

使用新 API 的简单示例

import { l10n } from 'vscode';

export function activate(context: vscode.ExtensionContext) {
  const message = l10n.t('Hello in {0}!', vscode.env.language);
  vscode.window.showInformationMessage(message);
}

在此示例中,如果当前语言存在本地化包,则字符串 Hello in {0}! 将被本地化。{0} 将被替换为当前语言(默认情况下为 en,或法语为 fr,巴西葡萄牙语为 pt-br 等)。如果不存在本地化包,则该字符串将按原样返回并使用参数进行格式化。您可能想知道这些本地化包来自哪里。我将在下一节中介绍。

vscode.l10n API 还提供对本地化字符串包或字符串包 URI 的访问。这旨在用于子进程场景,我将在后面介绍。

重要:当您使用此 API 时,您还需要明确声明本地化包的位置。这是通过在 package.json 中添加 l10n 属性来实现的

{
  "main": "./out/extension.js",
  "l10n": "./l10n"
}

l10n 属性应为包含本地化包的文件夹的相对路径。

模块 @vscode/l10n-dev

模块 @vscode/l10n-dev 是一个用于生成本地化包的新模块。您可以将其用作命令行工具或库。两者都用于通过扫描提供的源代码中的 vscode.l10n.t(..) 调用来生成本地化包。

以下是如何使用命令行工具的简单示例

npx @vscode/l10n-dev ./src --out ./l10n

这将在 ./l10n 文件夹中放置一个 bundle.l10n.json 文件。从那里您可以为要支持的每个区域设置创建一个 bundle.l10n.LOCALE.json 文件。例如,假设上面的命令生成以下 bundle.l10n.json 文件

{
  "Hello": "Hello",
  "Hello {0}": "Hello {0}",
  "Hello {0}/This is a comment": {
    "message": "Hello {0}",
    "comment": ["This is a comment"]
  }
}

如果您想支持法语,您将在 bundle.l10n.fr.json 文件中创建以下内容

{
  "Hello": "Bonjour",
  "Hello {0}": "Bonjour {0}",
  "Hello {0}/This is a comment": "Bonjour {0}"
}

注意:您不需要本地化包中的注释,因为注释仅对翻译原始包的翻译者有用。

@vscode/l10n-dev 模块还可用于生成 XLF 文件。VS Code 团队会生成 XLF 文件,然后我们将其提供给 Microsoft 的翻译人员。然后翻译人员会将翻译后的 XLF 文件返还给我们。然后,我们使用 @vscode/l10n-dev 模块从翻译后的 XLF 文件生成本地化包。我们计划撰写一篇博文,详细介绍我们的整个本地化流程。

模块 @vscode/l10n

由于 vscode.l10n API 仅在扩展程序宿主中可用,因此它不能在子进程中使用。为此,我们创建了一个可以在子进程中用于加载本地化包的新模块。该模块称为 @vscode/l10n,可以像这样使用它

import { l10n } from '@vscode/l10n';

// Load the translations for the current locale
l10n.config({
  uri: process.env.BUNDLE_URI_FROM_EXTENSION
});

// returns the translated string or the original string if no translation is available
l10n.t('Hello World');

想法是,您的扩展程序侧代码(负责启动子进程)将使用 vscode.l10n.contentsvscode.l10n.uri API 将包或包的 URI 传递给子进程。然后,子进程可以使用 @vscode/l10n 模块加载包并使用 t 函数翻译字符串。@vscode/l10n 模块使用的 t 函数也将被 @vscode/l10n-dev 模块接收,以便可以使用一个进程提取和本地化字符串。

package.nls.json 文件

关于 package.nls.json 文件,没有任何变化。它仍然用于声明应本地化的默认字符串,并且应与 package.json 相邻。您仍然可以拥有 package.nls.LOCALE.json(其中 LOCALE 是类似于 dezh-cn 的内容),如果用户将 VS Code 设置为该区域设置,则该文件中声明的字符串将首先被接收。一个小例子

您的 package.json

{
  "name": "my-extension",
  "version": "0.0.1",
  "main": "./out/extension.js",
  "l10n": "./l10n",
  //...
  "contributes": {
    "commands": [
      {
        "command": "my-extension.helloWorld",
        // The key is surrounded by % characters
        "title": "%my-extension.helloWorld.title%"
      }
    ]
  }
}

您的 package.nls.json

{
  // That same key from the package.json
  "my-extension.helloWorld.title": "Hello World"
}

您的 package.nls.de.json

{
  // That same key from the package.json
  "my-extension.helloWorld.title": "Hallo Welt"
}

总结

这里确实有很多内容需要消化,但希望这能让您对我们在 VS Code 扩展程序中本地化所采用的方向有一个了解。

如果您想查看完整示例,可以查看 l10n-sample

如果您有任何问题或反馈,可以在以下位置告诉我们

日志输出通道

vscode.window.createOutputChannel API 现在有一个新的 log 布尔选项,可用于创建仅用于记录的输出通道。

/**
 * Creates a new {@link LogOutputChannel log output channel} with the given name.
 *
 * @param name Human-readable string which will be used to represent the channel in the UI.
 * @param options Options for the log output channel.
 */
export function createOutputChannel(
  name: string,
  options: { readonly log: true }
): LogOutputChannel;

LogOutputChannel 支持以下方法记录消息

trace(message: string, ...args: any[]): void;
debug(message: string, ...args: any[]): void;
info(message: string, ...args: any[]): void;
warn(message: string, ...args: any[]): void;
error(error: string | Error, ...args: any[]): void;

扩展程序创建的日志输出通道在“输出”下拉视图中显示为单独的条目。写入此日志输出通道的消息以与 VS Code 日志消息相同的格式表示。

Log Output channel

工程

走向“跨源隔离”

我们已经做了一些更改,以启用 VS Code 桌面和 vscode.dev 的跨源隔离。这将启用像共享数组缓冲区这样的强大的新功能。VS Code 本身以及扩展程序和 Web 视图都将从中受益。

跨域隔离目前处于功能标记之后,启用它可能会对从互联网加载资源的扩展和 Web 视图造成意外影响。你可以在 为什么你需要“跨域隔离”来实现强大功能 中了解更多信息。我们希望尽早听到你的反馈。

尝试此操作

  • 使用--enable-coi标志运行 VS Code 桌面,例如code --enable-coi
  • 运行 vscode.dev 并附加vscode-coi查询。

要检查跨域隔离是否已启用,请使用开发者工具的“应用程序”选项卡或检查 crossOriginIsolated 全局变量的值。

Cross Origin Isolation enabled for web

改进启动性能

我们在本里程碑中预留了工程时间来改进从启动 VS Code 到在文本编辑器中看到闪烁的光标所需的时间。我们始终跟踪我们的性能数据,并且注意到在上一个里程碑结束时性能略有下降,我们需要解决这个问题。

这是一个团队合作,每个人都在整个源代码中贡献了各种更改。这里提到了几个亮点。

不再进行同步文件系统调用

我们通常避免使用 Node.js fs API 的同步变体,因为我们知道这些方法会停止脚本执行,直到文件系统请求得到解决。但是,在某些情况下,我们仍然依赖于同步 fs 执行,尤其是在启动时打开或恢复窗口时。我们能够将所有这些调用更改为它们的异步变体,从而允许其他脚本在等待文件系统请求返回时继续运行。

更多主入口点的捆绑

构成 VS Code 应用程序的主要捆绑包大小为几兆字节,使用 vscode-loader 捆绑为单个文件,并使用 esbuild 缩小。但是,在某些情况下,我们没有投资捆绑,特别是对于

  • Electron 主进程中的 Node.js 入口点,它总是首先被调用。
  • Electron 渲染器进程中的引导 JavaScript 文件,用于打开窗口。

在这两个领域进行捆绑使我们能够将启动时查找 JavaScript 文件的成本降低到对 Electron 主进程的一次调用和对窗口本身的一次调用。

将代码推迟到后期阶段

最好的性能修复方法是删除代码并永远不运行它,但显然这不是一个可扩展的解决方案。另一种方法是将代码的执行推迟到后期阶段,例如文本编辑器打开后。在本里程碑中,我们再次审查了各种组件,并将其中一些推迟到后期阶段,以避免阻塞关键的启动路径。

记录内部工具

为了分析性能,我们大量使用了浏览器的开发者工具和操作系统检查工具。但是,我们还有一些内置在 VS Code 中的工具。我们在 VS Code 开发的性能工具 中记录了自定义工具,以便更多人可以从中受益。

更快的 PR 检查

对于拉取请求,我们运行自动单元、集成和冒烟测试。所有这些都并行进行,但每个步骤都需要将我们的 TypeScript 源代码转换为 JavaScript 代码。最初,我们为此使用了 TypeScript 编译器。它会发出 JavaScript,但也会进行类型检查。后者非常耗时,对于测试来说并不是真正需要的。测试延迟的总时间成本约为 5 分钟。然后我们切换到一个使用 TypeScript 编译器 API 的自定义仅转译解决方案。这要快得多,但仍然需要大约 2 分钟。

在本里程碑中,我们切换到 SWC(快速 Web 编译器),它更快。现在转译所有 TypeScript 源代码大约需要 12 秒。这是一个巨大的改进,使我们能够更快地获得拉取请求的反馈。

值得注意的修复

  • 27799 macOS:操作系统服务无法从编辑器中获取选定文本
  • 60821 改进了最近打开和“入门”页面的最近列表之间的同步。
  • 156777 保持进程资源管理器打开时,每分钟内存泄漏 5MB
  • 159862 在 macOS Catalina 上,处于全屏模式时,交通灯按钮显示错位
  • 161305 查看其他窗口设置时,“窗口:标题栏样式”链接不起作用

感谢

最后但并非最不重要的是,衷心感谢 VS Code 的贡献者。

问题跟踪

对我们的问题跟踪的贡献

拉取请求

vscode 的贡献

vscode-css-languageservice 的贡献

vscode-pull-request-github 的贡献

debug-adapter-protocol 的贡献