2022年6月(版本1.69)

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

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

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


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

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

观看发布派对: 聆听VS Code团队讨论一些新功能。您可以在我们的YouTube频道上找到活动录像

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

工作台

三方合并编辑器

在此版本中,我们继续开发了三向合并编辑器。此功能可以通过将git.mergeEditor设置为true来启用,并将在未来的版本中默认启用。

合并编辑器允许您快速解决Git合并冲突。启用后,可以通过在源代码控制视图中点击冲突文件来打开合并编辑器。复选框可用于接受和合并TheirsYours中的更改:

合并编辑器中提供了所有语言功能(包括诊断、断点和测试),因此您可以立即获得有关合并结果中任何问题的反馈。

结果也可以直接编辑。注意复选框如何按预期更新:

当关闭合并编辑器或接受合并时,如果未解决所有冲突,将显示警告。

合并编辑器支持词级合并——只要更改不冲突,双方都可以应用。如果插入顺序很重要,可以交换。任何时候,冲突也可以手动解决。

我们非常乐意听取您的反馈!要与我们分享合并冲突,请使用命令Merge Editor (Dev): Copy Contents of Inputs, Base and Result from JSON并将内容粘贴到您的GitHub问题中。

命令中心

命令中心已经经过打磨,现在可以尝试使用了。通过window.commandCenter设置启用它。

命令中心取代了普通的标题栏,让您可以快速搜索项目中的文件。点击主部分以显示快速打开下拉菜单,其中包含您最近的文件和一个搜索框。

命令中心及其在窗口顶部的悬停消息

主题: GitHub Theme

命令中心右侧还有一个按钮,通过“?”显示快速访问选项。左侧是返回前进按钮,用于在编辑历史中导航。

设置编辑器修改指示器

设置编辑器现在会显示设置是否有语言覆盖。为了上下文,语言覆盖总是优先于非语言特定的覆盖,因此如果设置的某个值似乎不影响某种类型文件的行为,可能是因为该设置有语言覆盖。

指示器文本已更改为更清晰和简洁。下面的短视频展示了新的在其他地方修改指示器。当适用时,悬停在指示器上会显示一个悬停,显示语言覆盖。视频稍后展示了新的默认覆盖指示器,文本为默认值已更改

主题: Light Pink

勿扰模式

新的“请勿打扰”模式启用时,会隐藏所有非错误通知弹窗。进度通知将自动显示在状态栏中。隐藏的通知仍然可以在通知中心查看。

状态栏和通知中心中显示的勿扰模式

您可以通过打开通知中心(选择状态栏右侧的铃铛图标)并点击斜杠铃铛图标来切换勿扰模式。勿扰模式在状态栏中由斜杠铃铛图标表示。

在浅色和深色主题之间切换

一个新命令允许你在你喜欢的浅色和深色主题之间切换,首选项:在浅色/深色主题之间切换。当处于浅色主题时,该命令会切换到深色主题,反之亦然。

在高对比度主题下,命令保持高对比度并切换到相反颜色主题的首选高对比度主题。

首选主题由以下设置定义:

  • workbench.preferredDarkColorTheme
  • workbench.preferredLightColorTheme
  • workbench.preferredHighContrastColorTheme
  • workbench.preferredHighContrastLightColorTheme

小地图上下文菜单

VS Code 的缩略图在编辑器的一侧显示源代码文件的高级概览。您可以通过视图:切换缩略图命令来切换缩略图的可见性,或者通过编辑器 > 缩略图:启用editor.minimap.enabled)设置完全禁用缩略图。在此版本中,现在有一个上下文菜单可以轻松显示或隐藏缩略图。

小地图上下文菜单

您还可以通过大小 (editor.minimap.size)、缩放 (editor.minimap.scale) 和 滑块 (editor.minimap.showSlider) 设置来调整外观。如果小地图被隐藏,您仍然可以通过右键单击侧边栏来显示上下文菜单。

分享菜单

复制 vscode.dev 链接 命令可以从 文件 > 分享 子菜单中使用,以快速获取您打开的 GitHub 仓库的 vscode.dev 链接。分享 子菜单也可以从编辑器上下文菜单中使用。

终端

Shell 集成

自1月份发布以来一直处于预览状态的PowerShell、bash和zsh的Shell集成现已退出预览!我们计划在1.70版本中默认启用它。

要启用 shell 集成功能,请在设置编辑器中勾选 终端 > 集成 > Shell 集成 : 启用,或在您的 settings.json 中设置该值:

"terminal.integrated.shellIntegration.enabled": true

Shell集成允许VS Code的终端更好地理解shell内部的情况,从而启用更多功能。Shell集成的目标之一是无需配置即可工作。这是通过在启用设置时自动通过shell参数和/或环境变量将shell集成脚本“注入”到shell会话中来实现的。在某些情况下,例如在子shell或一些复杂的shell设置中,这可能不起作用,但我们也为这些更高级的情况提供了手动安装路径。

以下是当前提供的 shell 集成功能的摘要:

命令装饰和概览标尺

Shell 集成能够获取在终端内运行的命令的退出代码。利用这些信息,在行的左侧添加装饰以指示命令是否成功或失败。这些装饰也会显示在滚动条的概览标尺中,就像在编辑器中一样。

蓝色圆圈出现在成功命令旁边,红色带叉的圆圈出现在失败命令旁边。圆圈的颜色出现在滚动条中

装饰可以支持上下文操作,例如重新运行命令:

点击成功的命令装饰会显示一个包含以下项目的上下文菜单:复制输出、复制输出为HTML、重新运行命令和这是如何工作的?

命令装饰可以使用以下设置进行配置:

  • terminal.integrated.shellIntegration.decorationIcon
  • terminal.integrated.shellIntegration.decorationIconSuccess
  • terminal.integrated.shellIntegration.decorationIconError

命令导航

通过shell集成检测到的命令会输入到命令导航功能中(Ctrl/Cmd+UpCtrl/Cmd+Down),以提供更可靠的命令位置。此功能允许在命令之间快速导航并选择它们的输出。

运行最近的命令

终端:运行最近的命令命令在快速选择中显示来自各种来源的历史记录,提供类似于 shell 的反向搜索功能(Ctrl+R)。最近的命令来自当前会话的历史记录、此 shell 类型的先前会话历史记录以及常见的 shell 历史文件。

"运行最近命令"命令显示一个快速选择,其中包含之前运行的命令,可以像"转到文件"命令一样进行过滤

命令的其他一些功能:

  • 在当前会话部分,Quick Pick 的右侧有一个剪贴板图标,点击它将在编辑器中打开命令输出。
  • Alt 可以按住以将文本写入终端而不运行它。
  • 上一会话部分中存储的历史记录量由terminal.integrated.shellIntegration.history设置决定。

目前没有默认分配给运行最近的命令的快捷键,但作为一个例子,它可以通过以下快捷键绑定到Ctrl+Space

{
    "key": "ctrl+space",
    "command": "workbench.action.terminal.runRecentCommand",
    "when": "terminalFocus"
},

转到最近的目录

类似于运行最近命令功能,终端:转到最近目录命令会跟踪已访问的目录,并允许快速筛选和导航(cd)到这些目录:

Alt 可以按住以将文本写入终端而不运行它。

当前工作目录检测

Shell集成告诉我们当前的工作目录是什么。以前在Windows上无法确定这些信息,除非使用一堆技巧,而在macOS和Linux上则需要轮询,这对性能不利。

当前工作目录用于解析相对链接,显示最近命令运行的目录,以及支持分割当前工作目录 "terminal.integrated.splitCwd": "inherited" 功能。

对Shell设置的支持不断增加

本次发布我们改进了与bash-preexec的集成,增加了对powerlevel10k的基本支持,并检测到更多情况下shell集成将无法工作并优雅地禁用该功能。我们预计在这一领域会有长期的改进。

SetMark 序列支持

终端现在支持最初由iTerm2创建的序列'OSC 1337 ; SetMark ST',使得可以在行的左侧以及滚动条上添加标记:

当序列写入终端时,命令左侧会出现一个小灰色圆圈,滚动条中会有相应的注释

主题: Sapphire Theme

以下是一些如何在脚本中触发此操作的示例:

  • bash: echo -e '标记这一行\x1b]1337;SetMark\x07'
  • pwsh: Write-Host "Mark this line`e]1337;SetMark`a"

简单Powerline符号的自定义渲染

当终端启用GPU加速时,四个常见的尖括号Powerline符号现在以类似于框线和块字符的方式进行自定义渲染。这带来了几个好处:

  • 子像素抗锯齿将永远不会被使用,因为这可能会导致在两侧出现难看的红色或蓝色轮廓,破坏“电源线”效果。
  • 这些字符无需安装修补字体即可使用。
  • 行高会影响这些字符。

之前:

行高不会被遵守,导致Powerline符号的高度与相邻单元格不同。此外,当使用子像素抗锯齿时,可能会出现蓝色轮廓

之后:

行高现在被尊重,并且使用灰度抗锯齿以提高渲染效果

来自 VS Code 的消息的一致格式

以前,终端中由VS Code直接写入的消息,而不是由进程写入的消息,使用了多种不同的格式。现在,这些格式已经统一为一种醒目的格式和一种更微妙的格式:

大声格式化以带有反转样式的星号开始行,随后是使用蓝色背景的消息

微妙的格式化以带有反转样式的星号开始行,随后是使用默认背景的消息

可访问性改进

终端在此次迭代中在可访问性方面进行了多项改进:

  • 默认情况下,终端:打开检测到的链接... 命令现在提供了更多链接,并且能够搜索终端缓冲区的其余部分。
  • 终端:运行最近的命令 命令现在允许通过按住 Alt 键输入结果命令而不运行它。
  • 终端中的查找功能改进了屏幕阅读器的公告。
  • 在导航模式下(Ctrl+Up)可以使用上下键,无需使用修饰键。
  • 现在可以在导航模式(Ctrl+Up)中使用上翻页和下翻页来按页滚动。

进程重连和恢复改进

终端持久性在用户体验和可靠性方面得到了一些改进:

  • 之前重新加载窗口n次会显示n次会话恢复消息。现在,会话恢复消息应该只在该特定会话有输入时显示。
  • 之前包含日期的会话恢复消息已简化为仅“历史记录已恢复”,以减少干扰。
  • “环境变量收集”功能现在在重新加载时也能正常工作,该功能会通知用户有关扩展想要更改环境的情况(例如,以支持自动Git身份验证)。

任务

装饰

在几次迭代之前,我们通过shell集成功能向终端缓冲区和概览标尺添加了装饰,以改善终端的导航。现在,装饰还标记了任务的兴趣点,可以通过命令导航功能(Ctrl/Cmd+Up, Ctrl/Cmd+Down)跳转到这些点。

对于开始/停止任务,任务开始时会显示一个装饰,并根据运行的退出代码(如果有)进行样式设置。

任务失败时会添加错误装饰,任务成功时会添加成功装饰

对于监视任务,每个编译的首次报告问题旁边会出现一个装饰。

手表任务的第一个错误被标记为装饰

图标和颜色支持

现在可以使用Codiconid和终端的ANSIcolor属性为任务设置一个icon。例如:

{
  "label": "test",
  "type": "shell",
  "command": "echo test",
  "icon": { "id": "light-bulb", "color": "terminal.ansiBlue" }
}

任务自定义图标显示在终端标签列表中

具有kind属性设置为test的任务,默认使用beaker图标。

源代码控制

Git 仓库的 "提交操作按钮"

1.61版本中,为Git仓库添加了发布同步更改的“操作按钮”。在这个里程碑中,我们添加了一个提交按钮,它有一个主要操作以及一组次要操作。次要操作可以通过git.postCommitCommand设置来控制,并允许你在提交后执行推送或同步操作。

随着提交“操作按钮”的添加,有一个新的设置git.showActionButton,您可以使用它来控制源代码控制视图中显示的Git操作按钮。您仍然可以使用通用的scm.showActionButton设置来全局禁用由实现源代码控制提供程序的扩展贡献的任何操作按钮的可见性。

使用编辑器编写提交信息

在这个里程碑中,您现在可以使用完整的文本编辑器来编写提交消息,每当提交输入框中未提供消息时。要使用这个新流程,请在不提供提交消息的情况下点击提交按钮。

您现在可以在编辑器中编写提交信息。要接受提交信息并完成提交操作,可以关闭编辑器标签页或在编辑器工具栏中选择接受提交信息按钮。要取消提交操作,您可以清除文本编辑器的内容并关闭编辑器标签页,或在编辑器工具栏中选择丢弃提交信息按钮。

你可以通过切换git.useEditorAsCommitInput设置来禁用这个新流程,并回退到使用快速输入控件的先前体验。更改设置后,你需要重新启动VS Code以使更改生效。

要在集成终端中执行的git commit命令使用相同的流程,请启用git.terminalGitEditor设置。启用该设置后,您需要重新启动终端会话。

分支保护指示器

上一个里程碑,我们添加了git.branchProtection设置,您可以使用它来配置受保护的特定分支。在这个里程碑中,状态栏和分支选择器中为受保护的分支添加了视觉指示器(锁图标)。

状态栏:

分支保护图标显示在状态栏中

分支选择器:

分支保护图标显示在分支选择器中

调试

改进的步入目标用户界面

一些调试器允许在暂停在某一行时直接进入特定的函数调用。在这个迭代中,我们改进了这个功能的用户界面:

  • 在源代码行的目标区域上右键点击并选择Step Into Target,如果有目标区域,将自动进入该目标区域。
  • 在命令面板中有一个新的命令调试:步入目标,并且可以使用⌘F11 (Windows, Linux Ctrl+F11)键盘快捷键。

在调试控制台中导航

通过快速访问菜单访问控制台

现在有一个快速访问菜单,可以查看您的调试控制台列表。在菜单中,您可以选择一个控制台名称以在底部面板中显示它。在这里,您可以搜索和筛选您的控制台名称。

主题: GitHub Dark Dimmed

有三种不同的方式可以访问此快速访问菜单:

  • 在快速打开菜单中输入 ?⌘P(Windows, Linux Ctrl+P),然后选择查看调试控制台的选项。

  • 使用调试:选择调试控制台命令。

  • 在快速打开菜单中手动输入debug consoles (带有一个尾随空格字符)。

通过视图菜单访问控制台

您还可以在现有的视图菜单中访问调试控制台列表。在快速打开菜单中输入view (带有一个尾随空格),然后向下滚动到调试控制台面板标题。您将看到可用的调试控制台列表。

在控制台之间切换

你现在可以使用 ⇧⌘[ (Windows, Linux Ctrl+PageUp) 来导航到上一个调试控制台,并使用 ⇧⌘] (Windows, Linux Ctrl+PageDown) 来转到下一个控制台。

已加载脚本的搜索和过滤

以前,您只能在运行和调试菜单中的树状视图中查看已加载的脚本。现在,您可以使用新的调试:打开已加载脚本...命令搜索并导航到脚本。它的工作方式类似于转到文件...命令,但您可以导航到已加载的脚本。

JavaScript 调试

源映射切换

现在,您可以通过点击调用堆栈视图标题中的🧭指南针图标轻松切换源映射的开启和关闭。当源映射关闭时,源代码中设置的断点仍然有效,但会被移动到编译代码中的等效位置,调试器将逐步执行编译代码而不是源代码。

主题: Codesong

当源映射关闭时,调试工具栏中会显示一个类似的按钮,可以将其重新打开。切换状态会保存在工作区中。

toString() 变量预览

如果变量或属性具有自定义的toString()方法,它将被调用来在VARIABLES视图和悬停中渲染预览。这是对具有良好字符串表示的复杂类型的通用对象预览的改进。

例如,VS Code的Range有一个toString方法,使得一目了然地理解变得更加容易:

在变量视图中显示toString()方法的输出

进入目标支持

JavaScript 调试器现在支持 Step Into Target,允许您轻松地步入一行代码中的函数调用。

进入目标下拉菜单

这可以通过调试:步入目标命令(⌘F11 (Windows, Linux Ctrl+F11))或右键点击该行来访问。

JavaScript调试中的未绑定断点警告图标

如果您正在调试TypeScript/JavaScript项目,并且在配置源映射或使断点绑定方面遇到困难,VS Code现在将在断点视图中显示提示消息,并附带指向JavaScript调试器的断点故障排除工具的链接。当您将鼠标悬停在编辑器中的灰色断点图标上时,您也会看到此提示。

悬停在断点警告图标上

当显示此提示的API最终确定后,其他调试器将能够显示带有自己适当消息的提示。

编辑器

使用预览进行重构

以前,没有办法审查重构将应用的更改。为了改善重构体验,现在可以从命令面板访问一个带预览的重构命令。带预览的重构...命令与重构...命令的工作方式相同,但会打开一个重构预览面板。用户可以选择一个重构预览,在编辑器中打开更大的重构预览视图。此迭代主要关注预览重构的代码更改,未来将推出更多功能和自定义代码操作菜单控件。

重构预览面板显示一个导致两个更改的重构

重构并预览... 在工作台中打开一个窗格并打开重构预览编辑器视图。

语言

Markdown 允许你使用尖括号来编写包含空格或其他特殊字符的链接目标:

[Some link](<path to file with spaces.md>)

在这个迭代中,我们改进了对尖括号链接的支持,以便它们在编辑器中能够正确高亮显示并可点击。

Emmet 内联补全设置

Emmet 有一个新的设置 emmet.useInlineCompletions,允许在文件中进行内联补全。目前,最好仅在编辑 HTML 和 CSS 文件时启用此设置。

下面的短视频是在所有条目的editor.quickSuggestions设置设置为off的情况下录制的。

语言指示器中的JSON通知

当有太多的折叠范围、文档符号或颜色装饰器需要显示时,VS Code 不再使用通知,而是使用 JSON 语言指示器来通知用户。

状态栏JSON语言指示器的JSON通知

HTML 最终换行格式化程序设置更改

设置 html.format.endWithNewline 已被移除,取而代之的是 files.insertFinalNewline

files.insertFinalNewline 适用于所有编程语言。如果您希望每种语言有不同的设置,可以使用语言范围:

{
  "[html]": {
    "files.insertFinalNewline": true
  }
}

笔记本

支持笔记本内扩展推荐

为了帮助改善在未安装所需扩展时的笔记本入门体验,我们更新了扩展推荐流程,并允许您直接从笔记本窗口安装扩展。这大大减少了从没有安装扩展到在VS Code中可运行单元格所需的步骤数。此迭代为Python Jupyter笔记本启用了此体验,随后将支持更多笔记本类型和语言。

快速选择显示两个条目。顶部条目被选中,左侧有一个灯泡图标,并显示'安装推荐的扩展 Python + Jupyter'

评论

切换编辑器评论

新命令Comments: Toggle Editor Commenting切换所有编辑器评论功能,包括评论范围装饰、行悬停时的“+”符号以及所有编辑器评论小部件。在禅模式下,评论功能将自动禁用。

拖动以进行多行注释

“添加评论” "+" 按钮可以拖动以添加多行评论。

企业

Windows上的UpdateMode组策略

VS Code 现在支持 基于 Windows 注册表的组策略,这使得系统管理员可以在他们管理的机器上创建和部署策略。

第一个支持的VS Code策略是UpdateMode,它覆盖了update.mode设置,并控制VS Code在新版本发布时是否自动更新。

请参阅企业文档中的Windows组策略以了解更多信息。

网页版VS Code

主题测试器支持内置主题

主题测试器是vscode.dev中的一个路由,可用于展示和尝试颜色主题而无需安装。通过在市场中指定扩展ID和主题名称,这已经可用于主题扩展。例如,要查看GitHub主题扩展(扩展ID github.github-vscode-theme)的“GitHub Dark Default”主题,您可以使用以下URL启动vscode.dev:

https://vscode.dev/editor/theme/github.github-vscode-theme/GitHub%20Dark%20Default

使用vscode.dev显示GitHub主题扩展GitHub Dark Default的颜色主题测试器

主题测试器现在也可以与VS Code中的内置主题一起使用。使用vscode.theme-defaults作为扩展ID占位符,然后输入你想要检查的主题名称。

例如,要测试“高对比度浅色”主题,您将使用以下URL:

https://vscode.dev/editor/theme/vscode.theme-defaults/Default%20High%20Contrast%20Light

扩展的部分本地化支持

vscode.dev的上一次迭代中,我们为核心产品提供的字符串引入了本地化。这次迭代我们包含了更多的字符串——特别是扩展在其扩展清单中提供的静态字符串。扩展提供的其他字符串部分(在其源代码中声明的字符串)仍然需要本地化,因此我们将在下一次迭代中继续这项工作。

配置显示语言命令

对于一些用户来说,配置浏览器使用的语言是不可能的。为了解决这个问题,VS Code for the Web 现在有了 配置显示语言 命令,允许你覆盖浏览器设置的默认语言。

此外,您可以使用清除显示语言偏好命令来移除此覆盖。

VS Code 服务器(私有预览版)

在VS Code中,我们希望用户能够无缝利用那些使他们最高效的环境。VS Code远程开发扩展允许您在Windows子系统Linux(WSL)、通过SSH的远程机器以及直接从VS Code的开发容器中工作。这些扩展在远程环境中安装了一个服务器,使得本地VS Code能够顺畅地与远程源代码和运行时进行交互。

我们现在提供独立"VS Code Server"的私人预览版,这是一个基于远程扩展使用的相同底层服务器构建的服务,加上一些额外的功能,如交互式CLI和促进与vscode.dev的安全连接,而无需SSH连接。

VS Code 服务器的帮助菜单和远程 VS Code 连接

我们的最终目标是增强您今天使用的code CLI,以便无论您的项目存储在哪里,都能打开VS Code的桌面和网页实例。虽然我们正在积极努力实现这一目标,但VS Code服务器是一个重要的里程碑,我们迫切希望将其作为私人预览版发布,以获取您的反馈。

您可以了解更多关于如何开始使用VS Code服务器的信息,在其发布的博客文章视频中,并在其文档中查看进一步的详细信息。

对扩展的贡献

ESLint

ESLint 扩展的 2.2.6 版本已经发布。除了各种错误修复外,现在还为所有支持的 ESLint 语言提供了笔记本单元格中的 linting 支持。

ESlint 验证笔记本单元格

Jupyter

IPyWidgets

IPyWidgets 现在支持除了 Python 之外的其他内核,例如 Common LispIHaskell

许多与资源加载(如图片、脚本等)相关的IPyWidget问题已得到解决,从而改善了对VegaFusionipyleafletChemiscopemobilechelonianipyturtle等小部件的支持。

其他值得注意的IPyWidget修复包括在Jupyter输出小部件中显示复杂和嵌套(包括交互式)输出。

Web扩展

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

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

  • 导出交互式窗口
  • 调试交互式窗口
  • 交互式窗口中的可折叠单元格

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

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

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

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

GitHub 拉取请求和问题

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

  • 一个新设置 "githubPullRequests.ignoredPullRequestBranches" 用于忽略拉取请求的分支。
  • 在使用设置 "githubPullRequests.pushBranch" 创建 PR 时,可以跳过 发布分支? 对话框。
  • 现在在概览编辑器中可以使用自动合并复选框。

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

预览功能

TypeScript 4.8 支持

此更新包括对即将发布的TypeScript 4.8版本的支持。有关TypeScript团队当前工作的更多详细信息,请参阅TypeScript 4.8迭代计划

要开始使用 TypeScript 4.8 的夜间构建版本,请安装 TypeScript Nightly 扩展。

我们继续完善了Markdown文件中的链接验证。这个实验性功能可以帮助捕捉Markdown文件中图片或标题的损坏链接。

除了修复了一些错误并提高了性能外,我们还重命名了一些设置,以使它们的功能更加清晰。以下是新的设置名称:

  • markdown.experimental.validate - 启用/禁用所有链接验证功能。
  • markdown.experimental.validate.fileLinks.enabled- 启用/禁用对本地文件链接的验证:[link](/path/to/file.md)
  • markdown.experimental.validate.fileLinks.markdownFragmentLinks- 启用/禁用对本地文件链接片段部分的验证:[link](/path/to/file.md#some-header)
  • markdown.experimental.validate.fragmentLinks.enabled- 启用/禁用当前文件中标题链接的验证:[link](#_some-header)
  • markdown.experimental.validate.referenceLinks.enabled- 启用/禁用参考链接的验证:[link][ref]
  • markdown.experimental.validate.ignoreLinks - 一个跳过验证的链接列表。如果你链接到磁盘上不存在但在Markdown发布后存在的文件,这将非常有用。

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

设置配置文件

在过去的几个月里,我们一直在努力支持VS Code中的设置配置文件,这是社区中最受欢迎的需求之一。在这个里程碑中,我们很高兴地宣布,这个功能已经准备好通过workbench.experimental.settingsProfiles.enabled设置在Insiders版本中进行预览。请尝试这个功能,并通过在我们的VS Code仓库中创建问题或在问题#116740中评论来告诉我们您的反馈。

设置配置文件由设置、键盘快捷键、扩展、状态、任务和代码片段组成。您可以为不同的开发环境(如Web、机器学习)或多个编程语言课堂(如Python、Java)或个人模式(如工作或演示)自定义VS Code,并将它们保存为设置配置文件。您可以根据正在进行的项目、参加的课堂或演示时,同时打开多个具有不同配置文件的工作区(文件夹)。

下面演示了如何为Web开发环境定制VS Code,并从中创建一个设置配置文件。

这里展示了如何轻松地从开发配置文件切换到演示配置文件。

您可以同时在Web开发配置文件中打开您的React项目,并在Python类配置文件中打开Python类项目,如下图所示。

多个已打开的配置文件

您可以通过在设置中使用以下颜色自定义键来自定义设置配置文件状态栏条目的前景色和背景色。

"workbench.colorCustomizations": {
    "statusBarItem.settingsProfilesBackground": "#ce4918",
    "statusBarItem.settingsProfilesForeground": "#e0dfdb",
}

您可以使用设置在齿轮菜单中的设置配置文件子菜单中的删除设置配置文件...操作来管理和删除设置配置文件。

移除设置配置文件

尽管你可以根据配置文件自定义VS Code,但有些设置只能在应用程序级别进行自定义。例如,所有应用程序范围的设置,如update.mode、语言包扩展、设置同步启用和工作区信任状态,都是在应用程序级别跨所有配置文件进行自定义的。

访问跨VS Code的Web和桌面的编辑会话

在这个里程碑中,我们宣布了VS Code中编辑会话的预览。编辑会话使您能够在VS Code可用的任何地方继续处理存储库时,带上您未提交的更改,无论是在Web版的VS Code、桌面版的VS Code,还是在不同的机器之间。

例如,您可以使用编辑会话来传输和访问工作更改:

  • github.dev中的仓库到该仓库的本地桌面克隆。
  • 从Windows设备上的仓库克隆到macOS设备上的该仓库克隆。

编辑会话目前处于预览阶段,位于workbench.experimental.editSessions.enabled设置之后。在此初始版本中,您可以使用以下命令来存储和恢复您的工作更改:

  • 编辑会话:存储当前编辑会话
  • 编辑会话:恢复最新的编辑会话

要开始使用编辑会话,请使用编辑会话:存储当前编辑会话命令,并在提示时使用GitHub或Microsoft身份验证登录。然后,在另一台机器或VS Code实例上的存储库中使用编辑会话:恢复最新编辑会话命令,将所有修改文件的工作内容恢复到您的工作区。您可以随时使用编辑会话:注销命令注销编辑会话。

在我们继续迭代编辑会话体验的过程中,请尝试使用并通过在issue #141293中评论与我们分享您的反馈。

扩展开发

可迭代的 vscode.d.ts 集合类型

为了使在vscode.d.ts中的集合类型更易于使用,我们在这次迭代中使它们全部可迭代。这允许你使用for...of循环和扩展运算符来处理这些类型:

const data: vscode.DataTransfer = ...;
for (const [mime, item] of data) {
    const str = await item.asString();
    ...
}

新可迭代类型的完整集合是:

  • DiagnosticCollection
  • DataTransfer
  • EnvironmentVariableCollection
  • TestItemCollection

可扩展的笔记本渲染器

Notebook renderers 允许扩展自定义笔记本中单元格和输出的渲染方式。在此次迭代中,我们扩展了笔记本渲染器API,允许一个渲染器增强另一个渲染器,包括VS Code中的一些内置渲染器。这使得扩展可以在不重新实现完整渲染器的情况下为笔记本渲染添加新功能。它还提供了更好的用户体验,因为用户无需切换到新的渲染器即可查看正确渲染的内容。

Notebook Extend Markdown Renderer Sample 展示了扩展如何通过表情符号支持来扩展 VS Code 的内置 Markdown 渲染器。让我们快速浏览一下关键部分!

可扩展笔记本渲染器的API是故意定义得比较宽松的。为了开始,我们的扩展需要贡献一个新的笔记本渲染器。因为我们正在扩展一个现有的渲染器,所以我们在这里使用entrypoint字段来指定要扩展的渲染器的ID(在这种情况下,是VS Code内置的vscode.markdown-it-renderer)以及要加载的渲染器脚本的路径:

"notebookRenderer": [
    {
        "id": "sample.markdown-it.emoji-extension",
        "displayName": "Markdown it Emoji renderer",
        "entrypoint": {
            "extends": "vscode.markdown-it-renderer",
            "path": "./out/emoji.js"
        }
    }
]

每当vscode.markdown-it-renderer被激活时,此渲染器现在将被激活。

现在要扩展vscode.markdown-it-renderer,我们的渲染器可以调用基础渲染器上的一个方法。这个方法是基础渲染器特有的。在这种情况下,我们首先使用getRenderer获取基础渲染器,然后在其上调用extendMarkdownIt来增强它用于渲染的Markdown-It实例:

import type * as MarkdownIt from 'markdown-it';
import type { RendererContext } from 'vscode-notebook-renderer';

interface MarkdownItRenderer {
    extendMarkdownIt(fn: (md: MarkdownIt) => void): void;
}

export async function activate(ctx: RendererContext<void>) {
    // Acquire the base renderer
    const markdownItRenderer = await ctx.getRenderer('vscode.markdown-it-renderer') as MarkdownItRenderer | undefined;
    if (!markdownItRenderer) {
        throw new Error(`Could not load 'vscode.markdown-it-renderer'`);
    }

    // Load our Markdown-It extension
    const emoji = require('markdown-it-emoji');

    // Call the base renderer's extension method (extendMarkdownIt) to augment
    // the Markdown-It with emoji support.
    markdownItRenderer.extendMarkdownIt((md: MarkdownIt) => {
        return md.use(emoji, {});
    });
}

这里需要注意的关键部分是extendMarkdownIt只是基础渲染器返回的一个方法。其他可扩展的渲染器可以轻松返回它们自己的扩展点。

查看Notebook Extend Markdown Renderer Sample以获取扩展VS Code内置Markdown-It渲染器的完整示例。

从DataTransfers读取外部文件

扩展现在可以使用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');
        }

        ...
    }
}

Web视图中的高对比度亮色

Webviews 现在可以使用 vscode-high-contrast-light CSS 类来针对高对比度浅色主题

.vscode-high-contrast-light .error {
    color: red;
}

vscode-high-contrast-light 类会自动添加到 webview 的 body 元素中。

测试项标签中的图标

Codicons 现在可以在标准 $(icon) 格式中使用,以在 TestItem.label 中显示图标,从而在测试资源管理器视图和测试结果中显示图标。

源代码控制输入框启用

扩展作者现在可以使用enabled属性来切换源代码控制视图中输入框的启用状态。

JSON 单词模式更改

每种语言都有一个单词模式,定义了在该语言中哪些字符属于一个单词。JSON 与所有其他语言不同,因为它包括字符串字面量的引号和完整的字符串字面量内容。现在它遵循其他语言,只包含字母、数字和连字符。

此更改将修复扩展选择时的问题(命令:扩展选择),允许在字符串内进行单词补全,并修复一些代码建议异常。

依赖于单词模式的扩展,例如代码补全中的默认替换范围,需要更新其实现以明确声明所有补全的替换范围。

调试适配器协议

  • 为了为Step Into Target功能提供更好的用户体验,DAP的StepInTarget类型中添加了额外的信息。通过四个属性linecolumnendLineendColumn,现在可以将步入目标链接到相应的源范围。
  • 向调试对象传递程序参数受到两个相互冲突的目标的阻碍:一些用户希望能够将所有字符传递给调试对象,而其他用户则希望使用某些字符与底层shell进行通信。为了更好地支持这两种用例,我们正在研究DAP的runInTerminal请求,以控制程序参数中特殊字符的转义。一个提案已经可用。如果您是对此DAP添加感兴趣的调试扩展作者,我们将非常感谢您的反馈。
  • 此外,我们已经解决了调试适配器协议的几个文档问题。这些包括对术语“clients”和“falsey”的澄清,对校验和和日期字符串的更精确规范,以及对Source.origin的改进措辞。

提议的API

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

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

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

粘贴编辑提供者

我们已经更新了documentPaste API提案,使其更容易正确实现,特别是在处理多个光标时。

提醒一下,此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,
    _ranges: readonly vscode.Range[],
    dataTransfer: vscode.DataTransfer,
    _token: vscode.CancellationToken
  ): void | Thenable<void> {
    dataTransfer.set(this.countMimeTypes, new vscode.DataTransferItem(this.count++));
    dataTransfer.set('text/plain', new vscode.DataTransferItem(this.count++));
  }

  async provideDocumentPasteEdits(
    _document: vscode.TextDocument,
    _ranges: readonly vscode.Range[],
    dataTransfer: vscode.DataTransfer,
    _token: vscode.CancellationToken
  ): Promise<vscode.DocumentPasteEdit | undefined> {
    const countDataTransferItem = dataTransfer.get(this.countMimeTypes);
    if (!countDataTransferItem) {
      return undefined;
    }

    const textDataTransferItem = dataTransfer.get('text') ?? dataTransfer.get('text/plain');
    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 { insertText: snippet };
  }
}

export function activate(context: vscode.ExtensionContext) {
  // Enable our provider in plaintext files
  const selector: vscode.DocumentSelector = { language: 'plaintext' };

  // Register our provider
  context.subscriptions.push(
    vscode.languages.registerDocumentPasteEditProvider(
      selector,
      new CopyCountPasteEditProvider(),
      {
        pasteMimeTypes: ['text/plain']
      }
    )
  );
}

WebUSB、WebSerial 和 WebHID 在网页上的访问

现在实验性地支持从web extensions中使用WebUSBWeb SerialWebHID

要访问这些API,您的扩展程序首先需要通过运行以下命令之一来请求访问所需的设备:

  • workbench.experimental.requestUsbDevice
  • workbench.experimental.requestSerialPort
  • workbench.experimental.requestHidDevice

这些命令将提示用户选择一个设备。每个命令都接受一个设备过滤器列表作为其参数。例如:

import * as vscode from 'vscode';

await vscode.commands.executeCommand('workbench.experimental.requestUsbDevice', {
  filters: [
    { vendorId: 0x404 } // Your custom filter or empty if you want users to select any device
  ]
});

命令完成后,您的扩展程序可以使用常规的Web API访问用户已授予访问权限的任何设备:

const devices = await navigator.usb.getDevices();
// Do something with devices

所有正常的网络设备API都应该可以工作,除了那些需要向用户显示UI元素的API,例如requestDevice

目前,此功能仅在网页上有效,并且仅支持Chrome和Edge浏览器。此外,请记住此功能仍处于实验阶段,因此我们可能会对其设计进行迭代。尝试一下并分享您的反馈!

工程

Electron 18 更新

在这个里程碑中,我们完成了将Electron 18捆绑到VS Code桌面的探索,我们要感谢所有在Insiders上进行自我托管的人员。此更新附带了Chromium 100.0.4896.160和Node.js 16.13.2

文档

TypeScript 编辑和重构

有两个新主题专注于在VS Code中的TypeScript 编辑重构。在那里,您将了解特定功能,如内嵌提示CodeLens和特定于TypeScript的格式化选项,以及可用的代码重构

显著的修复

  • 109565 使用大写锁定键切换输入源时,终端始终显示大写字母
  • 146491 活动和非活动菜单之间的颜色差异丢失
  • 149538 在中国无法登录Microsoft或GitHub账户
  • 149890 无法将项目拖动并放置到空的树视图中
  • 150934 RPM 不应将捆绑的库列为“提供”
  • 151158 在保存笔记本时保留未命名笔记本中选定的内核
  • 151664 提高使用屏幕阅读器逐步执行代码时的公告效率
  • 151739 在首次回复评论线程时,workbench.action.submitComment 无法正常工作,并且在编辑评论时令人困惑
  • 152067 仅在评论展开时显示评论线程范围
  • 152141 当进程退出时丢弃任务状态
  • 152642 添加了一个按钮,可以一键移除监视表达式

感谢您

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

Web扩展

扩展作者为启用作为web extensions运行代码的扩展(以下列表为2022年6月7日至7月4日之间):

问题跟踪

对我们问题跟踪的贡献:

拉取请求

vscode 的贡献:

vscode-generator-code 的贡献:

vscode-js-debug 的贡献:

vscode-pull-request-github 的贡献:

debug-adapter-protocol的贡献:

devcontainers/cli的贡献: