2021 年 4 月(版本 1.56)
更新 1.56.1:此更新解决了这些安全 问题。
更新 1.56.2:此更新解决了这些 问题。
下载:Windows:x64 Arm64 | Mac:通用 Intel 硅 | Linux:deb rpm tarball Arm snap
欢迎使用 Visual Studio Code 的 2021 年 4 月版。本月 VS Code 团队一直在忙于处理一些需要较长时间的更新,所以请查看 预览功能 部分,了解即将推出的功能。以下是本版本中包含的一些亮点。
- 改进的悬停反馈 - 帮助您快速找到可点击的编辑器操作。
- 终端配置文件改进 - 创建自定义的默认终端配置文件。
- 调试器内联值 - 在调试会话期间内联显示变量值。
- 笔记本 KaTeX 支持 - 笔记本 Markdown 单元格中的数学支持。
- 开发容器卷视图 - 管理 Docker 容器内的挂载卷。
- winget 安装 - VS Code 可通过 Windows 包管理器获取。
- 新的入门视频 - 使用 VS Code 入门以及使用 C++ 的视频。
- 终端选项卡预览 - 首次了解使用新的选项卡视图管理打开的终端。
如果您想在线阅读这些发行说明,请访问 更新,网址为 code.visualstudio.com。
加入我们直播,参加 VS Code 团队的直播,时间是太平洋时间 5 月 11 日星期二上午 8 点(伦敦时间下午 4 点),观看演示本版本中的新功能,并现场向我们提问。
内部人员:希望尽快尝试新功能?您可以下载夜间 内部人员 版本,并在新功能可用后立即尝试。
工作区
改进的动作悬停反馈
我们更改了整个工作区中操作的鼠标悬停反馈,以提供围绕可点击操作的更好的 UX。
无标题编辑器提示
我们注意到许多新用户不知道必须设置语言才能获得完整的 VS Code 语言支持。为了帮助解决这个问题,我们为无标题编辑器引入了提示,以帮助用户设置正确的语言模式。无标题提示可能对高级用户没有帮助,因此在您开始键入时它会立即消失,或者您可以选择**不要显示**,以不再显示该提示。
默认自定义编辑器和笔记本解析
如果您有两个编辑器都声明它们应该是您对资源的默认编辑器(例如,图像查看器和图像编辑器),您将收到一个提示来解决冲突。
在下面的简短视频中,用户打开了一个 PNG 文件,该文件与两个编辑器相关联。通知让用户继续使用 Luna Paint 图像编辑器或配置一个新的默认值,他们会这样做并开始使用二进制十六进制编辑器。
更新的自定义对话框
我们更新了我们的自定义对话框样式,您可以通过 "window.dialogStyle": "custom"
启用它们。VS Code 现在会使背景变暗,以便更好地关注对话框,并且在有多个操作时也会使用辅助按钮样式。
产品图标主题:Fluent 图标
您可以 主题 辅助按钮样式,方法是使用以下颜色标记
button.secondaryBackground
button.secondaryForeground
button.secondaryHoverBackground
仅自动更新已启用的扩展
您现在可以将 VS Code 配置为仅自动更新当前已启用的扩展。
主题:GitHub 浅色主题
终端
配置文件改进
在上次迭代中,我们引入了 终端配置文件。终端现在支持使用 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
当工作区信任默认情况下启用时,我们将删除此设置并使用该系统。
任务
删除带有升级的 Task 0.1.0
Task 2.0.0 已可用并运行良好三年多,并且 Task 0.1.0 在那段时间内一直被弃用。鉴于我们的 无 Node.js 渲染器 目标,Task 0.1.0 已被删除,而不是被带入无 Node.js 的世界。当您打开包含 0.1.0 任务的文件夹时,它们将自动为您升级到版本 2.0.0。
终端选项卡中没有“Task”前缀
当使用新的 终端选项卡 功能时,将不再在终端名称中添加“Task”前缀。相反,任务由“工具”图标表示,以更好地利用可用空间。
更好地与 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.lineNumbers
设置更改所有笔记本的行号可见性。
每个文件类型的单元格工具栏位置
单元格工具栏位置现在可以通过 notebook.cellToolbarLocation
设置针对每个文件类型进行自定义。例如,您可以将单元格工具栏放在 GitHub 问题 笔记本的右侧,但将其放在 Jupyter 笔记本的左侧。
Markdown 单元格中的数学支持
您现在可以在笔记本 Markdown 单元格中使用数学方程式
VS Code 使用 KaTeX 来渲染方程式。有两种方法可以将数学方程式嵌入 Markdown 单元格
- 使用单个美元符号:
$...$
。这将创建一个内联数学方程式。 - 使用双美元符号:
$$...$$
。这将创建一个居中的块数学方程式。
我们使用实验性的笔记本标记渲染 API 来实现数学支持,该 API 仍在开发中。我们最终的目标是使用此 API 允许扩展扩展笔记本中 Markdown 的渲染。
语言
Markdown 预览排版支持
新的 markdown.preview.typographer
设置允许您在内置 Markdown 预览中启用智能引号和简单的 排版替换。
在下面的示例中,Markdown 文本(例如 (c)
)会在预览中自动替换为版权符号 ©
markdown.preview.typographer
设置默认情况下处于禁用状态。
更多文件被识别为 shellscript
具有 .xsession
和 .xprofile
文件扩展名的文件将被自动识别为 shellscript。
预览功能
终端选项卡
终端中的选项卡作为预览功能提供,可以通过以下设置启用
"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 的 内部版本 中可用。
入门
要开始使用,请从命令面板运行 打开远程仓库... 命令。在那里,您可以粘贴任何 GitHub URL,或者选择搜索特定仓库或拉取请求。
输入 URL 或选择仓库或拉取请求后,VS Code 将为该仓库打开一个新的工作区。状态栏左侧的远程状态指示器显示已连接的远程提供程序名称,例如 GitHub,用于远程仓库。
功能
- 无需克隆或在本地拥有仓库,即可立即打开任何 GitHub 仓库。
- 轻松编辑并贡献到任何 GitHub 仓库 - 直接将您的更改提交到 GitHub,或打开拉取请求。
- 在另一个环境中继续 - 通过 继续在... 命令(可从命令面板或远程指示器快速选择菜单访问)。
- 在本地克隆仓库
- 将仓库克隆到容器中 - 需要 Dev Containers 扩展
- 提供与处理本地仓库类似的熟悉的用户界面(*请参见下面的“限制”)。
- 资源管理器 - 打开、复制、移动、重命名和删除文件和文件夹
- 搜索 - 快速全文搜索*
- 源代码管理 - 暂存和提交更改,以及许多其他源代码管理操作
- 时间线 视图 - 具有差异支持的查看文件历史记录
- 快速打开 - 快速找到要打开的文件
- 远程指示器 - 显示远程仓库连接到的提供程序(例如,GitHub)
- 同时处理不同的分支 - 每个远程分支都被视为一个单独的工作区(用 Git 行话来说),这意味着您所做的任何更改都将隔离到该分支。您无需暂存更改,只需切换到新分支即可签出 PR 或开始新的工作项。当您返回到上一个分支时,您的更改仍然存在。
- 安装 GitHub 拉取请求和问题 扩展,并快速查看、浏览和签出拉取请求,查看并开始处理问题。
限制
- 有限的语言智能 - 许多语言服务器还不了解此虚拟化环境。TypeScript 支持对远程仓库进行单文件智能。
- 有限的扩展支持 - 与语言服务器一样,许多扩展不适用于远程仓库。扩展可以选择退出,并且不会为虚拟工作区激活。有关更多详细信息,请参见下面的 扩展编写部分。
- 搜索 - 全文搜索需要预先构建的索引才能进行精确的文本匹配,否则它将回退到 GitHub 的模糊默认分支仅本机搜索。
- 终端 - 不支持。任何打开的终端都将在您的本地文件系统上。
- 调试 - 不支持。
- 任务 - 不支持。
告诉我们您的想法
我们非常高兴您能体验 远程仓库(RemoteHub),并且期待您宝贵的意见和反馈。我们才刚刚开始踏上这段旅程,因此随着我们继续开发,预计功能集会不断增长,限制会不断缩小。我们还将扩展受支持的提供程序集。GitHub 只是我们支持的第一个提供程序,Azure Repos 将很快推出。
TypeScript 4.3
此版本继续改进我们对即将发布的 TypeScript 4.3 版本的支持。您可以在 TypeScript 博客上阅读有关 TypeScript 4.3 中的新语言功能和改进的更多信息,请访问 TypeScript 博客。以下是一些它启用的编辑器改进
- 支持
override
。还有一些快速修复用于添加override
关键字。 - 导入语句完成。这类似于自动导入,只是您是在导入语句本身中键入。
- JSDoc
@link
标记支持。
要开始使用 TypeScript 4.3 夜间构建版本,只需安装 TypeScript 夜间构建扩展。请分享您的反馈意见,如果您在使用 TypeScript 4.3 时遇到任何错误,请告知我们。
工作区信任
在上次里程碑的发布说明中,我们分享了我们关于工作区信任的成果,尤其是针对扩展作者。在这个里程碑中,我们在扩展 API 和用户体验方面都取得了重大进展。也就是说,工作区信任在这个版本中将保持禁用状态,但我们很乐意您尝试并提供反馈。
您可以使用以下设置 security.workspace.trust.enabled
启用此功能。启用后,在 VS Code 中打开文件夹时,您将看到以下对话框。
此对话框对于允许用户尽早做出决定并了解其决定的影响非常重要。一旦您理解了该功能,您可能希望使用 security.workspace.trust.startupPrompt
设置来自定义何时显示对话框。
您可以在 问题 #106488 中跟踪工作区信任的开发并提供反馈。
对扩展的贡献
远程开发
对 远程开发扩展 的工作仍在继续,这些扩展允许您使用容器、远程机器或 Windows 子系统 for Linux (WSL) 作为功能齐全的开发环境。
1.56 中的功能亮点包括
- 当您**在容器卷中克隆存储库**时,新的卷视图。
- 连接到远程时,本地终端警告。
- 使用 Dev Containers 扩展启动时,提示安装 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
iframe 现在用于大多数 webview
自从 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
请求代码操作的原因。此属性的可能值为
Invoke
- 代码操作是明确请求的,无论是使用键盘快捷键还是命令。Automatic
- 代码操作是在没有显式用户操作的情况下请求的。这包括在文档内容发生更改时请求代码操作。
提供程序可以使用 triggerKind
来返回不同的结果集,具体取决于代码操作的请求方式。例如,自动触发的重构代码操作提供程序可能只返回对当前选择的精确重构,以限制代码操作灯泡显示的频率。但是,当明确请求代码操作时,相同的提供程序可能会自动扩展当前选择,以尝试显示用户可能对当前位置感兴趣的所有重构。
更新的 codicon
我们在 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 的步骤
- 您必须使用 Insider 版本,因为建议的 API 经常更改。
- 您的扩展的
package.json
文件中必须包含以下行:"enableProposedApi": true
。 - 将最新版本的 vscode.proposed.d.ts 文件复制到您项目的源代码位置。
您不能发布使用建议 API 的扩展。在下一个版本中可能存在重大更改,我们绝不希望破坏现有扩展。
原生笔记本
我们正在准备将原生笔记本 API 的大部分内容最终确定。我们进行了一些细微调整,也做了一些重大更改。
笔记本序列化器
我们添加了 NotebookSerializer
API。它提供了一种简化的方法来将“字节”转换为 NotebookData
,反之亦然。当您实现此 API 时,您的笔记本将免费获得备份、恢复、脏状态等功能。我们建议扩展作者采用此新 API,而不是使用以前基于内容提供者的 API。
笔记本控制器
笔记本控制器 API 替换了内核提供者 API。笔记本控制器提供了笔记本的执行引擎,它创建笔记本输出。笔记本可以提供多个控制器或不提供任何控制器,VS Code 允许用户选择控制器。作为回报,扩展可以根据其领域模型的需求自由创建、修改和删除控制器。
笔记本单元状态栏
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 有几个怪癖
- 类型化数组(例如
UInt8Array
)的序列化效率非常低。当您需要传输数兆字节的数据时,这会导致性能问题。 - 发送的类型化数组不会在接收端重新创建为正确的类型。如果您发送
UInt8Array
,接收者将获得一个通用对象,该对象具有UInt8Array
的数据值。
虽然这两个问题都是 bug,但我们也不能在不破坏依赖于现有行为的扩展的情况下修复它们。同时,新编写的扩展根本不需要当前混乱且效率低下的行为。
因此,我们决定将现有行为保留在现有扩展中,但选择让新扩展采用更正确行为。这是通过查看扩展的 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
请求现在可以选择返回一个类似于其他 set*Breakpoints
请求的 Breakpoint
数组。这允许客户端为各个异常断点或过滤器显示验证错误消息。从本版本开始,VS Code 在断点视图中显示这些错误。
重新启动请求现在可以接收调试配置更改
restart
请求现在采用了一个新的可选参数 arguments
,客户端可以在其中传递启动或附加配置的最新版本。有了此新增内容,调试适配器可以使用调试配置中的最新值重新启动会话。
断开调试器并保持被调试器挂起
disconnect
请求用于结束调试会话,并继续执行被调试器或终止被调试器。现在有一个新选项,可以在调试器断开连接后保持被调试器处于挂起状态。这使得用新会话继续调试成为可能。
实现此功能的调试适配器必须使用 supportSuspendDebuggee
功能宣布其支持。客户端可以通过将新的可选参数 suspendDebuggee
传递给 disconnect
请求来使用此功能。
工程
Electron 12 更新
在此里程碑中,我们完成了将 Electron 12 打包到 VS Code 的探索工作,感谢所有参与 Insider 测试和自托管的人。这是一个主要的 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 中加载资源
在桌面 VS Code 中,webview 现在使用服务工作者来加载本地资源。VS Code 的 Web 版本一直使用服务工作者来执行此操作,但以前桌面 VS Code 使用的是 Electron 协议。
在桌面版本中使用服务工作者,使我们能够更好地在桌面和 Web 之间对 webview 的行为进行对齐。它还帮助我们修复了一些棘手的 bug,并让我们删除了大约 1000 行代码。
虽然此更改对大多数 webview 扩展应该没有影响,但它可能会在一些极端情况下造成问题
-
对 webview 加载资源的方式做出假设的扩展
如果您的扩展直接使用
vscode-webview-resource:
协议或对资源 URI 进行其他硬编码假设,则它可能不再起作用。相反,请确保始终使用
.asWebviewUri
来创建资源的 URI。还要记住,返回的 URI 的格式将来可能会更改。 -
将 iframe 的
src
设置为指向磁盘上的 HTML 文件的扩展服务工作者无法看到此请求,因此我们不再支持此请求。这在 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 工程师 Ben Pasero 的采访 中了解 VS Code 的历史和底层技术。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): fix(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): fix: 仅在编辑器为只读时将只读属性添加到 textarea dom PR #120503
- @gjsjohnmurray (John Murray)
- fix #120485 当没有时间线提供程序时,从资源管理器上下文菜单中隐藏
打开时间线
PR #120497 - fix-120578 当未停止时,不要提供调用堆栈单步进入/跳过/退出 PR #120581
- fix #121509 两个 API 命令结果的文档错误 PR #121511
- fix #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): 为笔记本 markdown 单元格添加缺少的填充底部 PR #122505
- @KapitanOczywisty: 更新 PHP 语法 PR #120339
- @Kingwl (Wenlu Wang): 添加 next/prev 冲突 PR #97613
- @leemun1 (Mike Lee): feat: 为 markdown 添加对其他周围对的支持 (#_119982) PR #121698
- @lf- (Jade): 改进扩展配置模式验证错误的报告 PR #120457
- @limitedmage (Juliana Peña): 修复显示和隐藏 suggestWidget 时的竞争条件 PR #121396
- @LuisPeregrinaIBM2: wsl -l -q,删除标题和默认标记 PR #120382
- @nan0tube (Yongming Lai): 识别常用的源文件作为 shellscript PR #121373
- @plainerman (Michael Plainer): 添加对停用自动更新禁用的扩展的支持 PR #113155
- @PooyaZv (Pooya Vakeely): 添加 cuda-cpp 语言 ID、语法和问题匹配器 PR #119444
- @qchateau (Quentin Chateau): format modified: 格式化具有空格更改的行 PR #119021
- @sdegutis (Steven Degutis): 使错误消息更清晰 PR #121339
- @sokolovstas (Stanislav): 修复 eslint-stylish 问题匹配器中的文件位置模式 PR #117576
- @solomatov (Konstantin Solomatov): 如果 ext 主机 IPC 超时,则终止 PR #122399
- @stoyannk (Stoyan Nikolov): 修复了导致扩展的配置文件… PR #120054
- @timmaffett (Tim Maffett): 修复和扩展了对大多数 ANSI SGR 代码的调试控制台支持 PR #120891
- @vinku: Emmet:选择下一个/上一个项目在脚本标签中不起作用。 PR #118842
- @wdesgardin (William Desgardin): feat: 为 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