现已推出!阅读 10 月份的新功能和修复。

2019 年 11 月(版本 1.41)

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

下载:Windows:x64 | Mac:Intel | Linux:deb rpm tarball snap


欢迎使用 2019 年 11 月发布的 Visual Studio Code。此版本包含一些我们希望您喜欢的更新,一些主要亮点包括

如果您想在线阅读这些发行说明,请访问 更新,网址为 code.visualstudio.com

内部人员:想尽快看到新功能?您可以下载夜间 内部人员 构建并尽快尝试最新更新。有关最新的 Visual Studio Code 新闻、更新和内容,请在 Twitter 上关注我们 @code

工作区

资源管理器中紧凑的文件夹

在文件资源管理器中,我们现在以紧凑形式呈现单个子文件夹。在此形式中,单个子文件夹将在组合的树元素中压缩。例如,这对于 Java 包结构很有用。

设置 explorer.compactFolders 控制此行为。默认情况下,此设置已启用。

File Explorer compact folders

编辑差异视图左侧

如果您比较两个可编辑的编辑器(例如,通过比较文件资源管理器中的两个文件或运行全局搜索和替换),现在左侧也变得可编辑,并且可以保存(⌘S(Windows、Linux Ctrl+S)。

Diff view left hand side edit

注意:如果您厌倦了按 ⌘S(Windows、Linux Ctrl+S,您可以启用自动保存(文件 > 自动保存)。

从窥视编辑器保存

如果您调出窥视视图并输入内容,现在可以通过 ⌘S(Windows、Linux Ctrl+S 保存更改,前提是焦点位于该嵌入式编辑器内。

Saving in a Peek view

问题面板

更多过滤器

问题面板中添加了更多预定义过滤器。您现在可以按类型(错误、警告和信息)过滤问题,还可以查看限定在当前活动文件的范围内的问题。

Problems panel filters

主题:GitHub Sharp Dark,字体:FiraCode

在状态栏中显示当前问题

您现在可以配置 VS Code 以在状态栏中显示当前问题消息。这使您无需任何额外的键盘或鼠标操作,即可在活动文件中查看所选问题的摘要。

注意:要启用此功能,需要启用设置 problems.showCurrentInStatus

Current problem displayed in the Status bar

主题:GitHub Sharp Dark,字体:FiraCode

灵活的过滤器框布局

问题面板中的过滤器框现在会根据面板的位置和大小调整其位置。

Problems panel filter box adjustable layout

主题:GitHub Sharp Dark,字体:FiraCode

改进的字体渲染(Windows、Linux)

当我们在上一个里程碑中更新到 Electron 6 时,许多用户报告说他们的字体渲染出现了倒退。具体来说,字体没有以前那么流畅地渲染。我们立即 解决了编辑器中的问题,并且修复程序在 1.40 恢复版本中发布。但是,工作区中的其他区域仍然存在字体渲染不理想的问题。

在此版本中,我们改进了工作区更多部分(适用于 Windows 和 Linux)中的字体渲染。下面的屏幕截图显示了前后对比(放大以显示差异)。特别是,工作区的许多树形和列表元素使用灰度抗锯齿渲染,现在使用亚像素抗锯齿渲染。

之前(左)和之后(右)

Improved font rendering before and after

我们计划进一步改进工作区更多部分中的字体渲染。您可以查看此 文本渲染问题查询 以查看进度。

远程场景下的更快读写文件性能

现在,对于文件系统为远程且延迟很高的场景(例如,在浏览器中使用 VS Code 且连接速度慢,或连接到不在同一区域的远程主机),读取和写入文件(来自文本编辑器)应该更快。我们切换到基于流的读取和写入实现,这极大地减少了通信开销。

在您键入时更新搜索结果

在全文搜索中,结果现在会在您键入时更新。这在构造复杂正则表达式查询的场景中尤其有用,因为查询的快速反馈可以帮助您编写正则表达式。

在这里,即时反馈有助于构造用于采用 TypeScript 的可选链式调用语法的正则表达式查找和替换查询

Search result updates on type

主题:Noctis Hibernus,字体:Hasklig

注意:可以通过将 search.searchOnType 设置为 false 来禁用此功能,并且可以在 search.searchOnTypeDebouncePeriod(默认为 300 毫秒)中调整键入和搜索之间的延迟。

向搜索结果添加光标

我们添加了一个命令,用于将光标添加到文本搜索的所有匹配项。将焦点放在搜索视图中的文件的搜索结果上,您可以按 ⇧⌘L(Windows、Linux Ctrl+Shift+L 以同时编辑该文件中所有匹配项。这与在使用查找窗口在单个编辑器中搜索时使用的相同键盘快捷键。

Add cursors to search results

默认情况下展开所有搜索结果

以前,如果全文搜索在一个文件中返回了超过 10 个结果,它将在结果树中以折叠状态显示。但是,这有时会使查找特定结果变得困难,因此在此版本中,所有结果都将以展开状态显示。

您可以将 search.collapseResults 设置为 auto 以恢复旧行为。

编辑器

小地图中错误、警告和内容更改的装饰

现在,错误和警告在小地图(代码概述)中以内联方式突出显示。您可以使用新的 minimap.errorHighlightminimap.warningHighlight 主题颜色更改这些装饰的颜色。

下面您可以看到小地图突出显示了一个细微的丢失逗号的拼写错误

Minimap error and warning decorations

内容更改装饰也显示在小地图的边距中

Minimap content change decorations

您可以使用以下命令修改内容更改颜色

  • minimapGutter.addedBackground
  • minimapGutter.modifiedBackground
  • minimapGutter.deletedBackground

您可以使用 scm.diffDecorations 设置更改源代码管理装饰的可见性,该设置具有以下值

  • all - 在所有位置显示源代码管理差异装饰。
  • gutter - 仅显示在左侧编辑器边距中。
  • minimap - 仅显示在小地图边距中。
  • overview - 仅显示在概述标尺中。
  • none - 不要显示差异装饰。

代码导航备用命令

当在定义处选择 转到定义 时,VS Code 以前不会执行任何操作。在此版本中,可以改为执行备用命令。例如,转到定义 可以映射到运行 转到引用

这是通过 editor.gotoLocation.alternativeDefinitionCommand 设置自定义的。例如,您可以将 转到定义 的备用命令设置为 转到声明,反之亦然。如果您喜欢旧的行为,可以将设置留空。

窥视、转到和查找所有命令

每个 窥视 命令现在都有一个 转到 对应命令。例如,现在有 窥视实现转到实现。窥视视图不会更改当前编辑器,并允许快速查看源代码。

下面的视频展示了如何使用 窥视实现 以窥视视图查看 ICommandService 接口的所有实现

Peek Implementations command

主题:GitHub Sharp,字体:FiraCode

相反,转到实现 用于导航,可以快速让您找到实现。

下面的视频(使用 "editor.gotoLocation.multipleImplementations": "goto" 设置)通过反复按 F12 导航到 ICommandService 接口的所有实现

Go to Implementations command with F12

主题:GitHub Sharp,字体:FiraCode

最后但并非最不重要的,与查找所有引用命令类似,现在有了查找所有实现。它将实现作为稳定列表显示在编辑器旁边。例如,在执行影响接口所有实现的重构时,可以将其用作待办事项列表。

Find All Implementations in the Side bar

主题:GitHub Sharp,字体:FiraCode

面包屑和概述视图的语言特定筛选

在上一个里程碑中,我们添加了从概述视图和面包屑导航中筛选某些类型(如变量)的功能。此版本完善了此功能,并允许进行语言特定的筛选,例如,不显示 TypeScript 变量,但显示 JavaScript 变量。

您可以在下面看到 value 常量如何在 JavaScript 文件的概述视图中显示,但在 TypeScript 版本中却没有显示。

Language-specific filter for Outline view

主题:GitHub Sharp,字体:Fira Code

macOS 上的 IntelliSense 键盘快捷键

IntelliSense 通常通过 Ctrl+Space 触发。但在 macOS 上,当配置了多个输入源时,此键盘快捷键会被操作系统占用。这通常会导致混乱,用户会认为 IntelliSense 坏了。

现在有两种方法可以处理这个问题

  • 使用我们为 macOS 添加的新 Alt+Escape 键盘快捷键。
  • 在 macOS 偏好设置中,通过偏好设置 > 键盘 > 快捷键 > 输入源,禁用通过 Ctrl+Space 切换输入源。

macOS Keyboard Shortcuts Input Sources option

屏幕阅读器输出

有一个新的设置 editor.accessibilityPageSize,用于控制屏幕阅读器一次可以读出的编辑器中的行数。请注意,对于大于默认值 10 的数字,这会对性能产生影响。

如果您使用屏幕阅读器的朗读所有命令,我们建议将 editor.accessibilityPageSize 设置为 100 或 1000。下一个里程碑,我们将研究更改此设置的默认值。

新的括号匹配选项

现在可以配置 "editor.matchBrackets": "near",以获取旧行为,即仅当光标位于括号的任一侧时才突出显示匹配的括号。默认值为 always,它会突出显示包含当前光标位置的匹配括号。

新的自动缩进选项

设置 editor.autoIndent 现在可以采用不同的值。此设置会影响多个功能,例如按 Enter、按 Tab 或者缩进和取消缩进行。您可以将此设置视为一个“滑块”,它变得越来越有见地

  • "none":按 Enter 将插入 \n,仅此而已。
  • "keep":按 Enter 将保留当前行的缩进。
  • "brackets":以上所有内容以及针对语言特定括号的特殊逻辑。
  • "advanced":以上所有内容以及尊重通过 onEnterRules 定义的语言特定规则。
  • "full"(默认):以上所有内容以及尊重通过 indentationRules 定义的语言特定规则。

代码操作菜单键盘快捷键

代码操作和重构菜单现在显示 自定义键盘快捷键(如果存在)。

A keybinding for extract constant

集成终端

最小对比度

使用终端中颜色的应用程序可能很棘手,它们可以使用以下颜色显示文本

  • 默认前景颜色
  • 终端主题定义的 16 色调色板
  • 一组 240 种固定颜色
  • 任何 RGB 颜色(1600 万)

问题在于,应用程序不知道默认背景颜色或前景颜色是什么,也不知道它与应用程序使用的颜色是否具有良好的对比度。为了解决这个问题,终端现在可以动态更改文本的前景颜色以满足指定的对比度。

将前景颜色设置为所需的对比度,范围为 1 到 21

// 4.5 is recommended for baseline website accessibility
"terminal.integrated.minimumContrastRatio": 4.5

终端颜色将增加或降低亮度,直到满足对比度或前景变为 #000000#ffffff

Terminal minimum contrast ratio setting

主题:Sapphire,字体:Hack

新的实验性 WebGL 渲染器

终端可以使用基于 WebGL 的新渲染器,与旧的基于画布的方法相比,它可以将性能提升高达 900%*。

您可以使用此设置选择使用新渲染器

"terminal.integrated.rendererType": "experimentalWebgl"

速度改进归因于许多因素,但以下是重点

  • WebGL 使我们能够更直接地与 GPU 交谈,而不是通过 Web 平台的 CanvasRenderingContext2D API。
  • 渲染器几乎完全处理数字和类型化数组,它们非常快。对象和数组的创建也被降至最低,以避免不必要的垃圾回收。
  • 所有字符现在都缓存在纹理图集中,而不是像以前那样只缓存具有有限样式集的 ASCII 字符。这意味着重复绘制相同的字符要快得多。

我们观察到,使用画布渲染器时,帧渲染速度会根据用户的硬件/环境而大幅波动。每一帧通常需要 1 毫秒到 40 毫秒,但在极端情况下,如果硬件问题是因素,可能会达到 200 毫秒以上。到目前为止,WebGL 看起来一致得多,通常位于 0.2 毫秒到 2 毫秒的范围内。

WebGL frames are much faster

一旦集成,我们预计改进的方面之一是可靠性。使用画布渲染器时,浏览器会尝试变得聪明,如果 GPU/画布存在问题,就会回退到在 CPU 上渲染,但我们永远不想发生这种情况,因为我们有一个基于 DOM 的渲染器,它更适合这种情况。使用 WebGL,它要么按预期工作,要么彻底失败(无法获取 WebGL 上下文),在这种情况下,我们可以回退到 DOM 渲染器。

由于渲染所花费的时间大大减少,CPU 可以腾出时间专注于解析传入的数据,从而渲染出更多帧,并使命令运行得更快。以下性能数据是从 vscode 存储库中运行 ls -lR 生成的

Commands run faster on the WebGL renderer

新渲染器还修复了画布渲染器的一个恼人的错误,即当字符的大小大于单元格大小时,字符的侧面会被剪切。这个问题在 Linux 上使用带下划线的某些字体时最常观察到。

* 有关基准测试的更多信息,请访问 xtermjs/xterm.js#1790

源代码管理

Git:git.ignoredRepositories 中的相对路径

git.ignoredRepositories 设置现在支持相对路径,当您配置工作区设置并想要忽略 VS Code 中的某些存储库时,这非常有用。

Git:FileSystemProvider 的采用

Git 扩展现在使用 FileSystemProvider API,除了修复某些编码问题外,它还提供了一种更高效、更可靠的方式来公开 Git 存储库中文件的旧版本。

语言

HTML 镜像光标

当您编辑 HTML 标签时,VS Code 现在会添加一个“镜像光标”。此行为由设置 html.mirrorCursorOnMatchingTag 控制,默认情况下已启用。

此功能通过在光标移动到 HTML 标签名称范围内时,向匹配的标签添加一个 多光标 来实现。就像在多光标模式下一样,您可以使用逐词删除或逐词选择。当您将光标移动到标签名称范围之外时,镜像光标将被移除。

一种特殊情况是在光标位于开始标签的末尾时输入 Space,例如,在 div 的末尾,如 <div|></div|>。在这种情况下,VS Code 会删除在结束标签名称之后插入的空格,并退出镜像光标模式,以便您可以继续编辑 HTML 属性。

HTML mirror cursor

主题:Nord,字体:Input Mono

HTML 重命名标签

您现在可以使用 F2 重命名 HTML 中的开始/结束标签对。

HTML rename tag

自动完成的 CSS 属性的排名

CSS 自动完成现在会根据属性的流行度对其进行排名

CSS suggestions ranked by popularity

使用数据来自 ChromeStatus.org

Sass 模块支持

Sass 最近推出了一个 新的模块系统

我们添加了语法高亮支持,以及对 SCSS 文件中 Sass 模块的语言功能支持。语言功能包括

  • @use@forward 的自动完成。
  • @use@forward 路径的路径完成。
  • 对 Sass 内置模块(例如 sass:mathsass:color)的自动完成。
  • @use@forward 导入路径的文档链接。

Sass module support

JSON

为了避免大型 JSON 文件出现性能问题,JSON 语言支持现在对计算的折叠区域和文档符号数量(用于概述视图和面包屑)设置了上限。默认情况下,限制为 5000 个项目,但您可以使用设置 json.maxItemsComputed 更改限制。

JSON large file warning

TypeScript 3.7

VS Code 现在附带 TypeScript 3.7.3。此主要更新带来了一些 TypeScript 语言改进,包括 可选链空值合并运算符 以及 断言函数,以及 JavaScript 和 TypeScript 的一些新的工具功能。与往常一样,此版本还包含许多重要的错误修复。

您可以在 TS 3.7 博客文章 上阅读有关 TypeScript 3.7 功能的更多信息。

JavaScript 和 TypeScript 的可选链支持

由于有了 TypeScript 3.7,VS Code 现在开箱即用地支持 可选链,用于 JavaScript 和 TypeScript。这包括语法高亮和 IntelliSense

Optional chaining and nullish coalescing

此外,当您在可选属性上接受完成时,VS Code 可以自动插入 ?.

Selecting a completion on a potentially undefined value automatically inserts an optional chain

?. 的自动插入取决于 严格空值检查 是否启用。可以使用 "typescript.suggest.includeAutomaticOptionalChainCompletions""javascript.suggest.includeAutomaticOptionalChainCompletions" 设置禁用自动 ?. 插入。

用于 TypeScript 的提取接口重构

新的提取到接口重构使您可以快速将内联类型提取到接口,以便可以重用它。

Selecting the new 'extract interface' refactoring

您可以在下面看到 'Neural' 接口是如何从 'keyes' 中提取出来的。

After extracting the 'Neural' interface out of 'keyes'

用于 JavaScript 和 TypeScript 的分号格式化程序选项

新的 javascript.format.semicolonstypescript.format.semicolons 格式化设置使您可以控制格式化程序如何处理 JavaScript 和 TypeScript 文件中的分号。

有效的分号格式设置值是

  • ignore - 不添加或删除分号(默认)。
  • insert - 在语句结尾插入分号。
  • remove - 删除不必要的分号。

未调用的函数检查

如果您忘记在条件中调用函数,VS Code 现在会提醒您。

请考虑以下 TypeScript 代码片段

import * as fs from 'fs';

fs.stat('/path/to/file', function(err, stats) {
  if (stats.isDirectory) {
    handleDirectory(stats);
  }
});

上面的示例使用 Node.js fs.stat API 获取有关文件的信息。但有一个错误!.isDirectory 实际上是一个函数,而不是一个属性!这意味着 handleDirectory 将在每个文件上调用,而不仅仅是在目录上调用,因为函数 isDirectory 已定义并评估为 true

VS Code can alert when you forget to call a function

请注意,只有在启用严格空检查时,您才会看到此诊断信息。

调试

调试 START 视图

我们引入了一个新的调试 START 视图,以便用户更轻松地在新的工作区中启动和配置调试。根据活动文件,我们将选择合适的调试扩展,并使您能够调试或运行应用程序。对于更复杂的调试和运行配置,仍然建议配置 launch.json 文件。

下面您可以看到快速开始调试 Express JavaScript 应用程序,然后在需要更多控制时创建 launch.json 文件。

Debug Start view

在 CALL STACK 视图中将重启帧作为内联操作

为了提高 重启帧 操作的可发现性,现在在 CALL STACK 视图中有一个悬停时可见的内联操作。重启帧是一种在遇到断点后重新运行前面源代码的便捷方法。如果调试扩展不支持重启帧,则不会显示此操作。

Restart frame button

调试控制台显示输入和输出

为了更好地区分调试控制台中的输入和输出,我们在左侧添加了输入 > 和输出 < 装饰。

Debug console input and output decorations

内联断点显示

一个新的设置 debug.showInlineBreakpointCandidates 控制在调试时是否在编辑器中显示内联断点候选装饰。默认情况下,它们是可见的。

预览功能

预览功能尚未准备好发布,但功能已经足够强大,可以投入使用。欢迎您在它们开发过程中提供早期反馈。

搜索编辑器

在本里程碑中,我们开始在专用编辑器中显示搜索结果。这为查看搜索结果提供了更多空间,并允许您同时维护多个搜索结果集合。

在此版本中,您可以在搜索编辑器中执行以下操作

  • 使用 转到定义 系列命令(包括 预览定义将定义打开到侧面)导航到结果。
  • 重新运行搜索以更新结果列表。
  • 查看围绕结果的源代码行。
  • 将结果持久化到磁盘,以便稍后引用,甚至可以在源代码控制中跟踪。

我们将继续在后续版本中添加功能并提高可用性。

Search Editor

主题:淡紫色,字体:Hasklig

注意:您可以通过将 search.enableSearchEditorPreview 设置为 true 来预览此功能。

调用层次结构视图

调用层次结构 API 在稳定版中可用,语言扩展作者正在积极地实现它,因此我们添加了调用层次结构视图。它补充了 预览调用层次结构 视图,并与 查找所有引用查找所有实现 共享相同的侧边栏视图。一旦语言扩展支持调用层次结构 API,您就可以从上下文菜单或命令面板中选择 显示调用层次结构 来查看视图。

Call Hierarchy view

主题:GitHub Sharp,字体:FiraCode

调用层次结构视图允许您深入了解符号的调用者和调用。它会突出显示活动编辑器中的调用,允许从任何子项重新定位视图,并保留先前运行的历史记录。

JavaScript 调试器

我们正在为 Node.js 和 Chrome 开发一个新的调试器。您可以安装 nightly 扩展 js-debug-nightly,并通过更新设置添加以下内容来将其用作直接替换。

{
  "debug.chrome.useV3": true,
  "debug.node.useV3": true
}

您无需更改现有的启动配置即可使用新的调试器。

调试器带来了一系列新功能,例如调试和单步执行 WebWorker 的功能

An animation showing stepping through postMessage calls to and from a webworker

主题:大地之歌,字体:Fira Code

...无需额外配置或标志即可调试 npm 脚本...

An animation dispatching the "run npm script" command, selecting "npm start", and then hitting a breakpoint in an executed script

...等等!如果您遇到问题,请 提交问题

对扩展的贡献

远程开发

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

1.41 中的特性亮点包括

  • 开发容器:更轻松地在容器中试用示例存储库(例如 vscode-remote-try-python)。
  • 开发容器:创建容器时的性能得到提升,并为 devcontainer.json 提供了新的选项。
  • WSL:支持 Windows 10 基于 ARM 的 PC,例如 Surface Pro X。
  • 远程资源管理器现在可以将可用的视图范围限定到特定的远程类型。

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

您还可以阅读最近关于 使用 VS Code 检查容器 的博客文章,并尝试更新后的 在 VS Code 中使用 C++ 和 WSL 教程。

ESLint

ESLint 扩展的改进

  • 更好地支持 ESLint 6.x - 在大多数情况下,使用 ESLint 6.x 时无需配置工作目录。
  • 改进的 TypeScript 检测 - 一旦在 ESLint 中正确配置了 TypeScript,您就不再需要通过 VS Code 的 eslint.validate 设置进行额外的配置。HTML 和 Vue.js 文件也是如此。
  • 支持 Glob 工作目录 - 具有复杂文件夹结构且需要通过 eslint.workingDirectories 自定义工作目录的项目现在可以使用 glob 模式,而不是列出每个项目文件夹。例如,code-* 将匹配所有以 code- 开头的项目文件夹。此外,扩展现在默认情况下会更改工作目录。您可以使用新的 !cwd 属性禁用此功能。
  • 改进的保存时自动修复 - 保存时自动修复现在是 VS Code 的保存时代码操作基础结构的一部分,它在一轮中计算所有可能的修复。它通过 editor.codeActionsOnSave 设置进行自定义。该设置支持特定于 ESLint 的属性 source.fixAll.eslint。该扩展还尊重通用属性 source.fixAll

以下设置会为包括 ESLint 在内的所有提供程序打开自动修复

    "editor.codeActionsOnSave": {
        "source.fixAll": true
    }

相反,此配置仅为 ESLint 打开它

    "editor.codeActionsOnSave": {
        "source.fixAll.eslint": true
    }

您还可以通过以下方式选择性地禁用 ESLint

    "editor.codeActionsOnSave": {
        "source.fixAll": true,
        "source.fixAll.eslint": false
    }

vscode-scss

vscode-scss 扩展为 SCSS 变量、mixin 和函数提供跨文件语言支持。在本里程碑中,我们帮助其开发了一个新的版本 0.8.0

新版本改进

  • 更好的导入路径解析
  • 自动完成的颜色变量的颜色预览
  • 性能提升

扩展编写

Figma 设计工具包

我们创建了一个 Figma 设计工具包,以更好地帮助扩展作者为其扩展设计体验。查看 GitHub 上的工具包存储库,其中包含有关如何访问和使用工具包的说明。

下面是包含的一些组件的示例

Figma design toolkit components

所有组件都应该是可调整大小和可编辑的。

Editing Figma components

如果您遇到任何问题或对某些组件有任何要求,请在工具包存储库中创建一个问题,以便我们对请求进行分类和跟踪。

调试图标颜色标记

我们添加了一组用于调试视图的新颜色标记。

调试工具栏

  • debugIcon.startForeground
  • debugIcon.continueForeground
  • debugIcon.disconnectForeground
  • debugIcon.pauseForeground
  • debugIcon.restartForeground
  • debugIcon.stepBackForeground
  • debugIcon.stepIntoForeground
  • debugIcon.stepOutForeground
  • debugIcon.stepOverForeground
  • debugIcon.stopForeground

Debug toolbar colors

主题:Min Dark,字体:Input Mono

调试断点

  • debugIcon.breakpointForeground
  • debugIcon.breakpointDisabledForeground
  • debugIcon.breakpointUnverifiedForeground
  • debugIcon.breakpointStackframeForeground
  • debugIcon.breakpointCurrentStackframeForeground

Debug breakpoint colors

主题:Min Dark,字体:Input Mono

工作区文件事件

当文件和文件夹更改时,会发生新的事件

  • vscode.workspace.on[Will|Did]CreateFile
  • vscode.workspace.on[Will|Did]RenameFile
  • vscode.workspace.on[Will|Did]DeleteFile

当从资源管理器或通过 vscode.workspace.applyEdit(WorkspaceEdit) API 从扩展创建、重命名或删除文件时,会触发这些事件,但不会在文件在磁盘上更改时或通过 vscode.workspace.fs API 修改文件时触发。

这些事件的一个可能的用例是语言服务器,它可能在重命名文件之前更新文件内容,或者在删除/创建文件后更新项目文件。

SnippetString

SnippetString 类型现在具有用于选择元素的构建器方法。

严格的 getWordRangeAtPosition

TextDocument.getWordRangeAtPosition API 现在更加严格,它会抛出错误,而不是忽略导致空字符串匹配的无效正则表达式。

扩展种类弃用字符串类型

扩展作者可以在 package.json 中使用 extensionKind 属性来指示扩展应该在远程情况下运行的位置。在发布版(1.40)中,此值可以是字符串或数组。从该版本开始,此属性仅支持数组值,使用字符串已弃用。有关更多信息,请参阅 远程开发文档

将 DAP 源转换为 URI

VS Code 扩展 API 在引用可以在编辑器中打开的资源时使用文档 URI,而 调试适配器协议 基于 描述符。在本里程碑中,我们添加了一个 API 来连接这两个世界。函数 debug.asDebugSourceUri 从 DAP 源对象创建 URI。这使得将 DAP 源打开到 VS Code 编辑器变得很简单

export async function openDAPSource(
  session: vscode.DebugSession,
  source: DebugProtocol.Source
) {
  const uri = vscode.debug.asDebugSourceUri(source, session);
  vscode.window.showTextDocument(vscode.workspace.openTextDocument(uri));
}

建议的扩展 API

每个里程碑都包含新的提议的 API,扩展作者可以试用它们。一如既往,我们渴望得到您的反馈。以下是试用提议的 API 所需的操作

  • 您必须使用 Insiders,因为提议的 API 经常发生变化。
  • 您必须在扩展的 package.json 文件中包含以下行:"enableProposedApi": true
  • 将最新版本的 vscode.proposed.d.ts 文件复制到项目的源代码位置。

请注意,您不能发布使用提议的 API 的扩展。下一个版本中可能存在重大更改,我们永远不想破坏现有扩展。

CodeAction.disabled

VS Code 鼓励扩展使用 代码操作 来实现重构功能。然而,用户可能难以发现扩展支持哪些重构,以及难以理解为什么某个重构对于特定选择不可用。CodeAction.disabled API 提案旨在帮助扩展提高其重构的发现能力。

CodeAction 上提出的 .disabled 属性是一个人类可读的字符串,描述了为什么某个代码操作不可行。以下是在我们的 代码操作示例扩展 中使用 .disabled 的示例。

import * as vscode from 'vscode';

export class Emojizer implements vscode.CodeActionProvider {

    public provideCodeActions(document: vscode.TextDocument, range: vscode.Range): vscode.CodeAction[] | undefined {
        const action = new vscode.CodeAction(`Convert to ${emoji}`, vscode.CodeActionKind.Refactor.append('emojize'));

        if (!this.isAtStartOfSmiley(document, range)) {
            // Tell the user why our action is not available
            action.disabled = 'Selection is not currently on a :)';
            return [action];
        }

        action.edit = new vscode.WorkspaceEdit();
        action.edit.replace(document.uri, new vscode.Range(range.start, range.start.translate(0, 2)), '😀');
        return action;
    }

    ...
}

如果用户尝试通过 键绑定 应用一个禁用的代码操作,VS Code 将向用户显示 .disabled 错误消息。

Showing the '.disabled' error in the editor

此外,为了帮助提高发现能力,禁用的代码操作在 重构源操作 上下文菜单中以淡化的方式显示。

A '.disabled' Code Action in the Refactor menu

请注意,禁用的操作不会在顶层灯泡菜单中显示。

如果您的扩展使用代码操作,请 告知我们CodeAction.disabled 是否对您有用,以及您是否能够实现它。

自定义编辑器编辑功能

我们在本次迭代中继续致力于 自定义编辑器提案。作为提醒,自定义编辑器是基于 webview 的视图,可以用作 VS Code 针对特定文件类型的普通文本编辑器的替代方案。从 VS Code 1.41 开始,自定义编辑器现在可以与 VS Code 的撤消/重做和保存功能集成,这使得许多有趣的用例成为可能,包括将它们用作可视化和所见即所得的编辑器。

您可以在 vscode.proposed.d.ts 中找到当前的 API 提案,我们还提供了一些 非常简单的扩展示例,演示了如何将自定义编辑器用于文本和二进制文件。

如果您对自定义编辑器感兴趣,请分享您对当前提案的反馈,并告知我们您是否能够实现它。

语义令牌提供者

我们添加了新的 语义令牌提供者 API 提案。新的 API 允许扩展提供额外的令牌信息,供编辑器使用以丰富基于 TextMate 的语法高亮显示。

每个语义令牌都会使用令牌 类型 和任意数量的令牌 修饰符 对一个范围进行注释。例如,类型 variable 和修饰符 membermodification 将描述对成员变量的写访问。然后,令牌类型和修饰符用于在编辑器中添加样式。

样式可以在颜色主题和用户设置中进行配置。

    "editor.tokenColorCustomizationsExperimental": {
        "variable.member": {
            "foreground": "#35166d"
        },
        "*.modification": {
            "fontStyle": "underline"
        }
    }

如果您对这项功能感兴趣,我们希望收到您对当前提案的反馈,并鼓励您进行实验和一些早期实现。

vscode-extensions-samples 仓库 中提供了一个完整的示例。

语言服务器协议

现在通过 LSP 提案支持 调用层次结构 视图。

浏览器支持

改进对 Firefox 和 Safari(macOS & iPadOS)的支持

在本里程碑期间,我们专注于改进在使用 Firefox 或 Safari 时在浏览器中运行的 VS Code 的体验。我们修复了许多支持这两个浏览器的问题 (FirefoxSafari)。在 Firefox 中,我们还没有完全的键盘快捷键支持,因为存在上游阻碍因素,您可以在 跟踪问题 #85252 中阅读更多详细信息。

我们还修复了许多 问题,以在 iPadOS 上的 Safari 中启用基本的 VS Code 功能。核心 UI 元素现在可供触摸和指针设备使用。但是,仍然存在与预定义键绑定 (EscapeFunction 键)、悬停和触摸友好 UI/UX 相关的重大阻碍因素。有关更多信息,请参见 问题 #85254

在浏览器中运行时可用的更多功能

在上一个里程碑中,我们 引入了支持 从我们的存储库中运行 yarn web 以设置在浏览器中运行的 VS Code。此设置仍然旨在用于测试浏览器中的问题,而不是用于开发。

在本里程碑中,我们添加了可以测试的更多功能。

  • 调试
  • 搜索
  • 任务
  • 问题

以下视频展示了新功能的实际应用。

VS Code running in a browser

注意: 不要将此设置用于任何严肃的开发。目的是允许社区将更改贡献回 VS Code,以改善浏览器中的整体体验。

工程

Insiders 可在 yum 存储库中使用

Insiders 版本现在可以在 yum 存储库中使用,并且会像 apt 存储库一样自动发布。请按照 网站上的说明 设置存储库,并使用 sudo dnf install code-insiders 安装。

Monaco 编辑器的持续构建

在本次迭代中,我们为 Monaco 编辑器添加了 持续构建和测试管道。我们从 VS Code 存储库主分支构建 Monaco 编辑器核心,并执行健全性测试,尽早发现潜在的错误或意外的重大更改。

重大修复

  • 51039:在其他选项卡中关闭左侧编辑器时,差异编辑器关闭
  • 83746:Web:无法拖放复合组件和视图(活动栏、面板)
  • 80026:launch.json 中的灰色属性令人困惑,请将其删除
  • 83449:可访问性:在可访问性模式下,Ctrl+Right(CursorWordAccessibilityRight)应跳转到下一个单词的开头,而不是结尾
  • 83753:禁用 console.debug.wordWrap 会删除换行符和空格
  • 85086:当 search.usePCRE2 被禁用时,全局搜索中不支持反向引用
  • 36219:Git:“暂存选定范围”命令将编码更改为 UTF-8

感谢

最后,但同样重要的是,对以下帮助使 VS Code 变得更好的所有人表示衷心的感谢!

对我们的问题跟踪的贡献

vscode 的贡献

language-server-protocol 的贡献

vscode-css-languageservice 的贡献

debug-adapter-protocol 的贡献

vscode-chrome-debug-core 的贡献

vscode-vsce 的贡献

localization 的贡献

超过 800 名 云 + AI 本地化 社区成员使用 Microsoft 本地化社区平台 (MLCP),其中约 100 名活跃贡献者参与了 Visual Studio Code 的本地化工作。感谢您的贡献,无论是提供新的翻译、投票翻译还是建议流程改进。

以下是 贡献者 的快照。有关项目的详细信息(包括贡献者姓名列表),请访问项目的网站:https://aka.ms/vscodeloc

  • 波斯尼亚语(拉丁语,波斯尼亚和黑塞哥维那):Sead Mulahasanović、Ismar Bašanović、Adnan Rizvan。
  • 丹麦语:Lasse Stilvang。
  • 荷兰语:Lemuel Gomez、Gideon van de Laar。
  • 英语(英国):Martin Littlecott、Alonso Calderon、Daniel Imms、Kamalsinh Solanki。
  • 芬兰语:Tuula P。
  • 法语:Antoine Griffard、Thierry DEMAN-BARCELÒ、Edouard Choinière、Joel Monniot、Rodolphe NOEL、Alain BUFERNE、Xavier Laffargue、DJ Dakta。
  • 德语:Pascal Wiesendanger、Jakob von der Haar、jan-nitsche、Michael Richter。
  • 希腊语:Valantis Kamayiannis、Θοδωρής Τσιρπάνης。
  • 希伯来语:Ariel Bachar。
  • 印地语:Kiren Paul、Niraj Kumar、Preeti Madhwal、Jaadu Jinn、Mahtab Alam。
  • 匈牙利语:József Cserkó、Kiss Attila Csaba、Krisztián Papp。
  • 简体中文:Yizhi Gu、Tingting Yi、Justin Liu、Charles Dong、Peng Zeng、Tony Xia、斌 项、Yixing Zheng、paul cheung、普鲁文、Sheng Jiang、钟越、Joel Yang、一斤瓜子、Zhiqiang Li、Yiting hu、Alexander ZHANG、张锐、Libing Yang、ZHENGCHENG CHEN、光宇 朴、石岩 詹、舜杰 杨、WJ Wang、Siam Chen。
  • 繁体中文:Winnie Lin、船長、Alan Tsai、TingWen Su。
  • 印度尼西亚语:Eriawan Kusumawardhono、Arif Fahmi、Laurensius Dede Suhardiman、Christian Elbrianno。
  • 意大利语:Alessandro Alpi、Luigi Bruno。
  • 日语:Takayuki Fuwa、貴康 内田、Kyohei Uchida、Koichi Makino、TENMYO Masakazu、Aya Tokura。
  • 韩语:Hongju。
  • 拉脱维亚语:Andris Vilde。
  • 挪威语:Frode Aarebrot、Anders Stensaas、Thomas Ødegård、Thomas Isaksen。
  • 波兰语:Makabeus Orban、Wojciech Maj、Kacper Łakomski、Oskar Janczak、Szymon Seliga、Mateusz Redynk、Franx Bar。
  • 葡萄牙语(巴西):Marcelo Fernandes、Albert Tanure、Arthur Lima、Nylsinho Santos、Pudda、Matheus Vitti Santos、Rodrigo Crespi、Roberto Fonseca、Felipe Nascimento。
  • 葡萄牙语(葡萄牙):Francisco Osorio、Luís Chaves、Ricardo Sousa Vieira、João Fernandes。
  • 罗马尼亚语:LaServici、Dan Ichim。
  • 俄语:Vadim Svitkin。
  • 塞尔维亚语(西里尔字母):Dusan Milojkovic。
  • 西班牙语:José María Aguilar、Gustavo Gabriel Gonzalez。
  • 泰米尔语:MUTHU VIJAY、Sankar Raj、Kadhireshan S、Pandidurai R、Madhu Chakravarthy、Madhu Maha。
  • 土耳其语:Mehmet Yönügül、mehmetcan Gün、Misir Jafarov、Fırat Eşki、Gökberk Nur、Safa Selim。
  • 乌克兰语:Arthur Murauskas、Oleksandr Krasnokutskyi。
  • 越南语:Dat Nguyen、Vương、Dao Ngo、Van-Tien Hoang、ng-hai。