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

2022 年 5 月(版本 1.68)

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

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


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

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

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

工作区

配置显示语言改进

配置显示语言 命令已更新,其中包括

  • 该语言的语言名称。
  • 一个 可用语言 部分,显示未安装在您的计算机上的语言,选择其中一种语言将自动安装它并应用该语言。

Configure Display Language dropdown with installed and available Language Packs in their language

主题: 熊猫主题

这应该有助于发现可用的 语言包。请告诉我们您的想法!

问题面板表格视图

在本版本中,我们为用户添加了一项新功能,可以将问题面板的视图模式在树和表格之间切换。与树视图相比,表格显示每个问题的来源(语言服务或扩展),这允许用户按其来源筛选问题。

Problems panel table view

主题: GitHub 深色调暗主题

您可以使用问题面板右上角的 以表格形式查看/以树形视图查看 按钮切换视图 UI,也可以使用 问题:默认视图模式 设置(problems.defaultViewMode)更改默认视图模式。

Problems panel View at Table button

已弃用的扩展

在本版本中,我们在 VS Code 中添加了对已弃用扩展的支持。扩展可以简单地被弃用,也可以在支持另一个扩展或其功能内置于 VS Code 时被弃用。VS Code 将在扩展视图中将扩展呈现为已弃用,如下所示。

已弃用且不再维护的扩展。

Deprecated extension with no maintenance

已弃用以支持另一个扩展的扩展。在这种情况下,VS Code 不允许用户安装此扩展。

Deprecated extension with alternative

已弃用的扩展,其功能已内置于 VS Code 中,可以通过配置设置启用。

Deprecated extension with builtin to VS Code

VS Code 不会自动迁移或卸载已弃用的扩展。将有一个 迁移 按钮指导您切换到推荐的扩展。

Migrate deprecated extension

主题: GitHub 深色调暗主题

注意:已弃用扩展的列表由 VS Code 维护。如果您认为应该弃用某个扩展,请通过在以下内容中发表评论与我们联系 讨论.

赞助扩展

VS Code 现在允许用户赞助他们最喜欢的扩展。当可以赞助某个扩展时,VS Code 将在扩展视图详细信息页面中呈现一个 赞助 按钮,如下所示

Sponsor extension button on Extensions view Details page

主题: GitHub 深色调暗主题

赞助 按钮将引导您到扩展的赞助 URL,您可以在那里提供支持。请参考 扩展赞助 了解如何为您的扩展选择此功能。

根据 .gitignore 隐藏资源管理器中的文件

文件资源管理器现在支持解析和隐藏被您的 .gitignore 文件排除的文件。这可以通过 资源管理器:排除 Git Ignore (explorer.excludeGitIgnore) 设置启用。此设置与 files.exclude 一起使用,可以从资源管理器中隐藏不需要的文件。

注意:目前,否定全局模式(如 !package.json)不可解析。

锁定悬停位置

由于其他 UI 元素(例如滚动条)的存在,某些自定义悬停难以或无法使用鼠标悬停。在悬停处于活动状态时按住 Alt 键现在将“锁定”它,使其具有更宽的边框,并防止鼠标在悬停外部移动而隐藏它。这主要是一个辅助功能,使悬停与屏幕放大镜配合使用,但它也适用于从悬停中复制文本。请注意,此功能仅适用于编辑器之外,因为编辑器悬停始终可以使用鼠标悬停,除非通过 editor.hover.sticky 设置另行指定。

设置编辑器改进

设置编辑器现在显示语言特定设置的默认值覆盖指示器。您可以通过在设置编辑器搜索栏中添加语言过滤器来查看 语言特定设置,方法是明确输入(@lang:javascript),或者单击搜索栏右侧的过滤器按钮,然后选择 语言 选项。

当默认值覆盖指示器显示时,它表示语言特定设置的默认值已被扩展覆盖。指示器还指示哪个扩展覆盖了默认值。

主题: 浅粉色

此版本还修复了一个行为,即设置编辑器中的一些链接在设置编辑器搜索栏中已经存在搜索查询时没有正确重定向。这些链接现在也具有正确的样式,因此在将鼠标悬停在其上时会更清楚。

<video src="/assets/updates/1_68/settings-editor-working-links.mp4" autoplay loop controls muted title="在设置编辑器中搜索“font”一词,然后在目录表中选择终端类别,设置 terminal.integrated.fontFamily 将显示,其描述包含指向 editor.fontFamily 设置的链接。现在单击该链接将正确地将您带到该设置。">

主题: 浅粉色

评论小部件主按钮

评论小部件对第一个(最右侧)操作使用主按钮颜色

Add Comment has the primary button color

终端

查找匹配的背景颜色

在终端中查找匹配的最后一个版本是实现为在所有匹配项周围显示一个边框,但这只是一个临时解决方案,直到支持动态更改单元格背景成为可能。现在,当突出显示匹配项时,主题的默认背景颜色将是彩色背景,并且整体体验应该与编辑器类似。

Find now uses the blue from the editor's find for the active match and the orange for highlights

如果您是采用 terminal.findMatchBorderterminal.findMatchHighlightBorder 的主题作者,我们建议您迁移到 terminal.findMatchBackgroundterminal.findMatchHighlightBackground,如果这更适合主题或有助于对比度。

对比度和最小对比度比的改进

查找匹配背景的工作为终端如何使用背景和前景色提供了更大的灵活性。因此,对终端的对比度进行了改进,使终端视觉效果更接近编辑器。此外,现在还存在最小对比度比功能,该功能会动态更改文本的前景色以帮助提高可见度。

  • 如果对比度不满足,亮度现在将向另一个方向移动。例如,如果纯黑色 (#_000000) 的深灰色文本在浅灰色背景上对比度不满足,颜色也将尝试向白色移动,并将使用最能满足所需对比度比的值。

    Darker grey on lighter dark can now use a light foreground color if needed

  • 当禁用 GPU 加速时,选择现在绘制在文本下方,并支持不透明颜色。以前,这必须是半透明的,它会淡化前景色。由于这一变化,选择颜色现在使用与编辑器中相同的颜色。

    Foreground color are retained in selections

  • Nerd 字体 符号现在应该应用最小对比度,以与附近的文本融合,而 Powerline 符号和方框绘制字符则 **不会** 应用最小对比度,因为它们通常与没有前景色字符的反转单元格相邻。

    Powerlines no longer have odd colors between the colored sections

  • 主题现在可以指定一个固定的选择前景色,在高对比度主题中默认使用。

    The dark high contrast theme now uses black as its selection foreground

  • 修复了几个错误,以使生成的前景色更加准确。

提醒一下,如果您希望使用原始颜色,可以通过设置 "terminal.integrated.minimumContrastRatio": 1 来禁用最小对比度。

任务

默认任务的通配符模式

默认的构建和测试任务现在可以限定为仅在活动文件与文件名通配符模式匹配时才为“默认”。

{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "echo txt",
            "type": "shell",
            "command": "echo TextFile",
            "group": {
                "kind": "build",
                "isDefault": "**.txt" // This is a glob pattern which will only match when the active file has a .txt extension.
            }
        },
        {
            "label": "echo js",
            "type": "shell",
            "command": "echo JavascriptFile",
            "group": {
                "kind": "build",
                "isDefault": "**.js" // This is a glob pattern which will only match when the active file has a .js extension.
            },
        }
    ]
}

源代码管理

Git 扩展进行了一些更新,与我们的新的 拉取请求流程 保持一致。

Git:分支前缀

为了使创建新分支的过程更加顺畅,有一个新的设置 git.branchPrefix,它指定在创建新分支时用作前缀的字符串。

Git:分支名称生成

一个新的设置 git.branchRandomName.enable 将使 VS Code 在创建新分支时建议随机分支名称。随机名称是从词典中生成的,您可以通过 git.branchRandomName.dictionary 设置来控制词典。支持的词典有:adjectives(默认)、animals(默认)、colorsnumbers

Git:分支保护

使用新的 git.branchProtection 设置,您可以配置要保护的特定分支。VS Code 将避免直接在受保护的分支上提交,而是会为您提供创建新分支来提交的机会。您可以使用 git.branchProtectionPrompt 设置来微调此行为。

GitHub:拉取请求模板支持

GitHub 扩展现在理解 拉取请求模板,并将它们用作从新分叉的存储库创建 PR 的基础。

笔记本

单元格显示更改

我们调整了在几种情况下如何显示视窗外的单元格。

当您在概述视图中单击一个单元格时,如果该单元格位于视窗之外,笔记本现在将滚动以显示该单元格,大约在视窗的顶部 1/5 处。这与文本编辑器中概述的行为相匹配。

当光标位于单元格编辑器中时,您可以将光标移动到编辑器的第一行或最后一行之后,以将其移动到下一个单元格编辑器中。现在,当将光标移动到单元格位于视窗之外的编辑器时,笔记本将滚动到足以显示编辑器中的该行,而不是跳到显示单元格在视窗中间的位置。

查找和替换支持从光标/选择中播种查询

笔记本编辑器中的查找控件现在支持从编辑器选择中播种搜索字符串。该行为由编辑器设置 editor.find.seedSearchStringFromSelection 控制。

调试

无需 launch.json 即可运行和调试

当您没有设置 launch.json 配置文件并按下 F5 或在调试视图中选择 **运行和调试** 按钮时,VS Code 会根据当前活动文件中的编程语言选择一个调试器。如果您没有打开文件,系统会询问您要使用哪个调试器。这种体验可能有点令人困惑,因此我们进行了一些改进。

Select debugger prompt before (alphabetical) and after (activated debugger at the top)

如果在尝试开始调试之前已经激活了某个扩展,则该扩展的调试器将被排序到顶部。这在以下情况下很有用,例如,当扩展通过以前运行来自该扩展的命令或打开激活该扩展的语言的文件,或者通过工作区匹配的 workspaceContains 模式激活时。如果您在本会话中使用了调试器,它也将被排序到顶部。

Chrome/Edge 调试器已重命名为 **Web 应用程序 (Chrome)** 和 **Web 应用程序 (Edge)**,以避免与其他调试器混淆,例如 Flutter 扩展,它也在浏览器中运行应用程序。

语言

TypeScript 4.7

VS Code 现在捆绑了 TypeScript 4.7.3。这个主要的 TypeScript 带来了新的语言特性,包括 改进的控制流分析 和对 Node.js 中的 ECMAScript 模块支持 的支持。它还包括新的工具功能并修复了许多重要的错误!

转到源定义

VS Code 最长期望的功能请求之一是让 VS Code 从外部库中导航到函数和符号的 JavaScript 实现。目前,**转到定义** 跳到定义目标函数或符号的类型的类型定义文件 (.d.ts 文件)。如果您需要检查这些符号的类型或文档,这很有用,但隐藏了代码的实际实现。当前的行为也会让许多可能不了解 .d.ts 中的 TypeScript 类型的 JavaScript 用户感到困惑。

虽然将 **转到定义** 更改为导航到符号的 JavaScript 实现听起来很简单,但这个功能请求已经开放了很长时间,是有原因的。JavaScript(尤其是许多库提供的编译后的 JavaScript)比 .d.ts 难分析得多。尝试分析 node_modules 下的所有 JavaScript 代码既慢又会显着增加内存使用量。还存在许多 VS Code IntelliSense 引擎无法理解的 JavaScript 模式。

这就是新的 **转到源定义** 命令的用武之地。当您从编辑器上下文菜单或命令面板中运行此命令时,TypeScript 将尝试查找符号的 JavaScript 实现并导航到它。这可能需要几秒钟,我们可能无法始终获得正确的结果,但在许多情况下它应该很有用。

我们正在积极努力改进此功能,因此请在您的代码库中尝试一下并 分享您的反馈

对象方法片段

对象方法片段可以帮助您快速将实现给定接口的方法添加到对象字面量中。

在对象字面量内,您应该为每种可能的方法看到两个建议:一个插入方法名称,另一个插入方法的完整签名。您还可以通过设置 "typescript.suggest.classMemberSnippets.enabled": false"javascript.suggest.classMemberSnippets.enabled": false 来完全禁用对象方法片段。

组感知组织导入

JavaScript 和 TypeScript 的 **组织导入** 命令可让您快速清理导入列表。运行时,它会删除未使用的导入,并将导入按字母顺序排序。

但是,某些代码库希望对如何组织导入进行一定程度的手动控制。将外部导入与内部导入分组是最常见的示例之一。

// local code
import * as bbb from './bbb';
import * as ccc from './ccc';
import * as aaa from './aaa';

// built-ins
import * as path from 'path';
import * as child_process from 'child_process';
import * as fs from 'fs';

// some code...

在旧版本的 VS Code 中,在这里运行 **组织导入** 会导致以下结果。

// local code
import * as child_process from 'child_process';
import * as fs from 'fs';
// built-ins
import * as path from 'path';
import * as aaa from './aaa';
import * as bbb from './bbb';
import * as ccc from './ccc';

// some code...

太糟糕了!这是因为所有导入都按字母顺序排序,VS Code 甚至尝试在执行此操作时保留注释和换行符。

但是,在 TypeScript 4.7 中,**组织导入** 现在是一个组感知命令。在上述代码上运行它看起来更像您期望的那样。

// local code
import * as aaa from './aaa';
import * as bbb from './bbb';
import * as ccc from './ccc';

// built-ins
import * as child_process from 'child_process';
import * as fs from 'fs';
import * as path from 'path';

// some code...

注意导入现在是如何排序的,同时仍然保留在它们的组中。好多了!

在隐式项目中启用严格空检查

严格空检查 在 JavaScript 和 TypeScript 中默认情况下在隐式项目中启用。这应该会导致更准确的 IntelliSense 和改进的类型检查,可以捕获常见的编程错误。

A strict null error. getElementById may return null if no element with the ID exists

此新行为仅适用于不属于 jsconfigtsconfig 项目的任何文件。您可以通过设置以下内容来禁用它:"js/ts.implicitProjectConfig.strictNullChecks": false。对于属于 jsconfigtsconfig 的文件,您仍然需要在配置文件中启用严格空检查。

您现在可以在 Markdown 文件中的 引用链接 上使用 **转到定义**。这将从引用跳转到当前文件中的链接定义。

扩展的 JSON Schema 支持

内置的 JSON 语言服务改进了对 JSON Schema Draft 2019-09JSON Schema Draft 2020-12 的支持。当使用这种架构时,不再显示警告。

仍然有一些功能尚未完全支持。当架构使用它们时,会显示警告。不受支持的属性是

  • 具有 $id 的子架构
  • $recursiveRef/Anchor (Draft 2019-09)
  • $dynamicRef/Anchor (Draft 2020-12)

适用于 Web 的 VS Code

核心本地化支持

我们为 Web 引入了 VS Code 的初始本地化支持。VS Code 在世界各地使用,对于许多用户来说,英语不是他们的第一语言(或他们熟悉的语言!)。多年来,VS Code 用户一直在安装 市场上的语言包,以便使用除英语以外的其他语言使用 VS Code。对于 Web 版 VS Code,我们决定采取不同的方法,这种方法与当今 Web 的工作方式更加一致。

对于将浏览器设置为我们支持的核心语言之一的用户,vscode.dev 将自动应用该语言的翻译。我们支持的语言在 vscode-loc 存储库中进行了记录。

例如,要在 Microsoft Edge 中配置显示语言,您将使用 **设置** > **语言**

Microsoft Edge Settings Languages page

设置完成后,当您访问 vscode.dev(或 insiders.vscode.dev)时,它将以德语显示。

vscode.dev in a browser displayed in German

主题: 熊猫主题

在接下来的几个月里,我们将为扩展启用本地化(包括与 VS Code 一起提供的扩展和未与 VS Code 一起提供的扩展),以便扩展作者也可以支持非英语用户。敬请期待!

远程存储库

当使用 **远程存储库 > 继续在... 上工作** 命令将 GitHub 或 Azure Repos 存储库克隆到本地并在桌面版 VS Code 中打开时,您现在可以配置 remoteHub.gitProtocol 以始终使用 httpssh URL 克隆。

开发容器规范

我们在 Microsoft 和 GitHub 的开发容器团队继续积极开发新的 开发容器规范,这次迭代中有一些激动人心的亮点。

参考实现

我们发布了一个开源命令行界面 (CLI) 作为该规范的参考实现。CLI 从 devcontainer.json 构建并启动开发容器,它可以直接使用,也可以集成到产品体验中。

CLI 可在新的 devcontainers/cli 存储库中获得。您可以在其 自述文件 中了解如何开始使用,并在本 博客文章 中了解更多信息。

CLI 正在积极开发中,并将继续发展以更好地支持更多场景,例如为个人用户提供更多支持。 我们希望在开发过程中听到您的反馈,因此我们已 发布了一个问题,专门用于收集有关 CLI 的反馈,并欢迎您在仓库中提交其他问题和 PR。

CI 中的开发容器

GitHub Action 和 Azure DevOps 任务可用于在持续集成 (CI) 构建中运行存储库的开发容器。 这使您可以重复使用用于本地开发的相同设置来在 CI 中构建和测试您的代码。 有关更多详细信息,请参阅 devcontainers/ci 自述文件

GitHub Action 的示例用法

- name: Build and run dev container task
  uses: devcontainers/[email protected]
  with:
    imageName: ghcr.io/example/example-devcontainer
    runCmd: make ci-build

Azure DevOps 任务的示例用法

- task: DevcontainersCI@0
  inputs:
    imageName: 'yourregistry.azurecr.io/example-dev-container'
    runCmd: 'make ci-build'
    sourceBranchFilterForPush: refs/heads/main

规范

规范的积极开发仍在继续,我们已在 devcontainers/spec 存储库中发布了 初始版本

与 CLI 一样,请继续关注进一步的更新和进展,我们也希望听到您的反馈。

进一步阅读

您可以在 https://containers.dev 上阅读有关开发容器和规范的所有内容。

对扩展的贡献

Python

启动时不进行解释器发现

Python 扩展现在仅在以下情况时自动触发发现

  • 使用 Python: 选择解释器 命令选择不同的解释器。
  • 首次打开特定范围(工作区或全局)。
  • 未安装 Python。

由于发现不会在启动时自动触发,因此这会导致即时加载,并加快其他功能(如语言服务器)的启动速度。 但是,如果安装/启用了 Jupyter 扩展,Jupyter 仍会在启动时触发发现。

启用本地化

Python 扩展现在支持 VS Code 支持的所有语言的翻译。 我们已更新了使用 vscode-nls 获取命令、通知、标题等的翻译方式。 这些翻译由本地化团队维护,以确保它们是最新的且正确的。

Jupyter

Web 扩展

我们在支持 Jupyter 扩展的 Web 版本中的更多核心功能方面取得了进展。

本月,以下功能移植到 Web 扩展

  • https 支持
  • 内核完成
  • ipywidgets
  • 笔记本调试
  • 变量查看
  • 导出
  • 交互式窗口

如果您想尝试该功能,请从本地机器启动 Jupyter,使用

jupyter notebook --no-browser --NotebookApp.allow_origin_pat=https://.*\.vscode-cdn\.net

然后使用 Jupyter: 指定 Jupyter 服务器以进行连接 命令从 vscode.dev 中连接到它。

有关更多信息(以及评论),请参阅此讨论

远程开发

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

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

GitHub 拉取请求和问题

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

  • 创建拉取请求 视图中的自动合并复选框

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

远程存储库扩展

GitHub 存储库Azure Repos 扩展都支持 VS Code 支持的所有语言的翻译。

预览功能

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

通过链接验证,VS Code 将分析指向标题、图像和其他本地文件的 Markdown 链接。 无效链接将被报告为警告或错误。

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

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

链接验证默认情况下处于关闭状态。 您可以尝试链接验证,方法是设置 "markdown.experimental.validate.enabled": true

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

  • markdown.experimental.validate.fileLinks.enabled - 启用/禁用对指向本地文件的链接的验证:[link](/path/to/file.md)

  • markdown.experimental.validate.headerLinks.enabled - 启用/禁用对当前文件中标题的链接的验证:[link](#_some-header)

  • markdown.experimental.validate.referenceLinks.enabled - 启用/禁用对引用链接的验证:[link][ref]

  • markdown.experimental.validate.ignoreLinks - 跳过验证的链接列表。 如果您链接到磁盘上不存在但 Markdown 发布后会存在的文件,这将很有用。

请告诉我们您对新功能的看法!

我们添加了对粘贴以在 Markdown 中插入图像或文件链接的实验性支持。

这需要启用 markdown.experimental.editor.pasteLinks.enabled"editor.experimental.pasteActions.enabled"。 您目前可以从 VS Code 文件资源管理器中复制文件。 粘贴图像文件会插入图像引用,而粘贴普通文本文件会插入指向这些文件的链接。

终端 shell 集成

Shell 集成(通过 terminal.integrated.shellIntegration.enabled 设置启用)和命令装饰已在此迭代中经过完善和改进。

一些更新包括

  • 146377 持续保留 shell 状态,以便 bash-git-prompt 和其他程序正常工作
  • 148635 允许为 zsh 使用自定义 ZDOTDIR
  • 145801 修复装饰在速度较慢的机器上出现不同步的问题
  • 146873 改进对 bash 中现有调试陷阱的处理
  • 148839 使用 这如何工作? 命令和选项卡悬停中的激活状态来完善消息
  • 151223 在缓冲区清除后,确保正确跟踪命令

Windows 上的窗口控件覆盖

我们采用了 Electron 提供的 API 来支持 Windows 上的 窗口控件覆盖。 此更改的主要用户界面优势是可以访问 Windows 11 中的 对齐布局 功能。 由于存在一些 持续存在的问题,因此窗口控件覆盖默认情况下处于关闭状态,但您可以使用实验性设置 window.experimental.windowControlsOverlay.enabled 打开它们。

Hover over the maximize/restore window control to see Windows 11 Snap layouts

命令中心

我们正在添加命令中心 - 一种更简单的方式来触发文件、命令等的快速选择。

Command Center in the VS Code title bar

可以通过 window.experimental.commandCenter 设置启用此功能,并告诉我们您的想法。

合并编辑器

我们已经开始着手改进合并体验。 现在还处于早期阶段,我们还没有准备好接受反馈,但您可以通过 git.experimental.mergeEditor 尝试一下。 启用此选项后,具有合并冲突的文件将在新的合并编辑器中打开,以简化冲突解决。

我们将继续进行这项工作。 使用 Insider 版本 来跟踪我们的进展。 我们要真诚地感谢 Mingpan 和我们在 Google 的朋友,他们正在帮助我们完成这项工作。 ❤️

扩展编写

内联完成最终确定

我们已经最终确定了内联完成 API。 这使扩展能够提供与建议小部件分离的内联完成。 内联完成的呈现方式就像它已经被接受一样,但颜色为灰色。 用户可以通过建议进行循环,并使用 Tab 键接受它们。 使用内联完成的示例扩展是 GitHub Copilot。 可以在 vscode.d.ts 文件中找到更多信息,其中 API 的入口点是 languages.registerInlineCompletionItemProvider

InputBox 验证消息严重程度最终确定

我们的 InputBox API(通过 window.showInputBoxwindow.createInputBox在用户输入的验证中提供严重程度 已最终确定。

例如,如果您想根据用户的输入向用户显示信息消息,您的验证消息可以返回

{
  message: 'this is an info message';
  severity: InputBoxValidationSeverity.Info;
}

它将如下所示

Input box with 'this is an info message' severity message

笔记本编辑器 API

新的笔记本编辑器 API 引入了一种新的 NotebookEditor 类型,它类似于 TextEditor,但用于 笔记本 而不是普通的文本编辑器。

const editor = vscode.window.activeNotebookEditor;
if (editor) {
  // Access the underlying notebook document associated with the editor
  console.log(editor.notebook.uri);

  // Change the selection in the current notebook
  editor.selection = new vscode.NotebookRange(1, 3);
}

可以使用window.activeNotebookEditor获取当前笔记本编辑器,并使用window.onDidChangeActiveNotebookEditor等事件观察用户何时切换到新的笔记本编辑器。

基于时间轴视图的扩展激活

当时间轴视图可见时,添加了一个新的激活事件。 此事件onView:timeline可供任何扩展使用,但对于实现提议的Timeline API 的扩展来说最有用。

UX 指南

针对扩展作者的UX 指南已更新并扩展,涵盖更多 VS Code 用户界面元素。

UX Guideline example image pointing to View Actions elements

修改后的概述页面逐步介绍 VS Code UI,以提供界面和常见 UI 元素的可视化浏览。

每个区域的专用页面都添加了指向相关指南、API 参考和扩展示例的链接。 此外,所有示例图像都在指南中更新,以展示最新版本的 UI。

现在您可以阅读有关添加或贡献这些 UI 元素的扩展的推荐做法和禁止做法。

扩展赞助

在此里程碑中,我们在扩展的package.json中引入了sponsor字段,允许扩展选择加入赞助。 sponsor对象包含url字段,用于扩展作者的赞助链接。 例如

"sponsor": {
    "url": "https://github.com/sponsors/nvaccess"
}

如果扩展选择加入此功能,VS Code 将在扩展视图详细信息页面中呈现一个**赞助**按钮,如上面的赞助扩展部分所示。

注意:请确保使用最新的vsce命令行工具(>=2.9.1)发布已启用赞助的扩展。

提议的 API

每个里程碑都包含新的提议 API,扩展作者可以尝试使用它们。 与往常一样,我们希望收到您的反馈。 以下是如何尝试使用提议的 API 的步骤

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

您无法发布使用提议的 API 的扩展。 下一个版本中可能会有重大更改,我们不希望破坏现有扩展。

从 DataTransfer 读取文件

新的dataTransferFiles API 提议允许扩展从vscode.DataTransfer对象读取文件。 DataTransfer类型由树拖放 API 以及拖放到编辑器和复制粘贴 API 提议使用。

export class TestViewDragAndDrop implements vscode.TreeDataProvider<Node>, vscode.TreeDragAndDropController<Node> {

  ...

   public async handleDrop(target: Node | undefined, sources: vscode.DataTransfer, token: vscode.CancellationToken): Promise<void> {

     // Get a list of all files
     const files: vscode.DataTransferFile[] = [];
     sources.forEach((item) => {
       const file = item.asFile();
       if (file) {
         files.push(file);
       }
     });

    const decoder = new TextDecoder();

    // Print out the names and first 100 characters of the file
     for (const file of files) {
       const data = await file.data();
       const text = decoder.decode(data);
       const fileContentsPreview = text.slice(0, 100);
       console.log(file.name + ' — ' + fileContentsPreview + '\n');
     }

    ...
  }
}

当文件数据传输项来自 VS Code 之外(例如,将文件从桌面拖放到树视图或编辑器中)时,它们才会被添加到DataTransfer中。

复制粘贴 API

新的documentPaste API 提议允许扩展接入文本编辑器中的复制和粘贴操作。 这可用于修改在粘贴时插入的文本。 您的扩展还可以在复制文本时存储元数据,并在粘贴时使用此元数据(例如,在两个代码文件之间粘贴时,将导入一起粘贴)。

文档粘贴扩展示例展示了此 API 的实际应用。

/**
 * Provider that maintains a count of the number of times it has copied text.
 */
class CopyCountPasteEditProvider implements vscode.DocumentPasteEditProvider {
  private readonly countMimeTypes = 'application/vnd.code.copydemo-copy-count';

  private count = 0;

  prepareDocumentPaste(
    _document: vscode.TextDocument,
    _range: vscode.Range,
    dataTransfer: vscode.DataTransfer,
    _token: vscode.CancellationToken
  ): void | Thenable<void> {
    dataTransfer.set(this.countMimeTypes, new vscode.DataTransferItem(this.count++));
  }

  async provideDocumentPasteEdits(
    _document: vscode.TextDocument,
    range: vscode.Range,
    dataTransfer: vscode.DataTransfer,
    token: vscode.CancellationToken
  ) {
    const countDataTransferItem = dataTransfer.get(this.countMimeTypes);
    if (!countDataTransferItem) {
      return undefined;
    }

    const textDataTransferItem = dataTransfer.get('text/plain') ?? dataTransfer.get('text');
    if (!textDataTransferItem) {
      return undefined;
    }

    const count = await countDataTransferItem.asString();
    const text = await textDataTransferItem.asString();

    // Build a snippet to insert
    const snippet = new vscode.SnippetString();
    snippet.appendText(`(copy #${count}) ${text}`);

    return new vscode.SnippetTextEdit(range, snippet);
  }
}

vscode.languages.registerDocumentPasteEditProvider(
  { language: 'markdown' },
  new CopyCountPasteEditProvider()
);

新的笔记本工作区编辑提议

新的notebookWorkspaceEdit API 提议允许扩展编辑笔记本的内容。 它取代了以前的notebookEditorEdit提议。

使用该提议,您可以创建工作区编辑,以在笔记本中插入、替换或修改单元格。

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

  edit.set(
    currentNotebook.uri,
    vscode.NotebookEdit.insertCells(/* index*/ 1, [
      // ... new notebook cell data
    ])
  );

  await vscode.workspace.applyEdit(edit);
}

工程

使用拉取请求

我们已不再将更改直接推送到 vscode 存储库的main分支,而是现在将所有更改推送到 VS Code,仅使用拉取请求 (PR)。 我们要求每个 PR 至少获得另一名团队成员的批准。 利用这一优势,我们现在还要求在 PR 可以合并之前,必须通过一些基本检查。 这些任务包括 TypeScript 编译、格式化规则、单元测试和集成测试,通常不超过 10 分钟。 切换到此流程减少了由于编程错误导致 Insider 版本构建失败的次数。

VS Code OSS 构建

我们有一个新的公开Code OSS 构建,它重用与我们的生产构建相同的构建定义。 此构建现在在每个 PR 上都可以在 30 分钟内完成,我们计划继续投入资源,使其更快完成。

文档

更新的版本控制视频

使用 Git 与 Visual Studio入门视频已重新制作,帮助您开始使用 VS Code 中内置的 Git 集成。

您还可以找到VS Code YouTube频道上的其他精彩视频。

code.visualstudio.com 上的 vscode.dev

想要使用 VS Code for the Web,但忘记了 URL? vscode.dev现在在 VS Code下载页面上醒目显示,以便您可以快速在浏览器中启动运行的 VS Code。

vscode.dev on the code.visualstudio.com download page

值得注意的修复

  • 141157 在非调试模式下单击 F11 会打开调试而不是全屏显示
  • 148864 TypeScript 文件的未绑定断点
  • 149638 懒惰变量评估按钮会导致节点之间出现问题间隙和错位

感谢您

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

Web 扩展

感谢启用作为Web 扩展运行代码的扩展的扩展作者(以下列表是 2022 年 5 月 2 日至 6 月 6 日之间的)。

问题跟踪

对我们的问题跟踪的贡献

拉取请求

vscode 的贡献

vscode-extension-samples 的贡献

vscode-generator-code 的贡献

vscode-html-languageservice 的贡献

vscode-js-debug 的贡献

vscode-languageserver-node 的贡献

vscode-pull-request-github 的贡献

  • @jpspringall: Issue #3371 | 更新 getAuthSessionOptions 以防万一是 GitHub Enterprise AuthProvider PR #3565

debug-adapter-protocol 的贡献

language-server-protocol 的贡献