🚀 在 VS Code 中

2020年1月(版本 1.42)

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

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


欢迎使用 Visual Studio Code 2020 年 1 月版。此版本包含许多更新,我们希望您会喜欢,其中一些主要亮点包括

  • 重命名预览 - 在差异视图中查看待处理的重命名,并轻松接受或拒绝更改。
  • 打开编辑器限制 - 设置一次最多打开的编辑器数量。
  • 面板位置 - 将面板(输出、终端)移动到编辑器的左侧、右侧或下方。
  • 折叠代码高亮 - 使用新的背景高亮快速查找折叠区域。
  • 调试控制台改进 - 语法高亮、括号匹配、输入历史记录。
  • 定义全局任务 - 每个用户的任务可以在您的所有文件夹和工作区中使用。
  • Java 扩展更新 - Java 支持数据断点和调用层次结构视图。
  • 远程开发 - 新的转发端口视图,用于映射 SSH 和容器端口。
  • 新的容器教程 - 了解如何创建和部署 Docker 容器。
  • 预览功能 - Timeline 视图、搜索编辑器、语义高亮等功能的初步预览。

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

Insiders: 想尽快查看新功能吗?您可以下载每晚构建的 Insiders 版本,并在最新更新可用时立即试用。有关最新的 Visual Studio Code 新闻、更新和内容,请在 Twitter 上关注我们 @code

工作台

重命名预览

Visual Studio Code 现在允许您预览 重命名 更改。重命名时,您可以通过 ⌘Enter (Windows、Linux Ctrl+Enter) 确认新名称,并查看 重构预览 面板。它在差异编辑器中显示待处理的更改,并允许您取消选中/选中单个更改。一旦应用(或中止)重命名,差异编辑器和预览面板将关闭,使您回到当前编辑器中。

Rename preview

主题:GitHub Sharp,字体:FiraCode

打开编辑器数量限制

现在有新的设置来限制一次打开的最大编辑器数量。

  • workbench.editor.limit.enabled:启用此功能(默认关闭)。
  • workbench.editor.limit.perEditorGroup:是否对每个编辑器组或所有组应用限制。
  • workbench.editor.limit.value:最大打开编辑器数量(默认为 10)。

如果启用,当您打开新编辑器时,VS Code 将关闭最近最少使用的编辑器。

下面您可以看到限制设置为 3 时的行为

Open editor limit

主题:Nord

注意: 脏编辑器(具有未保存更改的文件)永远不会自动关闭,但仍计入打开编辑器的总数。

未命名编辑器改进

VS Code 中的未命名编辑器是尚未保存到磁盘的文本缓冲区。您可以将它们打开任意长时间,所有文本内容都会在重启之间存储和恢复。

未命名编辑器标题

过去,未命名编辑器被赋予通用名称,例如 Untitled-1,向上计数。在此版本中,未命名编辑器将使用文档第一行的内容作为编辑器标题,并将通用名称作为描述包含在内

Untitled file title using first line of text

主题:Nord

注意: 如果第一行为空或不包含任何单词,则标题将回退到之前的 Untitled-*

默认语言模式

默认情况下,未命名文件没有配置特定的语言模式。VS Code 有一个设置 files.defaultLanguage,用于为未命名文件配置默认语言。在此版本中,该设置可以采用新值 {activeEditorLanguage},它将动态使用当前活动编辑器的语言模式,而不是固定的默认值。

此外,当您将文本复制并粘贴到未命名编辑器中时,如果文本是从 VS Code 编辑器复制的,VS Code 现在将自动更改未命名编辑器的语言模式

Untitled file language mode dynamically set

主题:One Dark Pro

注意: 如果未命名编辑器已指定语言模式,则粘贴文本不会更改它。

导航最近最少使用的编辑器

在此版本中,现在有一个跨所有编辑器组的最近最少使用 (MRU) 编辑器列表。当编辑器作为活动编辑器打开时,或者当编辑器已经打开时成为新的活动编辑器时,该编辑器被视为最近最少使用。一旦编辑器关闭,它将从列表中删除。

此列表的一个应用是新的 edt mru 选择器,您可以通过新的 视图:按最近最少使用显示所有编辑器 (workbench.action.showAllEditorsByMostRecentlyUsed) 命令打开它

MRU editor list

您可以添加键盘快捷键,以便在不使用鼠标的情况下快速在此选择器中导航。例如,以下是一个按键绑定,使 Ctrl+TabCtrl+Shift+Tab 跨所有组的编辑器导航(而不是像默认按键绑定那样仅在活动组内导航)

[
  {
    "key": "ctrl+tab",
    "command": "workbench.action.quickOpenPreviousRecentlyUsedEditor",
    "when": "!inEditorsPicker"
  },
  {
    "key": "ctrl+shift+tab",
    "command": "workbench.action.quickOpenLeastRecentlyUsedEditor",
    "when": "!inEditorsPicker"
  }
]

如果您想在不使用选择器的情况下导航列表,则有新命令

  • 视图:打开下一个最近最少使用的编辑器 (workbench.action.openNextRecentlyUsedEditor)
  • 视图:打开上一个最近最少使用的编辑器 (workbench.action.openPreviousRecentlyUsedEditor)

为了区分哪些编辑器导航命令使用选择器,哪些不使用选择器,一些现有命令的行为已更改。具体来说,组中最近使用的编辑器 命令不再使用选择器

  • 视图:打开组中下一个最近使用的编辑器 (workbench.action.openNextRecentlyUsedEditorInGroup)
  • 视图:打开组中上一个最近使用的编辑器 (workbench.action.openPreviousRecentlyUsedEditorInGroup)

对于基于选择器的导航,请使用

  • 视图:快速打开组中上一个最近使用的编辑器 (workbench.action.quickOpenPreviousRecentlyUsedEditorInGroup)
  • 视图:快速打开组中最近最少使用的编辑器 (workbench.action.quickOpenLeastRecentlyUsedEditorInGroup)

移动面板

现在可以将面板(包含输出、调试控制台、终端和问题窗格)移动到编辑器的左侧。

视图:切换面板位置 (workbench.action.togglePanelPosition) 命令已删除,取而代之的是以下新命令

  • 视图:将面板移到左侧 (workbench.action.positionPanelLeft)
  • 视图:将面板移到右侧 (workbench.action.positionPanelRight)
  • 视图:将面板移到底部 (workbench.action.positionPanelBottom)

重启时恢复所有窗口

VS Code 用于在启动时恢复窗口的设置已更改为默认恢复所有窗口。如果您想返回以前的行为,请配置 "window.restoreWindows": "one" 以仅打开单个窗口。

保存冲突解决

当您尝试保存在 VS Code 外部或由另一个程序(例如 Git)更改的脏文件时,VS Code 具有内置机制来显示通知

Save conflict dialog with overwrite

动机是通知您,即使文件在文件变脏后被更改,保存也会覆盖磁盘上的内容。选择 比较 按钮可让您查看您的更改以及磁盘上的版本,并覆盖或还原文件。

如果您知道磁盘上的更改可以被覆盖,则通知上现在有一个 覆盖 按钮。您还可以全局、按工作区或文件类型配置 files.saveConflictResolution 以完全禁用此行为。选项为 askUser(默认)或 overwriteFileOnDisk

处理缓慢的保存操作

VS Code 允许扩展程序在将文件保存到磁盘时更改文件的内容。保存时格式化保存时修复 等功能就是示例。但是,保存是一项关键操作,在保存期间执行处理的扩展程序必须快速完成,以便实际的保存操作可以继续进行。“快速”过去是由 VS Code 强制执行的,VS Code 会在超时后取消扩展程序保存操作。该强制执行保证了快速保存,但可能会令人沮丧,因为有时预期的处理不会发生。

在此版本中,我们放弃了基于超时的做法,而是显示进度通知,允许您取消参与保存的扩展程序(“保存参与者”)。该通知让您知道保存操作正在运行,您可以决定是否要等待保存参与者完成。

Save Participant notification

主题:Light+

源代码管理输入

源代码管理视图中的输入框现在使用 Monaco 编辑器。Monaco 编辑器支持有用的功能,例如多光标和移动/复制行命令。

多根资源管理器中的两步折叠

当您使用 多根工作区 时,文件资源管理器中的 折叠文件夹 按钮现在具有两步行为。第一次单击将折叠每个顶级中的所有文件夹,第二次单击将折叠顶级文件夹。搜索视图已经具有此行为。

Two-step File Explorer collapse button

主题:Monokai

基于操作系统颜色方案自动切换主题

Windows 和 macOS 现在支持浅色和深色颜色方案。有一个新设置 window.autoDetectColorScheme,指示 VS Code 监听操作系统颜色方案的更改,并相应地切换到匹配的主题。

要自定义颜色方案更改时使用的主题,您可以使用以下设置设置首选的浅色和深色主题

  • workbench.preferredLightColorTheme
  • workbench.preferredDarkColorTheme

编辑器

控制速览视图焦点

有一个新的设置和命令来控制速览视图最初放置焦点的位置。默认情况下,速览将焦点放在右侧的树上,以便您可以快速导航到引用。对于希望使用速览在编辑器中进行快速代码更改的人来说,初始焦点放在树上不是最佳选择。您现在可以使用 editor.peekWidgetDefaultFocus 设置定义您的首选项,该设置可以设置为 editortree。还有一个新命令 togglePeekWidgetFocus (⌘K F2 (Windows、Linux Ctrl+K F2)) 允许您在速览编辑器和树之间移动焦点。

折叠区域高亮

折叠的代码区域现在更容易发现,并添加了背景高亮。

Fold highlight color

主题:Dark+

该功能由设置 editor.foldingHighlight 控制,颜色可以使用颜色 editor.foldBackground 自定义。

  "workbench.colorCustomizations": {
    "editor.foldBackground": "#355000"
  }

折叠改进

在折叠指示器上单击 Shift + 单击 一次,首先折叠内部范围。再次 Shift + 单击(当所有内部范围都已折叠时)将折叠父范围。再次 Shift + 单击 将展开所有。

Folding with Shift + Click

当在已折叠的范围上使用 折叠 命令 (⌥⌘[ (Windows、Linux Ctrl+Shift+[)) 时,下一个未折叠的父范围将被折叠。

新的换行选项

默认情况下,编辑器通过假设所有字符都具有相同的宽度来计算单词换行符。此假设允许默认算法快速运行,但当使用非等宽字体或在字符宽度不同的脚本中编写文本时,其结果很差。有一个新设置 editor.wrappingStrategy,可以设置为 advanced,让编辑器将单词换行符计算委托给浏览器。

辅助功能

建议小部件改进

建议小部件现在不再使用 ARIA 警报,并正确地向屏幕阅读器指示它已聚焦。这应该可以防止屏幕阅读器意外地妨碍使用。

检测到屏幕阅读器时,editor.accessibilityPageSize 设置为 160

editor.accessibilityPageSize 设置控制编辑器中一次可以被屏幕阅读器读出的行数。但是,使用较大的值会产生性能影响。我们已决定在检测到屏幕阅读器时自动将该值设置为 160 行(并且由于 NVDA 错误,不超过 160 行)。

Linux 辅助功能与 Orca

我们已开始研究使 VS Code 在 Linux 上使用 Orca 屏幕阅读器时具有辅助功能。但是,由于此工作需要 Electron 7,我们希望在下一个稳定版本中取得更多进展。同时,对于 Linux 辅助功能,您可以使用我们的 Insiders 版本并提供反馈。

集成终端

滚动灵敏度

终端的滚动灵敏度现在可以独立于编辑器进行配置,使用新的设置

  • terminal.integrated.mouseWheelScrollSensitivity - 鼠标滚轮滚动乘数(默认为 1)。
  • terminal.integrated.fastScrollSensitivity - 按下 Alt 时的快速滚动乘数(默认为 5)。

调试

简化的初始调试视图

为了简化调试视图的启动,VS Code 现在只显示一个 运行和调试 按钮。不调试运行 操作(并非所有调试器都支持)仍然在调试主菜单中可用。

根据用户反馈,如果您设置了至少一个断点,则断点窗格将显示在起始视图中。

Simplified initial Debug view

调试控制台改进

调试控制台输入

调试控制台输入现在使用当前活动编辑器的语言模式。这意味着调试控制台输入支持语法着色、缩进、自动关闭引号和其他语言功能。

Debug Console input with syntax coloring

输入/输出呈现

我们调整了调试控制台中输入和输出的呈现方式,使其更易于区分。VS Code 仅在输入表达式旁边显示箭头。

Debug Console input with arrow display

调试控制台输入历史记录建议

调试控制台输入框现在自动建议以前输入的条目。文本图标用于区分历史记录建议和其他 IntelliSense 条目。

Debug console history

调试后隐藏调试控制台

有一个新设置 debug.console.closeOnEnd,用于控制调试停止后是否应自动关闭调试控制台。

支持 console.table(...)

调试控制台现在可以显示来自 Node.js console.table(...) API 的输出。

Debug Console table output

加载的脚本视图改进

加载的脚本视图已更新为使用 VS Code 的新树视图。现在,它以与 VS Code 文件资源管理器相同的紧凑形式呈现单子文件夹。此外,现在可以搜索和展开树,就像您键入时一样

Expand as you type in Loaded Scripts view

我们计划在下一个版本中删除 调试:打开加载的脚本 命令,因为它重复了树的“键入时搜索和展开”功能。

启动配置排序和分组

启动配置和复合配置现在支持新的结构化属性 presentation。使用 ordergrouphidden 属性,您可以对调试配置下拉列表和调试快速选择中的配置和复合配置进行排序、分组和隐藏。

例如,launch.json 中的启动配置可以具有以下 presentation 字段

"presentation": {
    "group": "5_tests",
    "order": 10,
    "hidden": false
}

例如,我们已将演示文稿添加到 VS Code 自身的一些启动配置中,以便以更有意义的方式对它们进行分组,并隐藏那些仅是复合启动配置一部分的配置。

Debug view context menu

调试活动栏图标和装饰

根据用户反馈,我们更新了活动栏中的调试图标,以更好地表示 运行和调试。并且在调试时,调试图标上有一个数字装饰,用于显示活动调试会话的计数。

Debug Activity Bar icon showing two debug sessions

任务

用户级别任务

现在在用户设置级别支持在 tasks.json 中声明的任务。如果您有在多个项目中使用的构建脚本,或者如果您不希望任务位于项目文件夹中,则可以将任务添加到用户 tasks.json 文件中。运行 任务:打开用户任务 命令以创建用户级别任务,这些任务将在所有文件夹和工作区中可用。此处仅支持 shellprocess 任务类型。

输入 pickString 标签

如果您使用任务 inputs,则可以为 pickString 输入 options 添加友好的标签

"inputs": [
  {
      "id": "pickAnInputValue",
      "description": "Pick a Value",
      "type": "pickString",
      "options": [
          "first-value",
          {
              "label": "Second Value",
              "value": "second-long-value-that-can-be-simplified-for-display"
          }
      ],
      "default": "first-value"
  }
]

标签将显示为

Task pickString input with label

语言

TypeScript 3.7.5

我们已将捆绑的 TypeScript 版本更新为 3.7.5。此小版本更新包含一些重要的错误修复,包括修复 Windows 上未存储在 C: 驱动器上的项目的 IntelliSense。

默认情况下关闭 HTML 镜像光标

HTML 镜像光标 现在是一个可选择加入的功能。在即将到来的迭代中,我们将继续 改进其实现,以使此功能更易于理解并可用于更多语言。您仍然可以通过打开 html.mirrorCursorOnMatchingTag 来使用此功能。

预览功能

预览功能尚未准备好发布,但功能已足够使用。我们欢迎您在开发期间提供早期反馈。

时间线视图

在此里程碑中,我们在新的时间线视图上取得了进展,并有一个早期预览可以分享。这是一个统一的视图,用于可视化资源(文件、文件夹)的时序事件(例如,Git 提交、文件保存、测试运行等)。要启用时间线视图,您必须使用 Insiders 版本,然后添加以下设置

"timeline.showView": true

下面您可以看到时间线视图显示文件的 Git 提交历史记录

Timeline view

主题:Dark Amethyst

在此早期预览中,时间线视图显示活动文档的 Git 提交历史记录,目前限制为 32 个项目。选择其中一个提交将打开该提交引入的更改的差异视图。扩展程序也将能够 贡献他们自己的时间线源,这些源将显示在此统一的时间线视图中。最终,您还可以选择(筛选)您想在视图中看到的源。

请继续关注,我们为此新功能准备了更多内容。您可以通过订阅 问题 #84297 并关注标记为 'timeline' 标签的问题来跟踪进度。如果您对您想在此视图中看到的其他类型的信息有任何想法,请告诉我们!

搜索编辑器

我们继续开发新的搜索编辑器,此迭代的目标是使搜索编辑器成为主要的搜索体验。为此,我们为配置搜索编辑器的查询实现了 UI

Search Editor UI

主题:Noctis Lilac,字体:Hasklig

现在有几个用于搜索编辑器的命令,您可以将它们绑定到您选择的键盘快捷键

  • search.action.openNewEditor:在活动编辑器组中打开新的搜索编辑器。
  • search.action.openInEditor:将当前搜索结果复制到新的搜索编辑器中。

有关搜索编辑器的更多信息和进一步更新,请参阅 问题 #23931

注意: 搜索编辑器在 Insiders 中默认启用,并且可以通过将 search.enableSearchEditorPreview 设置为 true 在 Stable 中选择加入。

TypeScript 和 JavaScript 的语义高亮

TypeScript 和 JavaScript 的语义高亮支持正在开发中,尚未默认启用。您可以通过添加以下设置来试用它

"editor.semanticHighlighting.enabled": true

启用后,您将看到某些标识符具有新的颜色和样式,并且现在根据其解析的类型进行高亮显示。默认语法 (TextMate) 高亮器将许多标记分类为 variables,这些标记现在被解析为命名空间、类、参数等等。

您可以在导入部分中最好地看到这一点,现在每个导入的符号都使用符号的类型着色

TypeScript semantic highlighting

您可以使用 开发人员:检查编辑器标记和作用域 命令来检查为每个位置计算的语义和语法标记。

新的 JavaScript 调试器

我们一直在开发用于 Node.js 和 Chrome 的新调试器。它在 Insiders 上默认安装,并且可以从 VS Code Stable 中的 Marketplace 安装。您可以通过启用 debug.javascript.usePreview 设置开始将其与现有启动配置一起使用。以下是我们在本月添加的一些新功能。

新的 JS 调试器将自动调试您在新 JavaScript 调试终端中运行的命令,您可以通过 调试:创建 JavaScript 调试终端 命令打开该终端

JavaScript debug terminal

主题:Earthsong,字体:Fira Code

新的调试器还在 package.json 的 scripts 部分中提供了一个 调试 CodeLens,可以运行和调试脚本,而无需额外的配置

JavaScript debug CodeLens

您可以通过 debug.javascript.codelens.npmScripts 设置配置 CodeLens 的可见性和位置(顶部或内联)。

试用一下!如果您在使用新调试器时遇到任何问题,可以在 vscode-js-debug 存储库中提交问题。

将视图从侧边栏移动到面板

正在积极进行工作,以使自定义 VS Code 布局更容易。您可以使用设置测试进度

"workbench.view.experimental.allowMovingToNewContainer": true

启用该设置后,某些视图具有新的上下文菜单项,可在侧边栏和面板之间移动它们。目前,此设置仅影响资源管理器中的大纲视图和扩展程序贡献的视图。您也不能像在侧边栏中那样在面板中组合这些视图。

Outline view moving to panel and back

主题:LaserWave,字体:Cascadia Code

这只是功能的预览,其许多方面可能会发生变化,包括上面提到的限制。欢迎在我们的 Insiders 版本中查看进一步的进度。

关于搜索的注意事项:使用新的通用视图移动方法,旧的搜索视图设置 search.location 和命令 搜索:切换搜索视图位置 (search.action.toggleSearchViewPosition) 正在被弃用。您的设置应自动迁移,但您将需要使用新的通用方法来移动搜索视图。您无需启用上面的实验性预览设置即可使用新的上下文菜单项移动搜索视图。

TypeScript 3.8 beta 支持

尽管 VS Code 在下个月正式发布之前不会捆绑 TypeScript 3.8,但在此迭代中,我们添加了对所有 令人兴奋的新 TypeScript 3.8-beta 功能 的支持。

这些包括

  • JavaScript 和 TypeScript 文件中 私有字段 的 IntelliSense 和语法高亮。
  • JavaScript 和 TypeScript 的调用层次结构支持。
  • 转换为模板字符串重构!

您今天可以通过安装 TypeScript Nightly 扩展程序 轻松试用所有这些新的 TypeScript 3.8 功能。请分享反馈,让我们知道您是否遇到任何 TypeScript 3.8 beta 的错误!

扩展贡献

Java 调试器支持数据断点

Java 调试器 扩展程序现在支持 数据断点,该断点在 VS Code 1.38 中引入。此功能允许您创建在变量值更改时命中的断点。

下面您可以看到当 Owner.telephone 字符串更改时调试器中断

Java Data Breakpoints

Java 调用层次结构视图

Java 语言支持 扩展程序现在支持 调用层次结构 视图,该视图显示来自或到函数的所有调用,并允许您深入了解调用者的调用者和调用的调用。

右键单击符号并选择 速览 > 速览调用层次结构 以查看调用层次结构

Java Call Hierarchy view

远程开发

继续开发 远程开发扩展程序,它允许您使用容器、远程计算机或 Windows Subsystem for Linux (WSL) 作为功能齐全的开发环境。

1.42 中的功能亮点包括

  • 远程 - SSH:改进了对 Windows 服务器的支持,包括自动操作系统检测。
  • WSL:支持 在资源管理器中显示 以打开 WSL 资源的 Windows 资源管理器。
  • 开发容器:预构建的容器映像,其中包括 Git 和 zsh 等依赖项。
  • 转发端口视图:映射、查看和重用 SSH 和容器端口。

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

扩展编写

可重用的 Codicon

对于大多数 VS Code 图标,使用 codicon 图标字体。扩展程序现在可以以简单且声明式的方式重用这些图标

  • vscode.ThemeIcon 类型现在可以使用 codicon 的名称进行实例化。例如,new vscode.ThemeIcon("zap")
  • vscode.MarkdownString 类型现在支持 $(<name>) 内联语法。例如,myMdString.appendMarkdown('Hello $(globe)');。请注意,要在 MarkdownString 中使用 codicon,您必须启用 supportThemeIcons 构造函数参数。
  • 在扩展程序的 package.json 文件中定义的 commands 现在可以使用 codicon 作为其图标。使用内联语法,例如 "icon": "$(zap)"

All available codicons displayed in a hover

主题:Light+

上面的悬停示例正在呈现每个可用的 codicon。悬停是使用下面的代码段创建的,但为了便于阅读,大多数 codicon 名称已从 all 常量中删除。

vscode.languages.registerHoverProvider(
  '*',
  new (class implements vscode.HoverProvider {
    provideHover(doc: vscode.TextDocument, pos: vscode.Position) {
      const all = `$(activate-breakpoints)$(add)...$(zoom-out)`;
      const md = new vscode.MarkdownString(all, true);
      return new vscode.Hover(md, doc.getWordRangeAtPosition(pos));
    }
  })()
);

完成项的插入和替换

在单词末尾触发的完成通常会替换该单词。但是,当在单词内部触发完成时,尚不清楚是否应替换单词末尾。根据扩展程序作者的偏好,用户会获得一种或另一种行为。这并不理想,现在有一个 API 来表达完成项的插入和替换范围。

为此,我们向 CompletionItem#range 添加了一个新的 OR 类型

export class CompletionItem {
  range?: Range | { inserting: Range; replacing: Range };

  //...
}
  1. 如果范围为 undefined,则 VS Code 使用当前单词范围进行 替换,并使用在光标位置裁剪的相同范围进行 插入
  2. 如果范围是简单的 vscode.Range,则 VS Code 知道只有一个位置用于插入或替换。
  3. 如果范围是一个具有 insertingreplacing 范围的对象,则 VS Code 将直接使用它们。

此信息与 editor.suggest.insertMode 设置结合使用,该设置允许用户定义他们的首选项。我们要求扩展程序作者尽快采用此 API,因为我们计划在下一个版本中使插入和替换行为更加可见。

改进的 CallHierarchyProvider

我们对 CallHierarchyProvider#prepareCallHierarchy 进行了微小的更改,使其现在可以返回一个或多个 CallHierarchyItem 元素。当在具有多个重载的元素上请求调用层次结构时,many 选项很有用。

在终端上公开创建选项

Terminal 对象具有一个新的 creationOptions 属性,扩展程序可以使用该属性来识别终端的创建方式。

特定于语言的设置

扩展程序现在可以使用新的配置范围 language-overridable 贡献可以按语言重写的设置。

示例

"contributes": {
    "configuration": {
        "title": "sample",
        "properties": {
            "sample.languageSetting": {
                "type": "boolean",
                "scope": "language-overridable"
            }
        }
    }
}

Configuration API 已增强以支持这些设置。您可以使用 API 并传递必要的 languageId 来读取和更新这些设置。

示例

/**
 * Read language configuration.
 */
const textDocumentConfiguration = vscode.workspace.getConfiguration('sample', {resource, languageId});
textDocumentConfiguration.get('languageSetting');

/**
 * Override configuration under language
 */
textDocumentConfiguration.update('languageSetting', false, ConfigurationTarget.Global, true);

/**
 * Listen language configuration changes
 */
workspace.onDidChangeConfiguration(e => {
    if(e.affectsConfiguration('sample.languageSetting',  {resource, languageId}) {
    }
});

有关更多信息,请参阅 Configuration API

扩展视图上下文菜单

现在,您可以使用新的菜单位置 extension/context 将命令贡献到扩展视图中的扩展程序的上下文菜单。

示例

"contributes": {
    "commands": [
        {
            "command": "extension.helloWorld",
            "title": "Hello World"
        }
    ],
    "menus": {
        "extension/context": [
            {
                "command": "extension.helloWorld",
                "group": "2_configure",
                "when": "extensionStatus==installed",
            }
        ]
    }
}

Extensions view context menu

当命令运行时,扩展程序的 ID 作为参数传递。

示例

vscode.commands.registerCommand('extension.helloWorld', extensionId => {
  vscode.window.showInformationMessage(extensionId);
});

支持以下预定义的上下文,您可以在命令的 when 条件中使用这些上下文

  • extensionStatus==installed
  • isBuiltinExtension

DebugConfigurationProvider 挂钩用于访问替换变量

调试的扩展 API 在 DebugConfigurationProvider 上提供了一个挂钩 resolveDebugConfiguration,可用于在调试配置传递到调试适配器之前对其进行验证。由于此挂钩在 变量被替换之前 调用,因此验证代码可以轻松地向调试配置添加更多变量,并且仍然可以及时替换它们。

这种方法可能会使在 resolveDebugConfiguration 挂钩中使用 已解析的变量值 变得困难,例如,验证或实现仅存在于扩展程序中的功能(而不是在调试适配器中,替换后的值 可用)。有关示例,请参阅 问题 #85206。一些扩展程序已开始自行替换变量(这通常是不完整的,因为它不涵盖所有情况)。

从用户的角度来看,这令人困惑。在调试配置中,某些属性变量可以使用(因为它们在变量替换发生后在调试适配器中处理),而某些属性变量不能使用(因为它们在扩展中处理,此时变量替换尚未发生)。Issue #87450 是后一个问题的很好例子。

在本里程碑中,我们通过在 DebugConfigurationProvider 中添加第二个钩子 resolveDebugConfigurationWithSubstitutedVariables 来解决此问题,该钩子接收已替换所有变量的调试配置。

随着这个新 API 的可用性,我们要求所有调试扩展作者仔细检查他们当前 DebugConfigurationProvider.resolveDebugConfiguration 的实现,并将所有不引入新变量,但可以从对已替换变量进行操作中获益的代码移动到新的方法 resolveDebugConfigurationWithSubstitutedVariables 中。

在扩展中实现调试适配器

现有的调试扩展 API 支持注册 DebugAdapterDescriptorFactory 以多种方式运行调试适配器。

作为外部进程

vscode.debug.registerDebugAdapterDescriptorFactory('mock', {
  createDebugAdapterDescriptor: _session => {
    return new vscode.DebugAdapterExecutable('mockDebug.exe');
  }
});

作为网络会话

vscode.debug.registerDebugAdapterDescriptorFactory('mock', {
  createDebugAdapterDescriptor: _session => {
    return new vscode.DebugAdapterServer(12345, 'localhost');
  }
});

在本里程碑中,我们添加了第三种变体,其中可以提供调试适配器的“内联”实现

vscode.debug.registerDebugAdapterDescriptorFactory('mock', {
  createDebugAdapterDescriptor: _session => {
    return new vscode.DebugAdapterInlineImplementation(new InlineDebugAdapter());
  }
});

这消除了通过基于流的机制与适配器通信的需要,并简化了开发,因为适配器在扩展内部运行,并且可以作为 VS Code 扩展调试的一部分轻松进行调试。

内联实现(例如,上面的 InlineDebugAdapter)需要实现 调试适配器协议。由于我们不想在 VS Code 的扩展 API 中包含完整的调试适配器协议,因此我们引入了该协议的最小子集。接口 vscode.DebugAdapter 只有两个方法,一个用于将 DAP 消息传递给适配器(handleMessage),另一个用于侦听从适配器接收的 DAP 消息(onDidSendMessage)。

基于此接口,调试适配器的实现将从以下源代码开始

class InlineDebugAdapter implements vscode.DebugAdapter {
  private sendMessage = new vscode.EventEmitter<DebugProtocol.ProtocolMessage>();
  private sequence: 1;

  readonly onDidSendMessage: vscode.Event<DebugProtocol.ProtocolMessage> = this.sendMessage
    .event;

  handleMessage(message: DebugProtocol.ProtocolMessage): void {
    switch (message.type) {
      case 'request':
        const request = <DebugProtocol.Request>message;
        switch (request.command) {
          case 'initialize':
            const response: DebugProtocol.Response = {
              type: 'response',
              seq: this.sequence++,
              success: true,
              request_seq: request.seq,
              command: request.command
            };
            this.sendMessage.fire(response);
            break;
          // many more requests needs to be handled here...
          default:
            break;
        }
        break;
      case 'response':
        break;
      case 'event':
        break;
    }
  }

  dispose() {
    // clean up resources
  }
}

由于调试适配器协议(作为 node 模块 vscode-debugprotocol 提供)是 vscode.DebugAdapter 接口的兼容超集,因此如果您需要完整的协议并想完全自行实现调试适配器,则可以导入该模块。

一个更简单的替代方案是(继续)使用我们的调试适配器的默认实现,它作为 node 模块 vscode-debugadapter 提供。从 1.38.0-pre.4 版本开始,此模块中引入的 DebugSession(或 LoggingDebugSession)与扩展 API 中定义的接口 vscode.DebugAdapter 兼容。

使用此 API,可以轻松地像这样使用现有的调试适配器实现

vscode.debug.registerDebugAdapterDescriptorFactory('mock', {
  createDebugAdapterDescriptor: _session => {
    return new vscode.DebugAdapterInlineImplementation(new MockDebugSession());
  }
});

有关详细信息,请参阅 Mock debug 示例。

注意: 在此版本中,我们已完成用于创建调试适配器的扩展 API。因此,我们宣布我们将在 3 月份的版本中删除对 debuggers 贡献点的两个已弃用属性的支持

  • adapterExecutableCommand - 请改用扩展 API vscode.DebugAdapterDescriptorFactoryvscode.DebugAdapterExecutable。Mock debug 示例 展示了如何使用 API
  • enableBreakpointsFor - 请改用 breakpoints 贡献点。需要在 package.json 中完成转换。

如果当前的(已弃用)JSON 看起来像这样

"contributes": {
  "debuggers": [{
    "type": "csharp",
    // ...
    "enableBreakpointsFor": [ "csharp", "razor" ]
    // ...
  }]

转换将是

"contributes": {
  "breakpoints": [
    { "language": "csharp" },
    { "language": "razor" }
  ],
  "debuggers": [{
    "type": "csharp",
    // ...
  }]

我们建议受影响的扩展在 2 月份调整其实现以适应新的 API,以便我们有足够的时间在 3 月份之前修复问题。

提议的扩展 API

每个里程碑都附带新的建议 API,扩展作者可以试用它们。与往常一样,我们渴望收到您的反馈。以下是您试用建议 API 需要做的事情

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

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

添加工作区编辑元数据

现在 VS Code 中的“重构预览”支持附带了一个新的可选 API 提案。它允许您对工作区编辑的更改进行分类。例如,您可以定义更改是否需要用户确认或添加诸如“重命名字符串和注释中的内容”之类的描述。该提案可在 issue #77728 中跟踪,其当前设计围绕 WorkspaceEditMetadata 接口。

语义高亮

如果您有兴趣为您的语言添加语义高亮,语义高亮概述 总结了概念和新的 API。

身份验证提供程序

某些扩展需要向其他服务进行身份验证。issue #88309 中的提案将使扩展可以注册身份验证提供程序,其他扩展可以访问这些提供程序,从而为执行身份验证提供通用机制。

时间线提供程序

扩展程序很快就能够将它们自己的源添加到新的 时间线视图 中。有兴趣添加您自己的时间线源吗?查看 issue #84297 中的这个早期提案,并提供您的任何反馈。

Documentation.Refactoring 贡献点

建议的 documentation.refactoring 贡献点允许扩展程序为其重构提供文档。用户可以在请求重构时选择查看此文档

Refactoring documentation

建议的贡献点使扩展程序可以通过使用命令来控制其文档的显示方式

"contributes": {
  "documentation": {
    "refactoring": [
      {
        "title": "Learn more about JS/TS refactorings",
        "when": "typescript.isManagedFile",
        "command": "_typescript.learnMoreAboutRefactorings"
      }
    ]
  }
}
  • title — 向用户显示的文档操作的标签。
  • when — When 子句,用于何时显示文档。
  • command — 显示文档的命令。例如,此命令可以打开网页或直接在 VS Code 中显示文档。

Issue #86788 跟踪提案的状态。

自定义编辑器的备份和热退出钩子

在此迭代中,我们继续迭代建议的 自定义编辑器 API。我们本月的主要调查是如何为自定义编辑器启用 热退出Issue #88719 涵盖了我们在支持热退出时遇到的一些挑战以及我们考虑的一些方法。

此调查的结果是在 WebviewCustomEditorEditingDelegate 接口上添加了一个新的可选 backup 方法。VS Code 会在资源更改后一秒左右调用此方法。在 backup 方法内部,扩展程序应持久化资源在当前状态。通常,这意味着将资源写入工作区存储文件夹。然后,当重新加载编辑器时,它应检查是否存在任何持久化备份,然后再从工作区本身加载资源。

我们将在下一次迭代中继续迭代自定义编辑器 API。

复杂完成标签

我们正在改进 CompletionItem API,以适应需要提供限定名称、导入路径、返回类型和其他信息的复杂完成项。信息必须预先提供,而不是稍后解析。提供的信息将以内联方式显示在建议小部件中。我们将在下一次迭代中迭代 当前提案。同时,我们正在考虑向建议小部件添加状态栏,以解决一些 UI 和可发现性挑战。我们期待您对 API 的反馈。

Complex completion label

主题:Nord,字体:Input Mono

诊断错误现在可以具有与其错误代码关联的链接。当提供链接时,它将显示在“问题”面板、内联错误视图和诊断错误悬停中。当我们继续在下一次迭代中处理此功能时,您可以在 issue #11847 中提供反馈。

Diagnostic with link

语言服务器协议

3.15 版本的 语言服务器协议 现已可用。我们还发布了 VS Code LSP 客户端用 Node.js 编写的 LSP 服务器 的相应 npm 模块。最新版本的库包含语义令牌的建议规范和实现。

LSP 网站现在托管了 语言服务器索引格式规范 的初步版本以及相应的 LSIF 概述

浏览器支持

将文件拖放到编辑器中

在浏览器中使用 VS Code 时,您现在可以将本地文件拖放到编辑器区域中,以使用文件的内容将它们作为脏(未保存)文件打开。

In-browser support for drag and drop

新命令

快捷键 命令 命令 ID
将面板左移 workbench.action.positionPanelLeft
将面板右移 workbench.action.positionPanelRight
将面板移至底部 workbench.action.positionPanelBottom
打开下一个最近使用的编辑器 workbench.action.openNextRecentlyUsedEditor
打开上一个使用的编辑器 workbench.action.openPreviousRecentlyUsedEditor
在组中打开下一个最近使用的编辑器 workbench.action.openNextRecentlyUsedEditorInGroup
在组中打开上一个使用的编辑器 workbench.action.openPreviousRecentlyUsedEditorInGroup
打开最近使用的编辑器选择器 workbench.action.showAllEditorsByMostRecentlyUsed
通过选择器打开上一个使用的编辑器 workbench.action.quickOpenPreviousRecentlyUsedEditor
⌃Tab (Windows, Linux Ctrl+Tab) 通过选择器打开组中上一个使用的编辑器 workbench.action.quickOpenPreviousRecentlyUsedEditorInGroup
通过选择器打开最少使用的编辑器 workbench.action.quickOpenLeastRecentlyUsedEditor
⌃⇧Tab (Windows, Linux Ctrl+Shift+Tab) 通过选择器打开组中最少使用的编辑器 workbench.action.quickOpenLeastRecentlyUsedEditorInGroup
开发者:重启扩展主机 workbench.action.restartExtensionHost

工程

TSLint 到 ESLint 的迁移

VS Code 主要用 TypeScript 编写。除了编译器之外,我们还使用 linting 来强制执行某些样式和工程规则。过去,我们一直使用 TSLint 来完成这项任务,但大约在一年前,TSLint 的维护者 宣布弃用它,转而支持 ESLint。

在此里程碑中,我们已迁移到 ESLint - 包括我们的 lint 配置 和我们的 自定义规则。最后但并非最不重要的一点是,我们还更新了 yo code 扩展生成器,以便新的 TypeScript 扩展也由 ESLint 检查。

如果您在自己的项目中使用 TSLint,我们创建了一个 将 TSLint 迁移到 ESLint 指南,以帮助您切换到 ESLint。

使用 TypeScript 3.8-beta 构建 VS Code

VS Code 现在使用 TypeScript 3.8 beta 版本构建。

支持在 Shadow DOM 中托管 Monaco Editor

我们修复了围绕鼠标处理和动态 CSS 的各种问题,以便现在可以将 Monaco Editor 托管在 Shadow DOM API shadow root 中。

新文档

容器

有新文章介绍了如何使用 Microsoft Docker 扩展创建 容器。您将找到容器化 Node.jsASP.NET Core 应用程序、推送到 容器注册表 以及将 容器部署 到云端的教程。

Docker extension

值得注意的修复

  • 12058:定期保存 UI 状态以防止在关闭时丢失
  • 79205:当连接到不区分大小写平台上的区分大小写文件系统时,资源管理器树未显示正确的内容
  • 83543:仅针对活动会话显示调试程序位置
  • 85057:将对话框详细信息移动到自定义对话框中的描述行
  • 86445:无法通过热键同时删除多个“监视”调试变量
  • 88240:创建许多“监视”下拉表达式速度缓慢
  • 89057:让只读编辑器显示问题
  • 89405:文本文件:不要为只读模型报告为脏

感谢

最后但同样重要的是,衷心感谢以下人士帮助使 VS Code 变得更好

对我们的问题跟踪的贡献

vscode 的贡献

vscode-eslint 的贡献

language-server-protocol 的贡献

vscode-languageserver-node 的贡献

debug-adapter-protocol 的贡献

vscode-vsce 的贡献

vscode-js-debug 的贡献

vscode-generator-code 的贡献

vscode-azurecli 的贡献

vscode-emmet-helper 的贡献

localization 的贡献

超过 800 名 Cloud + AI Localization 社区成员正在使用 Microsoft Localization Community Platform (MLCP),其中约有 170 名活跃贡献者参与 Visual Studio Code 项目。我们感谢您的贡献,无论是提供新的翻译、为翻译投票还是提出流程改进建议。

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

  • Bosnian (Latin, Bosnia and Herzegovina): Sead Mulahasanović, Adnan Rizvan, Ismar Bašanović.
  • Bulgarian: Andreyka Lechev.
  • Czech: Michal Černík.
  • Danish: Lasse Stilvang.
  • Dutch: Philip Denys, Lemuel Gomez, Dennis Hummel, Gideon van de Laar.
  • English (United Kingdom): Martin Littlecott, Alexander Ogilvie, Krishna Regar, Alonso Calderon, Daniel Imms, Kamalsinh Solanki.
  • Finnish: Tuula P.
  • French: Antoine Griffard, Thierry DEMAN-BARCELÒ, Edouard Choinière, Joel Monniot, Rodolphe NOEL, Lucas A., Alain, BUFERNE, Xavier Laffargue, Mohamed Sahbi, DJ Dakta.
  • German: Pascal Wiesendanger, Marvin Heilemann, jan-nitsche, Jakob von der Haar, Michael Richter.
  • Greek: Valantis Kamayiannis, Θοδωρής Τσιρπάνης.
  • Hebrew: Ariel Bachar.
  • Hindi: Kiren Paul, Niraj Kumar, Preeti Madhwal, Jaadu Jinn, Mahtab Alam.
  • Hungarian: József Cserkó, Kiss Attila Csaba, Krisztián Papp.
  • 简体中文: Yizhi Gu, Tingting Yi, Justin Liu, ick, Charles Dong, Peng Zeng, Tony Xia, 斌 项, 普鲁文, paul cheung, 张锐, Zhiqiang Li, Yixing Zheng, AlexiZz Nakido, 冉 耀隆, Chow David, Sheng Jiang, yungkei fan, Yao Rui, Joel Yang, 钟越, Chenglong Wei, 一斤瓜子, Yiting Zhu, Alexander ZHANG, YanJun Sun, Libing Yang, ZHENGCHENG CHEN, 张 任飞, 光宇 朴, 石岩 詹, 舜杰 杨, WJ Wang, Siam Chen.
  • 繁體中文: Winnie Lin, 船長, Alan Tsai, TingWen Su.
  • Indonesian: Eriawan Kusumawardhono, Aldila, Arif Fahmi, Laurensius Dede Suhardiman, Mychael Go, Christian Elbrianno, Septian Adi.
  • Italian: Alessandro Alpi, Luigi Bruno.
  • Japanese: Takayuki Fuwa, Seiichi Ariga, Koichi Makino, Yoshihisa Ozaki, 貴康 内田, Ishii Shun, Kyohei Uchida, TENMYO Masakazu, Aya Tokura.
  • Korean: Hongju.
  • Latvian: Andris Vilde.
  • Norwegian: Frode Aarebrot, Anders Stensaas, Thomas Ødegård, Thomas Isaksen.
  • Polish: Makabeus Orban, Mateusz Redynk, Kacper Łakomski, Piotr Rysak, Wojciech Maj, Oskar Janczak, Szymon Seliga, Franx Bar, Marcin Anonimus.
  • Portuguese (Brazil): Marcelo Fernandes, Arthur Lima, Albert Tanure, Loiane Groner, Nylsinho Santos, Alessandro Trovato, Pudda, Matheus Vitti Santos, Rodrigo Crespi, Wellington OStemberg, Roberto Fonseca, Felipe Galante, Rodrigo Tavares, Alessandro Fragnani, Felipe Nascimento, Alexis Lopes.
  • Portuguese(Portugal): Francisco Osorio, Luís Chaves, Ricardo Sousa Vieira, João Fernandes.
  • Romanian: Tiberiu Frățilă, LaServici, Dan Ichim.
  • Russian: Vadim Svitkin, Николай Соколовский, Дмитрий Кирьянов, Baturin Valery.
  • Serbian Cyrillic: Dusan Milojkovic.
  • Spanish: José María Aguilar, Ricardo Estrada Rdez, JOSE AHIAS LOPEZ PORTILLO, Gustavo Gabriel Gonzalez, Camilo Sasía.
  • Swedish: Pelle Alstermo.
  • Tamil: Rajesh Waran, MUTHU VIJAY, Sankar Raj, Kadhireshan S, saravanan ramesh, Aravindh JANAKIRAMAN, Pandidurai R, Madhu Chakravarthy, Madhu Maha.
  • Turkish: Mehmet Yönügül, Özgür ERSOY, mehmetcan Gün, Misir Jafarov, Isa Inalcik, Fırat Eşki, Gökberk Nur, Safa Selim.
  • Ukrainian: Serhii Shulhin, Arthur Murauskas, Oleksandr Krasnokutskyi, Фомін Тарас.
  • Vietnamese: Dat Nguyen, Vương, Van-Tien Hoang, Dao Ngo, ng-hai.