2022年5月(版本1.68)

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

下载:Windows: x64 Arm64 | Mac: Universal Intel silicon | Linux: deb rpm tarball Arm snap


欢迎来到2022年5月发布的Visual Studio Code。此版本中有许多更新,我们希望您会喜欢,一些关键亮点包括:

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

内部人员:想要尽快尝试新功能吗?您可以下载每晚的内部人员版本,并在更新可用时立即尝试最新更新。

工作台

配置显示语言改进

配置显示语言 命令已更新,包含以下内容:

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

配置显示语言下拉菜单,显示已安装和可用的语言包,以其语言显示

主题: Panda Theme

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

问题面板表格视图

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

问题面板表格视图

主题: GitHub Dark Dimmed Theme

您可以通过问题面板右上角的查看为表格/查看为树按钮切换视图界面,或者通过问题:默认视图模式设置(problems.defaultViewMode)更改默认视图模式。

问题面板中的查看表格按钮

已弃用的扩展

在这个里程碑中,我们增加了对VS Code中已弃用扩展的支持。一个扩展可以被简单地弃用,或者因为另一个扩展而被弃用,或者当它的功能被内置到VS Code中时被弃用。VS Code将在扩展视图中将扩展显示为已弃用,如下所示。

一个已弃用的扩展,不再维护。

已弃用且无维护的扩展

一个已被弃用,推荐使用另一个扩展的扩展。在这种情况下,VS Code 不允许用户安装此扩展。

已弃用的扩展有替代方案

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

已弃用的扩展与VS Code内置功能

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

迁移已弃用的扩展

主题: GitHub Dark Dimmed Theme

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

赞助扩展

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

扩展视图详情页面上的赞助扩展按钮

主题: GitHub Dark Dimmed Theme

赞助按钮将引导您前往扩展的赞助网址,您可以在那里提供支持。请参阅扩展赞助了解如何为您的扩展启用此功能。

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

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

注意: 目前,像 !package.json 这样的否定通配符是不可解析的。

锁定悬停位置

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

设置编辑器改进

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

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

主题: Light Pink

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

主题: Light Pink

评论小部件主按钮

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

添加评论具有主要按钮颜色

终端

查找匹配背景颜色

在终端中实现的最后一次发布查找功能是为了在所有匹配项周围显示边框,但这只是一个临时解决方案,直到能够动态更改单元格背景的支持实现为止。现在,当高亮显示匹配项时,主题的默认设置是彩色背景,整体体验应该与编辑器类似。

查找功能现在使用编辑器查找的蓝色表示活动匹配,橙色表示高亮

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

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

查找匹配背景工作为终端处理背景和前景颜色的方式增加了更多的灵活性。因此,在终端的对比度方面进行了改进,使终端视觉效果更接近编辑器。此外,现在有了最小对比度功能,可以动态改变文本的前景颜色,以提高可见性。

  • 如果对比度不符合要求,亮度将向相反方向调整。例如,如果在浅灰色背景上使用深灰色文本,并且纯黑色(#_000000)不符合对比度要求,颜色也会尝试向白色方向调整,并使用最能满足所需对比度比的值。

    如果需要,现在可以在较浅的暗色上使用较深的灰色作为前景色

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

    前景颜色在选择中保留

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

    电力线在彩色部分之间不再有奇怪的颜色

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

    深色高对比度主题现在使用黑色作为选择前景

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

提醒一下,如果您希望通过设置"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 扩展现在理解 pull request 模板,并在从新分叉的仓库创建 PR 时将其作为基础。

笔记本

单元格揭示变化

我们已经调整了在几种情况下视口外单元格的显示方式。

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

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

查找和替换支持从光标/选择中生成查询

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

调试

在没有launch.json的情况下运行和调试

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

选择调试器提示之前(按字母顺序)和之后(顶部激活的调试器)

如果您在尝试启动调试之前已经激活了一个扩展,那么该扩展的调试器将被排序到顶部。这可能很有用,例如,当扩展通过之前运行该扩展的命令、打开激活该扩展的语言文件或通过您的工作区匹配的workspaceContains模式激活时。如果您在此会话中使用过调试器,它也将被排序到顶部。

Chrome/Edge调试器已更名为Web App (Chrome)Web App (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代码不仅会变慢,还会显著增加内存使用量。还有许多JavaScript模式是VS Code IntelliSense引擎无法理解的。

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

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

对象方法片段

对象方法片段帮助您快速向实现给定接口的对象字面量添加方法:

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

分组感知的整理导入

Organize Imports 命令用于 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中,在这里运行Organize Imports会导致以下结果:

// 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和改进的类型检查,能够捕捉常见的编程错误。

一个严格的空值错误。如果不存在具有该ID的元素,getElementById可能返回null

这种行为仅适用于不属于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)

网页版VS Code

核心本地化支持

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

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

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

Microsoft Edge 设置语言页面

一旦设置完成,当你访问 vscode.dev(或 insiders.vscode.dev)时,它将显示为德语:

浏览器中显示的vscode.dev,语言为德语

主题: Panda Theme

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

远程仓库

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

开发容器规范

我们的开发容器团队在微软和GitHub上继续积极开发新的Dev Container Specification,这次迭代有几个令人兴奋的亮点。

参考实现

我们发布了一个开源命令行界面(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

然后使用命令Jupyter: Specify Jupyter server for connectionsvscode.dev内连接到它。

欲了解更多信息(并发表评论),请参阅此讨论项目

远程开发

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

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

GitHub 拉取请求和问题

GitHub Pull Requests and Issues扩展方面取得了更多进展,该扩展允许您处理、创建和管理拉取请求和问题。此版本的亮点包括:

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

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

远程仓库扩展

无论是GitHub Repositories还是Azure Repos扩展,都支持VS Code支持的所有语言的翻译。

预览功能

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

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

编辑器在链接到不存在的文件时显示的警告

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上的Window Controls Overlay。这一变化的主要用户好处是可以访问Windows 11中的Snap Layouts功能。由于一些持续存在的问题,Window Controls Overlay默认是关闭的,但你可以通过实验性设置window.experimental.windowControlsOverlay.enabled来开启它。

将鼠标悬停在最大化/还原窗口控件上以查看Windows 11的Snap布局

命令中心

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

VS Code 标题栏中的命令中心

这可以通过window.experimental.commandCenter设置启用,并让我们知道您的想法。

合并编辑器

我们已经开始致力于提供更好的合并体验。目前还处于早期阶段,我们尚未准备好接受反馈,但你可以通过git.experimental.mergeEditor尝试一下。启用此功能后,具有合并冲突的文件将在新的合并编辑器中打开,以使解决冲突变得更加简单。

我们将继续努力。使用Insiders来关注我们的进展。我们衷心感谢Mingpan和我们在Google的朋友们,他们正在帮助我们完成这项工作。❤️

扩展开发

内联补全完成

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

InputBox 验证消息严重性最终确定

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

例如,如果你想根据用户的输入显示一条信息消息,你的验证消息可以返回:

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

看起来会像这样:

输入框显示'这是一个信息消息'的严重性消息

Notebook 编辑器 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用户界面元素。

用户体验指南示例图片指向查看操作元素

修订后的概述页面逐步介绍了VS Code的用户界面,提供了界面和常见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分支推送更改,而是现在专门使用拉取请求(PR)向VS Code推送所有更改。我们要求每个PR至少获得另一位团队成员的批准。利用这一点,我们现在还要求在合并PR之前通过一些基本检查。这些任务包括TypeScript编译、格式化规则、单元测试和集成测试,通常不会超过10分钟。切换到这种流程减少了由于编程错误导致我们的Insiders构建中断的次数。

VS Code OSS 构建

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

文档

更新版本控制视频

使用 Git 与 Visual Studio 的介绍视频已经重新制作,以帮助您开始使用 VS Code 内置的 Git 集成。

你也可以在VS Code YouTube频道上找到其他精彩的视频。

vscode.dev 在 code.visualstudio.com 上

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

vscode.dev 在 code.visualstudio.com 下载页面

显著的修复

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

感谢您

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

Web扩展

扩展作者用于启用作为web extensions运行代码的扩展(以下列表为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 | 更新了 getAuthSessionOptions 以处理 GitHub Enterprise AuthProvider 的情况 PR #3565

debug-adapter-protocol的贡献:

language-server-protocol的贡献: