尝试以扩展 VS Code 中的代理模式!

2022 年 5 月(版本 1.68)

更新 1.68.1:本次更新解决了这些问题

下载:Windows:x64 Arm64 | Mac:通用 Intel Apple Silicon | 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

主题:Panda Theme

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

问题面板表格视图

在此里程碑中,我们添加了一项新功能,允许用户在“问题”面板的树视图和表格视图之间切换。与树视图相比,表格显示了每个问题的来源(语言服务或扩展),这使得用户可以根据来源过滤问题。

Problems panel table view

主题:GitHub Dark Dimmed Theme

您可以使用“问题”面板右上角的以表格查看/以树查看按钮切换视图 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 Dark Dimmed Theme

注意:已弃用扩展列表由 VS Code 维护。如果您认为某个扩展应该被弃用,请在此讨论中评论联系我们。

赞助扩展

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

Sponsor extension button on Extensions view Details page

主题:GitHub Dark Dimmed Theme

“赞助”按钮会将您引导至扩展的赞助 URL,您可以在那里提供支持。请参阅扩展赞助,了解如何为您的扩展启用此功能。

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

文件资源管理器现在支持解析和隐藏被 .gitignore 文件排除的文件。可以通过资源管理器:排除 Git 忽略 (explorer.excludeGitIgnore) 设置启用此功能。此设置与 files.exclude 协同工作,以从资源管理器中隐藏不需要的文件。

注意:目前,无法解析诸如 !package.json 之类的否定 glob。

锁定悬停位置

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

设置编辑器改进

设置编辑器现在显示语言特定设置的默认值覆盖指示器。您可以通过在设置编辑器搜索栏中添加语言筛选器(无论是显式键入 (@lang:javascript),还是通过单击搜索栏右侧的筛选器按钮并选择语言选项)来查看语言特定设置

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

主题:Light Pink

此迭代还修复了一个行为,即当设置编辑器搜索栏中已经存在搜索查询时,设置编辑器中的某些链接无法正确重定向。链接现在也具有正确的样式,以便在鼠标悬停时更清晰。

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

主题:Light Pink

评论小组件主要按钮

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

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 font 符号现在应该应用最小对比度,以与附近的文本融合,而 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 扩展现在支持拉取请求模板,并在从新 fork 的仓库创建 PR 时将其作为基础。

Notebook

单元格显示更改

我们调整了在某些情况下如何显示视口外的单元格。

当您在“大纲”视图中单击一个单元格时,如果该单元格在视口之外,笔记本现在将滚动以将该单元格显示在视口顶部约 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 文件)。如果您需要检查这些符号的类型或文档,这很有用,但会隐藏代码的实际实现。当前的行为也让许多 JavaScript 用户感到困惑,他们可能不理解 .d.ts 中的 TypeScript 类型。

虽然将转到定义更改为导航到符号的 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(草案 2019-09)
  • $dynamicRef/Anchor(草案 2020-12)

Web 版 VS Code

核心本地化支持

我们已经为 VS Code 网页版引入了初始本地化支持。VS Code 在全球范围内使用,对于许多用户来说,英语不是他们的第一语言(或者他们根本不熟悉这种语言!)。多年来,VS Code 用户一直在安装市场中的语言包,以便以非英语语言使用 VS Code。对于 VS Code 网页版,我们决定采用不同的方法,这种方法更符合当今网络的工作方式。

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

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

Microsoft Edge Settings Languages page

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

vscode.dev in a browser displayed in German

主题:Panda Theme

在接下来的几个月里,我们将为扩展(包括随 VS Code 发布的扩展和不随 VS Code 发布的扩展)启用本地化,以便扩展作者也能支持非英语用户。敬请期待!

远程仓库

当使用远程仓库 > 继续处理...命令在本地克隆 GitHub 或 Azure Repos 仓库并在桌面 VS Code 中打开时,您现在可以配置 remoteHub.gitProtocol,以始终使用 httpssh URL 进行克隆。

开发容器规范

微软和 GitHub 的开发容器团队正在积极开发新的开发容器规范,本次迭代有几个令人兴奋的亮点。

参考实现

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

CLI 可在新的 devcontainers/cli 仓库中找到。您可以在其 README 中了解如何开始使用,并在此博客文章中阅读更多信息。

CLI 正在积极开发中,并将继续发展以更好地支持更多场景,例如对个人用户的更大支持。我们很乐意在此过程中听到您的反馈,因此我们已专门为 CLI 上的反馈打开了一个问题,并欢迎在仓库中提出更多问题和 PR。

CI 中的开发容器

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

GitHub Action 示例用法

- name: Build and run dev container task
  uses: devcontainers/ci@v0.2
  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 扩展的网页版中更多核心功能方面取得了进展。

本月以下功能已移植到网页扩展中:

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

如果您想体验此功能,请在本地机器上启动 Jupyter,命令如下:

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

然后从 vscode.dev 内部使用命令Jupyter: 指定用于连接的 Jupyter 服务器连接到它。

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

远程开发

我们继续在远程开发扩展上进行工作,这些扩展允许您使用容器、远程机器或适用于 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 试用。启用此功能后,具有合并冲突的文件将在新的合并编辑器中打开,从而简化冲突解决。

我们将继续在此方面努力。使用 Insiders 关注我们的进展。我们衷心感谢 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 指南已更新和扩展,涵盖了更多 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。一如既往,我们希望得到您的反馈。以下是尝试提议 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 分支,而是现在专门使用拉取请求 (PR) 将所有更改推送到 VS Code。我们要求每个 PR 至少获得另一位团队成员的批准。利用这一点,我们现在还要求在合并 PR 之前通过一些基本检查。这些任务包括 TypeScript 编译、格式化规则、单元测试和集成测试,通常不超过 10 分钟。切换到此流程减少了由于编程错误导致 Insiders 构建损坏的次数。

VS Code OSS 构建

我们有一个新的公共 Code OSS 构建,它重用了与我们的生产构建相同的构建定义。此构建现在在每个 PR 上运行时间不到 30 分钟,我们计划继续投入以加快其速度。

文档

更新版本控制视频

将 Git 与 Visual Studio 结合使用的入门视频已经重制,旨在帮助您开始使用内置于 VS Code 中的 Git 集成。

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

code.visualstudio.com 上的 vscode.dev

想使用 VS Code 网页版但忘记了 URL?vscode.dev 现在醒目地显示在 VS Code 下载页面上,以便您可以快速在浏览器中启动 VS Code。

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

值得注意的修复

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

感谢

最后但同样重要的是,向 VS Code 的贡献者们致以衷心的感谢

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:问题 #3371 | 更新了 GitHub Enterprise AuthProvider 情况下的 getAuthSessionOptions PR #3565

debug-adapter-protocol 的贡献

language-server-protocol 的贡献