2021 年 4 月(版本 1.56)
更新 1.56.1:此更新解决了这些安全问题。
更新 1.56.2:此更新解决了这些问题。
下载:Windows:x64 Arm64 | Mac:通用 Intel Apple 芯片 | Linux:deb rpm tarball Arm snap
欢迎来到 Visual Studio Code 2021 年 4 月版。VS Code 团队本月一直在忙于一些耗时较长的更新,请查看预览功能部分,了解即将推出的功能。以下是此版本的一些亮点:
- 改进的悬停反馈 - 帮助您快速找到可点击的编辑器操作。
- 终端配置文件改进 - 创建自定义默认终端配置文件。
- 调试器内联值 - 在调试会话期间以内联方式显示变量值。
- Notebook KaTeX 支持 - 在 Notebook Markdown 单元格中支持数学公式。
- 开发容器卷视图 - 管理 Docker 容器中已挂载的卷。
- winget 安装 - VS Code 可通过 Windows 包管理器获取。
- 新的入门视频 - VS Code 入门以及使用 C++ 的视频。
- 终端标签页预览 - 初步了解如何使用新的标签页视图管理打开的终端。
如果您想在线阅读这些发行说明,请访问 code.visualstudio.com 上的更新页面。
加入我们的直播,参加 VS Code 团队于太平洋时间 5 月 11 日星期二上午 8 点(伦敦时间下午 4 点)举行的直播,观看此版本新功能的演示,并向我们提问。
内测版:想尽快尝试新功能?您可以下载每晚的内测版构建,并尽快尝试最新的更新。
工作台
改进的操作悬停反馈
我们更改了工作台各处操作的鼠标悬停反馈,以提供更好的可点击操作用户体验。
无标题编辑器提示
我们注意到许多新用户不知道需要设置语言才能获得完整的 VS Code 语言支持。为了解决这个问题,我们为无标题编辑器引入了一个提示,以帮助用户设置正确的语言模式。无标题提示可能对高级用户没有帮助,因此它会在您开始键入时立即消失,或者您可以选择不再显示以永不再次显示该提示。
默认自定义编辑器和 Notebook 解决方案
如果您有两个编辑器都声明它们应该是某个资源的默认编辑器(例如,一个图像查看器和一个图像编辑器),您将收到一个提示来解决冲突。
在下面的短视频中,用户打开了一个 PNG 文件,该文件与两个编辑器相关联。通知允许用户继续使用 Luna Paint 图像编辑器或配置新的默认编辑器,用户选择后者并开始使用二进制十六进制编辑器。
更新的自定义对话框
我们更新了自定义对话框样式,您可以通过 "window.dialogStyle": "custom"
启用。VS Code 现在会使背景变暗,以便更好地聚焦对话框,并且在有多个操作时还会使用辅助按钮样式。
产品图标主题:Fluent Icons
您可以通过使用以下颜色标记来主题化辅助按钮样式
button.secondaryBackground
button.secondaryForeground
button.secondaryHoverBackground
仅自动更新已启用的扩展
您现在可以配置 VS Code 仅自动更新当前已启用的扩展。
终端
配置文件改进
在上一个迭代中,我们引入了终端配置文件。终端现在支持使用 terminal.integrated.defaultProfile.<platform>
设置来设置默认配置文件。
配置文件系统还增加了环境和图标支持。
"terminal.integrated.profiles.windows": {
"PowerShell": {
"source": "PowerShell",
"overrideName": true,
"icon": "terminal-powershell",
"env": {
"TEST_VAR": "value"
}
}
},
"terminal.integrated.defaultProfile.windows": "PowerShell",
将来,这些设置是切换默认终端配置的推荐方式,并且 terminal.integrated.shell
和 terminal.integrated.shellArgs
设置已被弃用。
新的终端选择器
配置文件和设置快捷方式已从下拉菜单中移出,并移入一个新的+按钮,带下拉菜单。
这也支持根据非默认配置文件创建新的分屏终端。
新的按键绑定
此版本中终端有几个新的默认按键绑定:
- 移动到上一个终端 -
Ctrl+PageUp
(macOSCmd+Shift+]
) - 移动到下一个终端 -
Ctrl+PageDown
(macOSCmd+shift+[
) - 聚焦终端标签页视图 -
Ctrl+Shift+\
(macOSCmd+Shift+\
) - 终端标签页预览
和往常一样,这些默认按键绑定可以通过按键绑定系统移除或添加自定义按键绑定。
Linux 选区粘贴命令
新命令 workbench.action.terminal.pasteSelection
在 Linux 上可用,用于从选区剪贴板粘贴到终端。
终端工作区 shell 权限已更改
为了支持与配置文件相关的传入更改,如果终端设置存在于 .vscode/settings.json
中的提示已被移除,取而代之的是一个用于选择使用工作区设置的设置。请注意,这在不受信任的工作区中可能存在危险。
"terminal.integrated.allowWorkspaceConfiguration": true
当工作区信任默认启用时,我们将移除此设置并使用该系统。
任务
升级后移除任务 0.1.0
任务 2.0.0 已可用并运行良好超过三年,任务 0.1.0 在此期间一直被弃用。鉴于我们无 Node.js 渲染器的目标,任务 0.1.0 已被删除,而不是被带入无 Node.js 的世界。当您打开包含 0.1.0 任务的文件夹时,它们将自动升级到 2.0.0 版本。
终端标签页中无“任务”前缀
当使用新的终端标签页功能时,终端名称将不再添加“任务”前缀。相反,任务将由“工具”图标指示,以更好地利用可用空间。
更好地匹配 eslint-stylish
$eslint-stylish
问题匹配器更准确地匹配多行问题。
调试
断点视图改进
数据断点显示访问类型
对于数据断点,VS Code 现在在“断点”视图中其名称旁边显示访问类型(“读取”、“写入”或“访问”)。
更好的异常断点状态/错误报告
对于异常断点,VS Code 现在在“断点”视图中显示其单独的验证状态和详细原因。如果异常断点无法验证(例如,因为其条件包含语法错误),它将显示为灰色,并且在悬停时会显示相应的错误消息。
其他 UI 改进
停止和断开连接命令的替代行为
调试会话通常通过调试: 停止和调试: 断开连接命令停止。如果调试会话类型为 launch
,则“停止”命令不仅会停止会话,还会终止被调试程序。对于 attach
类型调试会话,有一个“断开连接”命令,它会停止调试并恢复被调试程序的执行。
在此版本中,现在可以通过在调试工具栏中触发命令时按住 Alt
修饰键来反转此行为。更改此行为使得 launch
类型调试会话可以保持被调试程序运行,并终止 attach
类型调试会话中的被调试程序。除了将 Alt
与默认命令一起使用外,还可以从命令面板中访问调试: 停止和调试: 断开连接命令,适用于 launch
和 attach
调试会话。
此替代行为仅适用于已选择启用此功能的调试扩展。
安装缺失调试扩展的流程改进
如果用户想开始调试但尚未安装提供调试支持的必要语言扩展(如 Python 或 Java),我们改进了流程。发生这种情况时,VS Code 现在会提示用户安装相应的扩展。
调用堆栈列停止指示器
每当被调试程序在某一行停止时,VS Code 现在都会渲染调用堆栈列指示器。这有助于识别程序当前停止在该行的哪个位置。
某些语言默认内联值
VS Code 的调试器 UI 支持内联值,用于在逐行执行源代码时在编辑器中内联显示变量值。此功能基于 VS Code 核心的通用实现,因此可能并非适用于所有语言,甚至有时会显示不正确的值,因为通用方法不理解底层源代码语言。因此,此功能默认未启用。
借助新的调试器扩展 API,语言扩展现在可以提供正确的内联值支持,我们默认启用改进的内联值功能。
要启用此功能,debug.inlineValues
设置有一个新的(默认)值 auto
。当设置为 auto
时,对于支持“改进内联值”的语言,内联值将自动启用。
Java 调试器扩展是首批采用该 API 的调试器扩展之一。在下面的截图中,Java 变量的精确值显示在其使用位置旁边。
您可以使用 PowerShell 内联值支持扩展在调试 PowerShell 脚本时获取内联值。
断点处显示调试视图
debug.openDebug
设置的默认值现在是 openOnDebugBreak
,因此在每次命中断点时,VS Code 将打开调试视图。调试视图也会在首次会话启动时显示。
JavaScript 调试
和往常一样,完整的更改列表可以在 vscode-js-debug 更新日志中找到。
改进的断点诊断工具可发现性
根据启发式算法,如果 VS Code 检测到用户可能在断点绑定方面遇到问题,它将显示一条通知,建议打开断点诊断工具。
此提示最初只会对一部分用户可见,因为我们正在测试其有效性和坚定性。
私有类字段支持
私有类字段现在在调试器中可见并可检查。
Notebook
切换行号
您现在可以从单元格工具栏暂时切换当前会话中单元格的行号,或者通过 notebook.lineNumbers
设置更改所有 Notebook 的行号可见性。
按文件类型设置单元格工具栏位置
单元格工具栏的位置现在可以通过 notebook.cellToolbarLocation
设置按文件类型自定义。例如,您可以将 GitHub 问题 Notebook 的单元格工具栏放在右侧,但将其放在 Jupyter Notebook 的左侧。
Markdown 单元格中的数学支持
您现在可以在 Notebook Markdown 单元格中使用数学公式。
VS Code 使用 KaTeX 来渲染公式。有两种方法可以将数学公式嵌入 Markdown 单元格:
- 使用单个美元符号:
$...$
。这会创建一个内联数学公式。 - 使用双美元符号:
$$...$$
。这会创建一个居中、块状的数学公式。
我们使用一个仍在开发中的实验性 Notebook 标记渲染 API 实现了数学支持。我们使用此 API 的最终目标是也允许扩展在 Notebook 中扩展 Markdown 的渲染。
语言
Markdown 预览排版支持
新的 markdown.preview.typographer
设置允许您在内置 Markdown 预览中启用智能引号和简单的排版替换。
在下面的示例中,Markdown 文本(例如 (c)
)在预览中会自动替换为版权符号 ©
。
markdown.preview.typographer
设置默认禁用。
更多文件被识别为 shell 脚本
具有 .xsession
和 .xprofile
文件扩展名的文件将自动识别为 shell 脚本。
预览功能
终端标签页
终端中的标签页作为预览功能可用,可以通过以下设置启用:
"terminal.integrated.tabs.enabled": true
启用后,新的标签页视图默认只在至少有两个终端时显示。对于单个终端,标签页会“内联”到面板标题中,如下所示:
每个标签页都通过上下文菜单支持多个操作。
分屏和关闭终端在悬停时可用。
我们试图使新标签页的行为与资源管理器的工作方式保持一致。以下是一些其他行为:
- 双击空白区域将创建一个新终端。
- 双击分割条将在显示所有标题而不截断的“理想”大小和仅显示图标的窄视图之间切换标签页视图宽度。
- 标签页可以使用
terminal.integrated.tabs.location
设置移动到左侧。 - 其他各种配置设置可在
terminal.integrated.tabs
下找到。
终端状态
除了标签页,我们还向终端引入了状态的概念。一个终端可以有多种状态,每种状态都代表终端可以暂时处于的一种状态,其中最高严重性的状态会显示在标签页旁边。状态图标显示在标签页视图中终端标题的右侧。悬停时,会显示状态的详细信息和任何相关操作。
目前,支持以下状态:
- 需要重新启动:如果扩展想要更改终端的环境,则使用警告图标状态。
- 已断开连接:当终端与其进程失去连接时,使用插头图标状态。
- 响铃:当通过
terminal.integrated.enableBell
设置启用响铃且终端响铃触发时,会出现一个响铃图标。
我们计划尽快支持任务状态,以便即使不激活标签页也能一目了然地看到任务运行状态。
欢迎页演练
我们已扩展 walkthroughs
贡献点,用于在“入门”页面放置内容,以允许在步骤描述和步骤主要内容中使用 Markdown。扩展对“入门”页面的贡献是一个实验性功能,可以通过 "workbench.welcomePage.experimental.extensionContributions": true,
启用。
下面的短视频展示了一个示例演练,以向用户介绍 Luna Paint 扩展。
活动栏和面板中的自定义悬停支持
在此里程碑中,我们增加了对活动栏和面板中自定义悬停的实验性支持。您可以使用 workbench.experimental.useCustomHover
设置启用自定义悬停。
主题:GitHub 亮色主题 产品图标主题:Fluent Icons
远程仓库 (RemoteHub)
作为此版本的一部分,我们正在预览一个新的内置扩展,远程仓库 (RemoteHub),它允许您直接在 VS Code 中即时浏览、搜索、编辑和提交到任何 GitHub 仓库,而无需克隆或在本地拥有该仓库。它目前仅在 VS Code 的 Insiders 版本中可用。
入门
要开始使用,请从命令面板运行打开远程仓库...命令。从那里,您可以粘贴任何 GitHub URL,或者选择搜索特定的仓库或拉取请求。
输入 URL 或选择仓库或拉取请求后,VS Code 将为该仓库打开一个新的工作区。状态栏左侧的远程状态指示器显示了远程仓库连接的远程提供者名称,例如 GitHub。
功能
- 无需克隆或在本地拥有仓库即可即时打开任何 GitHub 仓库。
- 轻松编辑并贡献到任何 GitHub 仓库——直接将您的更改提交到 GitHub,或打开一个拉取请求。
- 在另一个环境中继续——通过继续...命令(可从命令面板或远程指示器快速选择菜单访问)。
- 在本地克隆仓库
- 将仓库克隆到容器中——需要 开发容器扩展
- 提供与在本地仓库上工作类似的熟悉用户界面(*参见下面的“限制”)。
- 资源管理器 - 打开、复制、移动、重命名和删除文件和文件夹
- 搜索 - 快速全文搜索*
- 源代码管理 - 暂存和提交您的更改,以及许多其他源代码管理操作
- 时间线视图 - 查看带有差异支持的文件历史记录
- 快速打开 - 快速查找要打开的文件
- 远程指示器 - 显示远程仓库连接到的提供者(例如 GitHub)
- 同时在不同分支上工作——每个远程分支都被视为一个单独的工作树(在 Git 术语中),这意味着您所做的任何更改都将隔离到该分支。您无需暂存更改即可切换到新分支以检出 PR 或开始新的工作项。当您返回到上一个分支时,您的更改仍将保留在那里。
- 安装 GitHub 拉取请求和问题扩展,并快速查看、探索和检出拉取请求,查看并开始处理问题。
限制
- 有限的语言智能 - 许多语言服务器尚不理解这种虚拟化环境。TypeScript 支持远程仓库的单文件智能。
- 有限的扩展支持 - 与语言服务器一样,许多扩展不适用于远程仓库。扩展可以选择退出,并且不会在虚拟工作区中激活。有关更多详细信息,请参见下面的扩展创作部分。
- 搜索 - 全文搜索需要预先构建的索引才能进行精确文本匹配,否则将回退到 GitHub 的模糊默认分支本地搜索。
- 终端 - 不支持。任何打开的终端都将在您的本地文件系统上。
- 调试 - 不支持。
- 任务 - 不支持。
告诉我们您的想法
我们非常高兴您能试用远程仓库 (RemoteHub),并期待您的想法和反馈。我们才刚刚开始这段旅程,因此随着我们继续开发,功能集将会增加,限制将会减少。我们还将扩展支持的提供者集。GitHub 只是我们支持的第一个提供者,Azure Repos 即将推出。
TypeScript 4.3
此版本继续改进我们对即将发布的 TypeScript 4.3 版本的支持。您可以在 TypeScript 博客上阅读有关 TypeScript 4.3 中新语言功能和改进的更多信息。以下是它启用的一些编辑器改进:
- 支持
override
。还提供了添加override
关键字的快速修复。 - 导入语句补全。这类似于自动导入,只是您是在导入语句本身中键入。
- JSDoc
@link
标签支持。
要开始使用 TypeScript 4.3 每夜构建版本,只需安装 TypeScript 每夜版扩展。请分享您的反馈,如果您遇到 TypeScript 4.3 的任何错误,请告诉我们。
工作区信任
在上一个里程碑的发布说明中,我们分享了我们专门针对扩展作者在工作区信任方面的工作。在此里程碑中,我们在扩展 API 和用户体验方面都取得了巨大进展。话虽如此,此版本的工作区信任仍将保持禁用状态,但我们非常希望您能试用并提供反馈。
您可以使用以下设置启用此功能:security.workspace.trust.enabled
。启用后,在 VS Code 中打开文件夹时,您将看到以下对话框。
此对话框对于允许用户尽早做出决定并理解其决定的影响非常重要。一旦您了解该功能,您可能希望使用 security.workspace.trust.startupPrompt
设置来自定义何时显示对话框。
您可以关注工作区信任的开发,并在 问题 #106488 中提供反馈。
对扩展的贡献
远程开发
远程开发扩展的工作仍在继续,它们允许您使用容器、远程机器或 适用于 Linux 的 Windows 子系统(WSL)作为功能齐全的开发环境。
1.56 版本的功能亮点包括:
- 当您在容器卷中克隆仓库时,新的卷视图。
- 连接到远程时本地终端警告。
- 使用开发容器扩展启动时提示安装 Docker Desktop。
您可以在 远程开发发布说明中了解新的扩展功能和错误修复。
GitHub 拉取请求和议题
GitHub 拉取请求和问题扩展的工作仍在继续,它允许您处理、创建和管理拉取请求和问题。
要了解所有新功能和更新,您可以查看扩展的 0.26.0 版本的完整更新日志。
扩展创作
定义您的扩展是否支持虚拟工作区
新的远程仓库扩展允许您直接从 GitHub 打开包含内容的文件夹。它通过提供一个虚拟文件系统并在其上打开一个工作区来实现。其他扩展也这样做。它们从 FTP 服务器、云存储或数据库提供内容,并将其无缝地作为文件提供给 VS Code 中的用户。
虚拟文件系统功能已经存在一段时间了,但是我们观察到并非所有扩展都支持在虚拟工作区中运行,其中工作区文件在磁盘上并不物理存在。因此,我们增加了对扩展的支持,以指示它是否支持在虚拟工作区中运行。当扩展选择退出时,VS Code 将不会为虚拟工作区激活它,并且用户不会看到来自此扩展的错误。
扩展在 package.json
中选择退出虚拟工作区设置,如下所示:
{
"capabilities": {
"virtualWorkspaces": false
}
}
目标是让尽可能多的扩展支持在虚拟工作区中运行。但是,这并非总是可能的,特别是当扩展使用假定文件物理存在的组件时。虚拟工作区指南记录了扩展如何支持虚拟工作区。
行动号召:请检查您的扩展是否可以处理虚拟工作区,并相应地在您的 package.json
中设置 virtualWorkspaces
功能。
在扩展采用新的 virtualWorkspaces
属性之前,会有一个过渡期。在此之前,我们维护一个内部列表,列出我们认为应将 virtualWorkspaces
功能设置为 false
的扩展。这是基于分析扩展是否正在使用 Node.js fs
模块并因此直接访问文件系统而进行的。然而,扩展作者更能评估扩展是否支持 virtualWorkspaces
功能。为了跟踪采用情况,我们创建了以下跟踪问题 #122836。如果您的扩展在列表中并且您已采用 virtualWorkspaces
功能,请在上述问题中添加评论。
远程指示器菜单
扩展现在可以向远程指示器菜单贡献内容。
statusBar/remoteIndicator
菜单贡献点将命令添加到远程指示器菜单。
"contributes": {
"menus": {
"statusBar/remoteIndicator": [
{
"command": "remote-wsl.newWindow",
"when": "!remoteName && isWindows",
"group": "remote_10_wsl_0_local@1"
}
]},
"commands": [
{
"command": "remote-wsl.newWindow",
"title": "New WSL Window",
"category": "Remote-WSL"
}
]
}
为了允许菜单根据提供者对条目进行排序,group
需要遵循特定的语法:
对于远程命令:remote_${orderOfGroups}_${remoteName)_${internalGrouping}@${orderInGroup}
对于虚拟文件系统命令:virtualfs_${orderOfGroups}_${fileScheme)_${internalGrouping}@${orderInGroup}
orderOfGroups
是一个用于排序组的两位数。remoteName
是 remoteAuthority 的第一部分(wsl、ssh 等)。fileScheme
是虚拟文件系统的 URI 方案。internalGrouping
供每个贡献点自由使用。orderInGroup
用于对组内的条目进行排序。
示例:remote_10_wsl_1-open@1
大多数 Webview 现在使用 iframe
自 Webview API 首次引入以来,我们一直使用 Electron 的 webview 标签来实现 Webview。然而在 Web 上,VS Code 的 Webview 则是使用标准的 <iframe>
元素实现的,因为 <webview>
不可用。
我们一直在探索将桌面版 VS Code 迁移到使用 <iframe>
支持的 Webview,因为此更改将为扩展在桌面和 Web 之间提供更一致的 Webview 环境。从 <webview>
迁移还将有助于我们的 Electron 沙盒化工作。
在此迭代中,我们已将大多数 Webview 切换为使用 iframe。<webview>
标签现在仅用于启用“查找”小组件的 Webview,我们计划在更多工程工作后也将其迁移到使用 iframe。
此更改不应引起问题,但在某些特殊情况下,<iframe>
和 <webview>
元素的行为有所不同。请务必对您的扩展进行快速测试,以验证一切是否按预期工作。
更轻松地检查 Webview
<iframe>
支持的 Webview 的一个明显好处是,现在它们更容易检查。
如果您之前使用过 Webview,您可能记得必须使用开发人员:打开 Webview 开发工具命令来检查您的 Webview 内容。这会为您的 Webview 打开一个新的开发工具面板。
使用 <iframe>
支持的 Webview,您可以使用 VS Code 的标准开发工具(开发人员:切换开发人员工具)来检查 Webview。
这使得检查多个 Webview 变得容易。当您的 Webview 关闭时,开发工具也不再关闭。
此外,Webview 内部发生的异常和控制台消息现在会在顶级开发工具控制台中打印。
您还可以使用开发工具在 Webview 的上下文中评估表达式。使用开发人员:切换开发人员工具打开 VS Code 的开发工具后,打开控制台,然后从上下文选择器中选择您的 Webview 的 active-frame
。
总的来说,能够使用 VS Code 的标准开发工具应该会为 Webview 提供更好的开发体验。
CodeActionTriggerKind
CodeActionContext
上的新 triggerKind
属性跟踪从 CodeActionProvider
请求 Code Action 的原因。此属性的可能值是:
Invoke
- 通过键盘快捷键或命令显式请求 Code Action。Automatic
- 未经用户明确操作而请求 Code Action。这包括当文档内容更改时请求 Code Action。
提供者可以使用 triggerKind
返回不同的结果集,具体取决于请求 Code Action 的方式。例如,自动触发的重构 Code Action 提供者可能只返回精确当前选择的重构,以限制 Code Action 灯泡的显示频率。但是,当显式请求 Code Action 时,同一提供者可能会自动扩展当前选择,以尝试显示用户在当前位置可能感兴趣的所有重构。
更新的 codicons
我们已将以下新图标添加到我们的 codicon 库中:
arrow-swap
copy
debug-line-by-line
filter-filled
person-add
terminal-bash
terminal-cmd
terminal-debian
terminal-linux
terminal-powershell
terminal-tmux
terminal-ubuntu
wand
按键绑定标签颜色
当命令关联有按键绑定时,会显示按键绑定标签。按键绑定标签的使用包括(但不限于):
- 命令面板
- 键盘快捷方式编辑器
- 键盘快捷方式录制器模态窗口
- 扩展市场页面的“功能贡献”部分
以下自定义可用:
keybindingLabel.background
:按键绑定标签背景色。按键绑定标签用于表示键盘快捷方式。keybindingLabel.foreground
:按键绑定标签前景色。按键绑定标签用于表示键盘快捷方式。keybindingLabel.border
:按键绑定标签边框颜色。按键绑定标签用于表示键盘快捷方式。keybindingLabel.bottomBorder
:按键绑定标签下边框颜色。按键绑定标签用于表示键盘快捷方式。
工作区信任扩展 API
在上一个里程碑,我们提到了我们一直在进行的工作区信任功能。我们请扩展作者关注 问题 #120251 以获取更新,我们仍在继续。以下信息和更新也可以在该问题中找到。
在此里程碑中,我们将工作区信任扩展 API 从提议状态转移到稳定状态。这使我们能够发布将您的扩展引入工作区信任的指南初稿。API 很小,因此这里快速浏览一下。
您可以使用 package.json
中的 untrustedWorkspaces
功能声明您的扩展在不受信任的工作区中提供完整、部分或不支持。
以下示例声明扩展在不受信任的工作区中完全受支持。在这种情况下,扩展在不受信任的工作区中启用。
"capabilities": {
"untrustedWorkspaces": {
"supported": true
}
}
下一个示例声明扩展在不受信任的工作区中不受支持。在这种情况下,扩展在不受信任的工作区中禁用。
"capabilities": {
"untrustedWorkspaces": {
"supported": false
}
}
第三个选项是声明 limited
支持。当您选择 limited
选项时,会向您提供三个工具。
首先,如果您有一个可以在工作区中配置但需要工作区受信任才能应用工作区值的设置,那么您可以使用 untrustedWorkspaces
对象中的 restrictedConfigurations
数组属性包含该设置。这样做,当您的扩展使用 VS Code 的 工作区配置 API 读取这些设置值时,VS Code 将忽略这些受限设置的工作区值。
以下示例声明了在不受信任的工作区中受限的设置。
"capabilities": {
"untrustedWorkspaces": {
"supported": "limited",
"restrictedConfigurations": [
"markdown.styles"
]
}
}
接下来,您还可以使用以下 API 以编程方式检查和监听当前工作区是否受信任:
export namespace workspace {
/**
* When true, the user has explicitly trusted the contents of the workspace.
*/
export const isTrusted: boolean;
/**
* Event that fires when the current workspace has been trusted.
*/
export const onDidGrantWorkspaceTrust: Event<void>;
}
最后,您可以在您的 when
子句中使用 isWorkspaceTrusted
上下文键声明性地隐藏命令或视图。
行动号召:请查看 问题 #120251 中的“工作区信任扩展指南”,并为您的扩展相应地设置 untrustedWorkspaces.supported
值。
建议的扩展 API
每个里程碑都会带来新的提议 API,扩展作者可以尝试使用它们。一如既往,我们希望得到您的反馈。要尝试提议的 API,您需要执行以下操作:
- 您必须使用 Insiders 版本,因为提议的 API 经常更改。
- 您的扩展的
package.json
文件中必须包含以下行:"enableProposedApi": true
。 - 将最新版本的 vscode.proposed.d.ts 文件复制到您项目的源位置。
您不能发布使用提议 API 的扩展。下个版本中可能会有破坏性更改,我们绝不希望破坏现有扩展。
原生 Notebook
我们正在准备原生 Notebook API 的大部分内容以进行最终确定。我们已经进行了许多小的调整以及一些重大更改。
Notebook 序列化器
我们添加了 NotebookSerializer
API。它提供了一种将“字节”转换为 NotebookData
反之亦然的简化方法。当您实现此 API 时,您的 Notebook 将免费获得备份、恢复、脏状态等功能。我们建议扩展作者采用此新 API,而不是使用以前基于内容提供者的 API。
Notebook 控制器
Notebook 控制器 API 取代了内核提供者 API。Notebook 控制器提供 Notebook 的执行引擎,创建 Notebook 输出。Notebook 可以提供多个控制器或不提供,VS Code 允许用户选择控制器。作为回报,扩展可以根据其领域模型的需求自由创建、修改和移除控制器。
Notebook 单元格状态栏
NotebookCellStatusBarItemProvider
API 取代了 createCellStatusBarItem
方法。它使扩展能够向每个单元格编辑器底部状态栏贡献带有标签、图标和命令的项。它遵循与许多其他 VS Code 扩展 API 相同的提供者模式。
测试
我们原计划本月最终确定新测试 API 的一个子集,但我们专注于改进并将最终确定推迟到下个月,相关进展可在 问题 #122208 中跟踪。此迭代中进行的 API 更改主要包括:
TestProvider
已重命名为TestController
,其方法也相应重命名。TestItem
现在是通过vscode.test.createTestItem
调用的托管对象。- 测试结果现在通过标准的
vscode.test.createTestResults
方法创建,该方法可以在TestController.runTests
内部或外部调用。
随着这些更改,还增加了一些其他功能,例如显示原始测试输出的能力以及扩展指示加载测试时错误的能力。我们相信这些更改为未来的额外功能提供了坚实的基础,并与我们现有的扩展 API 更紧密地对齐。
我们还创建了一个 测试适配器转换器扩展,它允许任何与现有 测试资源管理器 UI 扩展一起工作的适配器自动插入到原生 VS Code 测试中。转换器扩展今天可以手动安装,很快它将与测试资源管理器 UI 集成,为现有用户和适配器提供无缝迁移到原生测试的路径。
改进了 ArrayBuffer 与 Webview 之间传输
在当前版本的 VS Code 中,将类型化数组发送到 Webview 或从 Webview 发送类型化数组存在一些怪癖:
- 类型化数组,例如
UInt8Array
,的序列化效率非常低。当您需要传输数兆字节的数据时,这可能会导致性能问题。 - 发送的类型化数组在接收端不会以正确的类型重新创建。如果您发送一个
UInt8Array
,接收方反而会得到一个具有UInt8Array
的数据值的通用对象。
尽管这两个问题都是错误,但如果不破坏依赖现有行为的扩展,我们也无法修复它们。同时,新编写的扩展没有任何理由需要当前的混乱和低效行为。
因此,我们决定为现有扩展保留现有行为,但让新扩展采用更正确的行为。这是通过查看您的扩展的 package.json
中的 engines
来实现的。
"engines": {
"vscode": "^1.57.0",
}
如果扩展目标是 VS Code 1.57+,那么类型化数组应该在接收端重新创建,并且大型类型化数组与 Webview 之间的传输效率应该更高。
请测试此行为,并告知我们它是否不按预期工作或对您现有代码造成意外的回归。
TerminalOptions.message
这项新提案允许扩展在进程启动之前在终端中显示一条消息。
vscode.window.createTerminal({
message: '\x1b[3;1mSome custom message\x1b[0m'
});
调试适配器协议
异常断点与常规断点更好地对齐
setExceptionBreakpoints
请求现在可以选择返回一个 Breakpoint
的数组,类似于其他 set*Breakpoints
请求。这允许客户端显示单个异常断点或过滤器的验证错误消息。从本版本开始,VS Code 在“断点”视图中显示这些错误。
重启请求现在可以获取调试配置更改
restart
请求现在接受一个新的可选参数 arguments
,客户端可以在其中传递启动或附加配置的最新版本。通过此新增功能,调试适配器可以使用调试配置中的最新值重新启动会话。
断开调试器连接并保持被调试程序挂起
disconnect
请求用于结束调试会话,并可以选择继续执行被调试程序或终止它。有一个新选项可以在调试器断开连接后保持被调试程序处于挂起状态。这使得可以使用新的会话继续调试。
实现此功能的调试适配器必须通过 supportSuspendDebuggee
功能声明其支持。客户端可以通过向 disconnect
请求传递新的可选参数 suspendDebuggee
来使用该功能。
工程
Electron 12 更新
在此里程碑中,我们完成了将 Electron 12 捆绑到 VS Code 中的探索,感谢所有参与 Insiders 版本测试和自托管的人员。这是 Electron 的一个主要版本,包含 Chromium 89.0.4389.114 和 Node.js 14.16.0。
Electron 沙盒进展
在此里程碑中,我们继续使 VS Code 窗口准备好启用 Electron 的 沙盒和 上下文隔离功能。
具体来说:
- 我们更改了沙盒化渲染器中访问 VS Code 窗口所需的所有环境变量。
- 我们正在探索切换到
iframe
元素来代替webview
用于自定义编辑器,方法是在可能的情况下选择性地启用iframe
。 - 我们能够将渲染器中的一些原生模块或 Node.js 要求移动到其他进程或完全移除它们。
- 我们使
windows-process-tree
具有上下文感知能力。
Webview 现在使用 Service Worker 加载资源
在桌面版 VS Code 中,Webview 现在使用 Service Worker 加载本地资源。Web 版 VS Code 一直为此使用 Service Worker,但以前桌面版 VS Code 使用的是 Electron 协议。
在桌面版本中使用 Service Worker,使我们能够更好地对齐桌面和 Web 之间 Webview 的行为。它还帮助我们修复了一些棘手的错误,并使我们能够删除大约 1000 行代码。
虽然此更改不应影响大多数 Webview 扩展,但它可能在一些边缘情况下导致问题:
-
对 Webview 如何加载资源进行假设的扩展
如果您的扩展直接使用
vscode-webview-resource:
协议或硬编码关于资源 URI 的其他假设,它可能不再工作。相反,请确保始终使用
.asWebviewUri
为资源创建 URI。另请记住,返回的 URI 格式将来可能会更改。 -
将 iframe 的
src
设置为指向磁盘上 HTML 文件的扩展Service Worker 无法看到此请求,因此我们不再支持此功能。Web 上已经如此,我们认为这种模式并不常见。
推荐的修复方法是不使用 iframe,而是将 HTML 文件的内容内联到 webview 中。
代码库中未启用隐式重写
即将发布的 TypeScript 4.3 版本新增了一个 override 关键字,它告诉编译器子类中的方法重写了其超类中的方法。还有一个新的 --noImplicitOverride
标志,强制所有重写超类方法的方法都必须使用 override
关键字。
class Foo {
foo() {...}
}
class SubFoo extends Foo {
foo() { ... } // Error when noImplicitOverride is enabled: missing override specifier
}
override 关键字有一些好处:
-
在阅读代码时,它会提醒您某个方法正在重写基类中的方法。
-
尝试重写基类中不存在的方法是错误的。这有助于捕获因重命名基类中的方法但忘记更新子类中的方法名称而导致的错误。
在此迭代中,我们在代码库中采用了 override 关键字,并为核心 VS Code 和所有内置扩展启用了 --noImplicitOverride
。虽然我们自动化了大部分工作,但此更改确实帮助我们捕获了一些代码错误地重新声明属性或具有不明确继承模式的情况。
这项新的严格性规则也应有助于我们未来捕获一些常见的编程错误。
Windows 安装程序已整合到 Windows 程序包管理器中
我们更新了我们的 Windows 程序包管理器发布管道,以发布我们的 arm64
用户和系统安装程序,并采用 v1 包清单架构,使我们能够将 x86
、x64
和 arm64
的用户和系统安装程序整合到一个清单中。用户可以通过在安装包时使用 --scope
参数,或使用 winget CLI 设置来选择用户和系统安装程序。
文档
更新的入门视频
VS Code 的入门视频已更新。这些视频涵盖了从入门和使用扩展到 VS Code 功能,如调试和版本控制。
新的 C++ 视频
C++ 扩展团队创建了一系列入门视频,解释了如何配置 IntelliSense、构建和调试您的 C++ 项目。
VS Code 背后的故事与技术
您可以在这篇采访中阅读有关 VS Code 历史和底层技术的信息,采访对象是 VS Code 工程师 Ben Pasero。Ben 谈到了 VS Code 的早期发展以及使用 Electron 作为应用程序框架使 VS Code 在 macOS、Windows 和 Linux 上运行的体验。
合作伙伴扩展
Azure 机器学习
Azure 机器学习扩展使您能够为您的机器学习工作流创建和管理强大的云计算资源。凭借其远程功能,您可以无缝地连接到您的计算资源,以安全、可审计和合规的方式。
值得注意的修复
- 108559: RunInTerminal 不使用工作区设置中指定的集成终端的错误
- 118282: 调试器跳过进入 skipFiles
- 118731: 调查如何在异步打开浏览器窗口和标签页时避免 Safari 的弹出窗口阻止器
- 119340: 如果启用未捕获异常断点,则“不调试运行”永不终止
- 121347: 文件从备份恢复时出现乱码
- 119059: 自定义文本编辑器:恢复时备份会打开 2 个编辑器
- 120245: CSS:
!important
补全已损坏 - 120393: 改进 WebGL 上下文丢失的处理
- 120435: 移除
emmet.extensionsPath
的有效路径检查 - 120882: 在资源管理器中粘贴文件不再在编辑器中打开该文件
- 121148: 调试下拉菜单中显示重复的启动配置
- 120277: “在文件中查找”窗格中的水平滚动条太小且滚动方向错误
感谢
最后但同样重要的是,衷心感谢以下本月为 VS Code 做出贡献的人们:
对我们问题跟踪的贡献
- John Murray (@gjsjohnmurray)
- Andrii Dieiev (@IllusionMH)
- Don Jayamanne (@DonJayamanne)
- Simon Chan (@yume-chan)
- T.Y.M.SAI (@tymsai)
- ArturoDent (@ArturoDent)
- Alexander (@usernamehw)
对 vscode
的贡献
- @akosyakov (Anton Kosyakov):修复终端创建和初始大小调整之间的竞态条件 PR #121272
- @alanrenmsft (Alan Ren):修复查找所需节点句柄的问题 PR #118091
- @alexmyczko (Alex Myczko):改进 debian 控制描述 PR #119160
- @aliasliao (Liao Jinyuan):修复 emmet 在 html 文件中错误提示的问题 PR #120480
- @andrewbranch (Andrew Branch)
- [typescript-language-features] 支持 TypeScript 4.3 的导入语句补全 PR #119009
- [html-language-features] 更新用于 4.3 协议的 TS 语言服务调用 PR #120362
- [typescript-language-features] 为导入语句补全添加遥测 PR #121243
- 修复因相邻 @ts-expect-error 导致的 Previewer.plain 调用遗漏 PR #121975
- @anthony-c-martin (Anthony Martin):更新 seti-ui 文件图标 PR #119468
- @arnobl (arno):修复(notebook):重做单元格创建不会重新选择单元格 PR #120086
- @awilkins (Adrian Wilkins):在 Linux 上为集成终端实现选择粘贴 PR #108397
- @benmccann (Ben McCann):修复评论中的问题编号 PR #121758
- @bourdakos1 (Nick Bourdakos):更新 seti 图标 PR #120938
- @CanadaHonk
- [themes] 修复高对比度黑色默认主题中的 JSON 格式 PR #120761
- [themes] 修复高对比度黑色默认主题中的 JSON 格式 (2) PR #120815
- [themes] 修复高对比度黑色默认主题中的 JSON 格式 (3) PR #120841
- @conwnet (netcon):修复:仅当编辑器为只读时才向 textarea DOM 添加只读属性 PR #120503
- @gjsjohnmurray (John Murray)
- 修复 #120485 在没有时间线提供者时从资源管理器上下文菜单中隐藏
Open Timeline
PR #120497 - 修复-120578 未停止时不提供调用堆栈步入/步过/步出 PR #120581
- 修复 #121509 两个 API 命令结果的文档错误 PR #121511
- 修复 #120485 在没有时间线提供者时从资源管理器上下文菜单中隐藏
- @hantatsang (Sang)
- markdown-language-features:修复 Windows 预览链接 Uri PR #120090
- 添加 Emmet 自闭合缩写支持 PR #120311
- @jeanp413 (Jean Pierre)
- 修复 scss 中的 Emmet 补全 PR #118666
- 修复问题窗格忽略
files.exclude
选项的问题 PR #119040 - 修复了 Firefox 中简单浏览器图标损坏的问题 PR #120275
- 修复了分屏设置编辑器 JSON 中水平滚动条过窄的问题 PR #121027
- 修复了无法预览带有特殊字符“#”、“%”或“?”的图像的回归问题 PR #121874
- @Jolg42 (Joël Galeran):重构 npm 扩展以仅使用 npm PR #120317
- @joyceerhl (Joyce Er):为 Notebook markdown 单元格添加缺失的 padding-bottom PR #122505
- @KapitanOczywisty:更新 PHP 语法 PR #120339
- @Kingwl (Wenlu Wang):添加下一个/上一个冲突 PR #97613
- @leemun1 (Mike Lee):功能:为 markdown 添加额外环绕对的支持 (#_119982) PR #121698
- @lf- (Jade):改进扩展配置架构验证错误的报告 PR #120457
- @limitedmage (Juliana Peña):修复显示和隐藏 suggestWidget 的竞态条件 PR #121396
- @LuisPeregrinaIBM2:wsl -l -q,移除标题和默认标记 PR #120382
- @nan0tube (Yongming Lai):将常用来源文件识别为 shell 脚本 PR #121373
- @plainerman (Michael Plainer):添加支持以停用自动更新禁用的扩展 PR #113155
- @PooyaZv (Pooya Vakeely):添加 cuda-cpp 语言 ID、语法和问题匹配器 PR #119444
- @qchateau (Quentin Chateau):格式已修改:格式化带有空格更改的行 PR #119021
- @sdegutis (Steven Degutis):使错误消息更清晰 PR #121339
- @sokolovstas (Stanislav):修复 eslint-stylish 问题匹配器中的文件位置模式 PR #117576
- @solomatov (Konstantin Solomatov):在扩展主机 IPC 超时时终止 PR #122399
- @stoyannk (Stoyan Nikolov):修复了导致扩展配置文件变量名遮蔽的错误… PR #120054
- @timmaffett (Tim Maffett):修复并扩展了调试控制台对大多数 ANSI SGR 代码的支持 PR #120891
- @vinku:Emmet:选择下一个/上一个项目不适用于 script 标签。 PR #118842
- @wdesgardin (William Desgardin):功能:为 markdown 预览添加排版选项 PR #119641
- @yannickowow (Yanis HAMITI):在“断点”视图中显示当前数据断点访问类型 (#_119588) PR #119817
对 vscode-eslint
的贡献
- @JoshuaKGoldberg (Josh Goldberg):实现 eslint.rules.customizations - 带有重写 PR #1164
对 vscode-json-languageservice
的贡献
- @KapitanOczywisty
- @mifieldxu (Mifield):使用 minimatch 改进了 glob 匹配 PR #93
- @ssbarnea (Sorin Sbarnea):升级依赖项 PR #95
对 vscode-vsce
的贡献
对 debug-adapter-protocol
的贡献
- @jarpoole (Jared Poole): ESP-IDF 调试适配器 PR #190
- @vadimcn: 添加对 JSON 模式的直接引用 PR #185
对 vscode-js-debug
的贡献
- @millerds (Darren Miller): Chakracore 字符串支持 PR #979
- @swissmanu (Manuel Alabor): CDP 代理:允许其他扩展重用 CDP 连接 PR #964
对 vscode-generator-code
的贡献
- @felipecrs (Felipe Santos): 从搜索结果中隐藏 dist 文件夹 PR #260
- @miles-crighton (Miles Crighton): 修复:更新令牌检查命令 PR #249
- @noah-vdv (Noah van der Veer): 修复第 162 行的“orther”拼写错误 PR #255