参加你附近的 ,了解 VS Code 中的 AI 辅助开发。

2018 年 6 月(版本 1.25)

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

下载:Windows:x64 | Mac:Intel | Linux 64 位:deb rpm tarball | 32 位:deb rpm tarball


欢迎来到 Visual Studio Code 2018 年 6 月发布版。我们非常激动地将上个月宣布为预览版的几个功能转为稳定版。一些主要亮点包括

如果您想在线阅读这些发行说明,请访问 code.visualstudio.com 上的更新页面。
您还可以观看由云开发大使 Brian Clark 制作的 1.25 版本亮点视频

发布说明按以下与 VS Code 重点领域相关的部分进行排列。以下是一些进一步的更新

  • 工作台 - 将文件和文件夹拖放到空资源管理器中,统一历史记录导航。
  • 编辑器 - 智能建议选择,代码片段占位符转换。
  • 语言 - 文件夹重命名时更新 JS/TS 导入,CSS 伪选择器和伪元素。
  • 预览功能 - Windows 上的用户安装,Windows 和 Linux 的自定义工具和菜单栏。
  • 扩展创作 - 贡献网格编辑器布局,预选完成项。
  • 新命令 - 新的网格编辑器布局命令和键盘快捷键。

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

工作台

网格编辑器布局

您现在可以垂直和水平排列编辑器,并且可以并排显示超过 3 个编辑器

Grid Editor Layout

为了支持灵活的布局,您可以创建空的编辑器组。默认情况下,关闭编辑器组的最后一个编辑器也会关闭该组本身,但您可以使用新设置 workbench.editor.closeEmptyGroups: false 更改此行为。

Grid Empty

在新的 视图 > 编辑器布局 菜单中有一组预定义的编辑器布局

Grid Editor Layout Menu

在侧边打开的编辑器(例如,通过单击编辑器工具栏上的 拆分编辑器 操作)默认将在活动编辑器的右侧打开。如果您更喜欢在活动编辑器下方打开编辑器,请配置新设置 workbench.editor.openSideBySideDirection: down

有许多用于仅使用键盘调整编辑器布局的新命令,但如果您更喜欢使用鼠标,拖放是在任何方向上快速拆分编辑器的方法

Grid Editor Drag and Drop

由于编辑器组现在不受限制,并且可以以多种方式排列,因此 已打开的编辑器 视图不再将编辑器组标记为 左侧中间右侧。相反,编辑器组现在根据其创建时间用数字标记。最后创建的编辑器组将始终位于 已打开的编辑器 列表的末尾。我们发现这是一个很好的模型,可以在布局中移动编辑器组时最大限度地减少列表的更改

Grid Open Editors View

有关对扩展和主题的影响,请参阅扩展创作部分,并查看新命令以获取新的网格编辑器布局命令列表。

专业提示:如果您在悬停于拆分编辑器的工具栏操作上时按住 Alt 键,它将提供向另一个方向拆分的选项。这是快速拆分到右侧或底部的快捷方式。

Grid Alt Click

由于网格布局的工作,我们改变了 居中编辑器布局 的行为方式

  • 现在可以在居中编辑器布局内打开任何编辑器布局。因此,它为用户提供了更大的灵活性。
  • 居中编辑器布局不再根据布局自动启用和禁用。因为这有时会令人困惑并导致意外行为。

大纲视图

大纲视图已脱离预览,现在默认启用。它是文件资源管理器底部的一个独立部分。展开时,它将显示当前活动编辑器的符号树。

大纲视图有不同的 排序方式 模式,可选的光标跟踪,并支持通常的打开手势。它还包括一个输入框,可在您键入时查找或筛选符号。错误和警告也会显示在大纲视图中,让您一眼就能看到问题的位置。

Outline view

有几个大纲视图设置,允许您启用/禁用图标并控制错误和警告的显示(默认全部启用)

  • outline.icons - 切换是否用图标渲染大纲元素。
  • outline.problems.enabled - 在大纲元素上显示错误和警告。
  • outline.problems.badges - 切换是否为错误和警告使用徽章。
  • outline.problems.colors - 切换是否为错误和警告使用颜色。

还有一个为扩展作者准备的新 API

便携模式

VS Code 现在支持便携模式,其中 VS Code 创建和维护的所有数据都位于安装目录附近。这使您可以轻松地在不同环境之间移动 VS Code 设置,例如通过 U 盘或文件共享。便携模式在 Windows 和 Linux 的 ZIP 下载以及 macOS 的常规应用程序下载中都受支持。点击此处了解更多信息。

将文件和文件夹拖放到空的文件资源管理器中

现在可以将文件、文件夹和 VS Code 工作区文件拖放到空的资源管理器中以打开它们。

empty drop

历史记录导航

在 VS Code 中导航输入历史记录现在更加自然和一致。您可以使用 UpArrow (history.showPrevious) 和 DownArrow (history.showNext) 键在搜索视图、问题视图以及编辑器、终端和 Web 视图中的查找小部件中导航输入框。

为简单和一致起见,我们将导航输入框的默认键绑定从 UpArrowDownArrow 分别更改为 Ctrl+UpArrow(在 macOS 上为 Cmd+UpArrow)和 Ctrl+DownArrow(在 macOS 上为 Cmd+DownArrow)。您始终可以通过更新 ⌘↑ (Windows, Linux Ctrl+Up)⌘↓ (Windows, Linux Ctrl+Down)⌘↑ (Windows, Linux Ctrl+Up) 键绑定来恢复以前的行为。

注意:我们还删除了所有现有的18 个历史记录导航命令,并将它们统一为两个命令 history.showPrevioushistory.showNext

编辑器

悬停显示选项

一些用户不希望悬停建议覆盖编辑器中的文本,现在可以通过三个额外的设置来自定义编辑器悬停。使用 editor.hover.enabled 切换编辑器悬停,使用 editor.hover.delay 自定义悬停显示前的延迟时间,使用 editor.hover.sticky 更改鼠标移过时悬停是否应保持可见。

子词支持

我们为子词导航和子词删除提供了新命令。这些命令将在驼峰式大小写位置和下划线(_)处停止。

editor sub-word navigation

以下是您可以如何绑定它们的示例

{ "key": "ctrl+alt+right",          "command": "cursorWordPartRight",
                                       "when": "textInputFocus" },
{ "key": "ctrl+shift+alt+right",    "command": "cursorWordPartRightSelect",
                                       "when": "textInputFocus" },
{ "key": "ctrl+alt+left",           "command": "cursorWordPartStartLeft",
                                       "when": "textInputFocus" },
{ "key": "ctrl+shift+alt+left",      "command": "cursorWordPartStartLeftSelect",
                                       "when": "textInputFocus" },
{ "key": "ctrl+alt+backspace",       "command": "deleteWordPartLeft",
                                       "when": "textInputFocus && !editorReadonly" },
{ "key": "ctrl+shift+alt+backspace", "command": "deleteWordPartRight",
                                       "when": "textInputFocus && !editorReadonly" },

建议选择

语言智能感知提供程序通常知道哪些建议是最好的,从这个版本的 VS Code 开始,它们现在可以预先选择建议。有一个新的API用于预选建议,当可用时,编辑器将选择该建议,而不是列表中的第一个。

suggestion selection

代码片段占位符转换

代码片段终于支持占位符转换了。占位符转换类似于变量转换,但更具动态性。转换在从一个占位符切换到下一个占位符时应用,其语法规则为:${int/regex/format_string/opts}

下面是一个将“Hello World”替换为其德语对应词的示例

"HelloWorld": {
  "prefix": "say_hello",
  "body": "${1} ${2} -> ${1/Hello/Hallo/} ${2/World/Welt/}"
}

snippet placeholder transformation

有关更多详细信息以及如何释放转换的全部潜力,请参阅代码片段语法

集成终端

性能改进

集成终端的解析器已从头开始重写,以增强 ANSI 兼容性,并将处理传入数据的速率提高了约 30%。这是社区对 xterm.js 的上游贡献。

粗体文本亮色设置

终端目前将所有粗体文本转换为使用亮色变体。这在不同的终端模拟器之间有些不一致,并且主要是出于历史原因。您现在可以关闭这种自动转换,以允许对粗体文本使用非亮色。

{
  "terminal.integrated.drawBoldTextInBrightColors": false
}

这是社区对 xterm.js 的上游贡献。

调试

浮动调试工具栏

在上一个里程碑中,我们引入了一个新设置,用于将调试工具栏停靠在调试视图中("debug.toolBarLocation": "docked")。在这个里程碑中,我们审查了用户反馈,并尝试改进浮动工具栏的行为("debug.toolBarLocation": "floating")。

来自反馈的共识是,工具栏应该始终可见(无论哪个视图处于活动状态),并且它不应该隐藏任何东西(例如编辑器标签页)。因此,我们通过允许将浮动工具栏拖动到编辑器区域来“解放”它。这应该有助于那些大量使用编辑器标签页但又希望始终看到调试工具栏的用户。

debug toolbar

由于现有的 debug.hideActionBar 设置由 debug.toolBarLocation 设置的值 hidden 处理,我们现在移除 debug.hideActionBar

语言

TypeScript 2.9.2

VS Code 现在附带 TypeScript 2.9.2。这个小版本修复了许多错误并提高了稳定性。您可以在这里阅读完整的变更集。

文件夹重命名时更新导入路径

上一个版本在移动或重命名 JavaScript 或 TypeScript 文件时带来了自动更新导入路径的功能。现在,当您移动或重命名目录时,此功能也同样有效。默认情况下,VS Code 会提示您是否可以更新路径。您可以使用 javascript.updateImportsOnFileMove.enabledtypescript.updateImportsOnFileMove.enabled 设置来控制提示行为。

有效值为

  • "prompt" - 默认值。询问是否应更新路径。
  • "always" - 总是自动更新路径。
  • "never" - 不自动更新路径,也不提示。

层级化 Markdown 文档符号

内置的 Markdown 支持使用新的 DocumentSymbol API 来确保 Markdown 标题在大纲视图中正确嵌套。

The Outline view for a Markdown document

来自 MDN 的新 CSS 伪选择器和伪元素

在四月发布版中,我们开始从 Mozilla Developer Network 获取数据,以支持最新的 CSS/SCSS/Less。在此版本中,我们添加了以下伪选择器/伪元素

  • :defined | :dir | :focus-visible | :focus-within | :placeholder-shown
  • ::-moz-range-progress | ::-moz-range-thumb | ::-moz-range-track | ::-webkit-progress-inner-value | ::grammar-error | ::placeholder

CSS Pseudo Selectors and Elements

提高浏览器兼容性数据的准确性

感谢 mdn/browser-compat-data,我们将 MDN 的这一部分引入了我们的 CSS/SCSS/Less 自动补全功能中

CSS justify-items

justify-items 属性以及许多其他用于 CSS 网格布局的 CSS 属性,自 Edge 16 版本以来已受支持。通过从 MDN 获取数据,VS Code 保持了 CSS 功能的浏览器兼容性数据的最新状态。

优雅处理未知的 @ 规则

使用 CSS 预处理器的人可能会使用自定义的 at-rules(@ 规则),这些规则在构建时会编译成有效的 CSS。以前,VS Code 无法解析或处理此类 at-rules。在此版本中,我们对 at-rules 提供了更好的支持,以便它们

  • 由于它们仍然遵循 CSS 语法,因此可以获得正确的语法高亮。
  • 不再在不正确的位置生成错误。
  • 生成正确的错误,这些错误可以通过 css.lint.unknownAtRules 来控制。

CSS Unknown At-Rules

扩展

扩展视图的新默认视图

到目前为止,扩展视图的默认视图包含一个用于 已安装 扩展的部分和另一个用于 推荐 扩展的部分。已安装但已禁用的扩展与已启用的扩展混在一起,使得与后者交互变得困难。我们现在提供了一个新的默认设置,其中 已启用 的扩展首先显示,然后是 推荐 扩展部分,底部是一个折叠的 已禁用 扩展部分。

Default Extensions View

您始终可以使用扩展视图中的上下文菜单来重新排序、折叠/展开或隐藏这些部分中的任何一个。您还可以在 视图 菜单中使用 打开视图... 命令来显示/隐藏这些部分。

Customize Extensions View

忽略扩展推荐

我们根据您打开的文件和您的工作区环境向您推荐扩展。我们理解并非每个推荐都适合您的项目,因此您现在可以忽略特定的推荐。

要忽略一个推荐,请单击扩展项以打开详细信息窗格,然后按 忽略推荐 按钮。被忽略的推荐将不再向您推荐。

Dismiss Recommendations

管理工作区推荐

您已经可以使用 extensions.json 文件中的工作区推荐来为您的工作区用户配置一组要推荐的扩展。管理这些推荐现在变得更加容易。单击扩展视图中的任何扩展以打开详细信息窗格。然后,您可以使用下面的新命令添加推荐或禁止某些您不希望为您的工作区用户推荐的扩展。

  • 扩展:添加到推荐扩展(工作区)
  • 扩展:添加到推荐扩展(工作区文件夹)
  • 扩展:忽略推荐扩展(工作区)
  • 扩展:忽略推荐扩展(工作区文件夹)

语言包

VS Code 现在仅附带英语作为显示语言,其他语言依赖于可从 VS Code Marketplace 安装的语言包。如果您在 VS Code 1.23 或 1.24 版本提示时安装了语言包,您应该不会注意到这个变化。如果您从旧版本的 VS Code 升级或进行全新安装,您将看到一个提示,要求安装您操作系统 UI 语言的语言包。可以从 Marketplace 使用扩展视图(⇧⌘X (Windows, Linux Ctrl+Shift+X))安装其他语言包。

总结一下

  • 如果您从 VS Code 1.22 或更早版本更新到 1.25,显示语言将是英语,并且 VS Code 会提示您安装操作系统 UI 语言的语言包(如果 Marketplace 中有这样的语言包)。
  • 如果您从 1.23 或 1.24 更新到 1.25,您应该已经被提示安装 UI 语言的语言包。如果您这样做了,1.25 将正常启动,并且显示语言将呈现为您选择的 UI 语言。如果您没有安装语言包,那么您将被提示安装。
  • 全新安装 VS Code 1.25 或更高版本时,如果 Marketplace 中有合适的语言包,将会提示您安装。

预览功能

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

新设置编辑器

在这个里程碑中,我们继续致力于开发一个用于编辑设置的图形用户界面。它仍然是一个预览版,但如果您想尝试一下,可以使用 首选项:打开设置(预览) 命令打开它。我们希望听到您的任何反馈 - 您可以在这个 GitHub 问题上留下您的意见。

New Settings Editor

与上个月相比,一些新的变化是

  • 一个“目录”(TOC),将设置组织成新的类别。
  • 设置行的布局经过了清理和刷新。
  • “重置”按钮已被移除 - 将设置编辑为其默认值将从 settings.json 中移除它。

另外,请尝试 "workbench.settings.settingsSearchTocBehavior" 设置,看看在搜索设置时“目录”的三种不同选项(showhidefilter),并告诉我们您更喜欢哪个选项。

Windows 用户设置

Windows 用户现在有一个新的 预览 安装包可用,它不需要管理员权限即可安装。这个安装包还提供了更流畅的后台更新体验。此功能目前仅在 Insiders 版本中可用,因为我们希望在七月份获得更多反馈,以便为我们的稳定版用户提供最佳体验。

以下是 Insiders 用户安装包的下载链接

Windows/Linux 的自定义标题栏和菜单

Windows 和 Linux 用户现在可以使用 window.titleBarStyle 设置值为 custom,并且我们实现了一个新的菜单栏来与之匹配。该设置尚未默认启用,但可以通过 window.titleBarStyle 设置开启。

在 Windows 和 Linux 上启用该设置后,旧的菜单栏将被一个新的菜单栏替换,该菜单栏将与您的浅色或深色主题相匹配。新的菜单栏还带来了一些增强功能,例如使用箭头键进行顶层键盘导航。最后,产品中的所有菜单也将与新的菜单栏相匹配。

Custom title bar and menu bar

我们将继续改进新的菜单和标题栏,并解决标记为 workbench-titleworkbench-menu 标签的问题。

终端:动态纹理图集

已添加一个实验性设置,为终端画布启用新的“动态纹理图集”。这改变了终端用于存储字符字形的缓存策略。字形不再是默认背景下的固定集合,而是根据需要添加到纹理图集中,而不管使用的背景是什么。这应该会减少终端首次启动的时间,减少不使用默认背景的字符的渲染时间,并提高整体渲染性能。

这最终将成为默认设置,目前您可以通过以下设置选择加入

{
  "terminal.integrated.experimentalTextureCachingStrategy": "dynamic"
}

这是社区对 xterm.js 的上游贡献。

扩展开发

网格编辑器布局:ViewColumn

为了支持新的网格编辑器布局功能,只有少数 API 调整。最值得注意的是,有一个新的 ViewColumn.Beside 操作,可用于在活动编辑器旁边打开一个编辑器。使用网格编辑器布局后,打开的编辑器数量不再有限制,因此使用该选项将始终在活动编辑器旁边创建一个新编辑器,除非旁边已经有空间。根据用户设置 workbench.editor.openSideBySideDirection,这可以是在编辑器的右侧或下方。

文本编辑器和 webview 的 ViewColumn 值仍然按照它们在编辑器区域中从左到右出现的顺序排列,如下所示

Grid Editor Numbering

尽管 ViewColumn 枚举已扩展到 ViewColumn.Nine,但只要 TextEditor 包含在网格中,它就总是会有一个数字作为视图列分配。

当一个编辑器组被移动或一个编辑器组被关闭时,onDidChangeTextEditorViewColumn 事件会像以前一样触发。

网格编辑器布局:新命令

尽管为了支持新的网格编辑器布局,对 API 的更改很小,但扩展仍然可以通过利用添加的新命令来使用网格编辑器布局(有关完整概述,请参阅新命令部分)。

新的 vscode.setEditorLayout 值得解释一下,因为它允许您通过单个命令和参数更改整个编辑器布局。该布局被描述为一个对象,具有一个初始的(可选的)方向(0 = 水平,1 = 垂直)和一个编辑器 groups 数组。每个编辑器组可以有一个 size 和另一个编辑器 groups 数组,这些组将与方向正交布局。如果提供了编辑器组的大小,它们的总和必须为 1,才能应用于每行或每列。

2x2 网格示例

{
  "orientation": 0,
  "groups": [
    { "groups": [{}, {}], "size": 0.5 },
    { "groups": [{}, {}], "size": 0.5 }
  ]
}

编辑器默认在活动的 ViewColumn 中打开

如果在打开文本编辑器或 webview 时没有提供 ViewColumn,VS Code 现在默认在当前活动的编辑器组中打开,而不是在 ViewColumn.One 中打开。如果您想保留以前的行为,只需在打开时传入 ViewColumn.One

预选的完成项

提供完成项的扩展现在可以将其标记为“预选”。这在存在许多补全项但某些补全项更可能被选择时很有用。例如,当用户正在分配已知的变量类型时。此功能还允许扩展选择更常用的补全项,例如优先选择 console.log 而不是 console.dirxml

API 的新增内容是 'CompletionItem#preselect: boolean',当存在多个预选项时,将选择排名最高的那一个。

文档符号

为了充分利用新的大纲视图树,扩展应修改其 DocumentSymbolProviders 以返回 DocumentSymbols。这是一个新添加的类型,专为大纲树的需求而定制。它支持表示文档符号的层次结构,并允许区分定义符号的范围和标识符号的选择范围。


         +--/**
         |   * Some Comment
<range>--|   */
         |  export function fooFunction() {
         |                  +----------+
         +--}                   |
                                |
                          <selection range>

只读文件系统提供程序

文件系统提供程序现在可以注册为 readonly。VS Code 将通过禁用来自该文件系统提供程序的资源上的所有修改命令来尊重此标志。编辑器也将以只读模式打开这些只读资源。

自定义视图

树视图可见性

您现在可以使用以下新添加的属性和事件来检查树视图是否可见,这些属性和事件已添加到 TreeView

/**
 * `true` if the [tree view](#_TreeView) is visible otherwise `false`.
 */
readonly visible: boolean;

/**
 * Event that is fired when [visibility](TreeView.visible) has changed
 */
readonly onDidChangeVisibility: Event<TreeViewVisibilityChangeEvent>;

/**
 * The event that is fired when there is a change in [tree view's visibility](#_TreeView.visible)
 */
export interface TreeViewVisibilityChangeEvent {

  /**
   * `true` if the [tree view](#_TreeView) is visible otherwise `false`.
   */
  readonly visible: boolean;

}

选择侦听器

树视图中添加了一个新的选择更改事件,用于侦听选择更改

/**
 * Event that is fired when the [selection](#_TreeView.selection) has changed
 */
readonly onDidChangeSelection: Event<TreeViewSelectionChangeEvent<T>>;

/**
 * The event that is fired when there is a change in [tree view's selection](#_TreeView.selection)
 */
export interface TreeViewSelectionChangeEvent<T> {

  /**
   * Selected elements.
  */
  readonly selection: T[];

}

显示和聚焦

您现在可以通过在调用 reveal API 时将 focus 选项设置为 true 来在树视图中显示和聚焦一个元素。

reveal(element: T, options?: { select?: boolean, focus?: boolean }): Thenable<void>;

新主题颜色

有两个新的主题颜色,用于空编辑器组的背景色,这是支持网格编辑器布局工作的一部分

  • editorGroup.emptyBackground:空编辑器组的背景颜色。
  • editorGroup.focusedEmptyBorder:被聚焦的空编辑器组的边框颜色。

Grid Editor Group Background

  • editorPane.background:在居中编辑器布局左右两侧可见的编辑器窗格的背景颜色。

Editor Pane Background

已弃用的主题颜色

随着网格编辑器布局功能的引入,主题颜色 editorGroup.background 不再受支持。

重命名命令

重命名命令 (editor.action.rename) 现在可以带有一个 Uri 和一个 Position 来调用,编辑器将相应地启动重命名操作。例如

vscode.commands.executeCommand('editor.action.rename', [
  vscode.Uri.file('/my/file.abc'),
  new vscode.Position(14, 7)
]);

DiagnosticTag

诊断标签允许扩展为诊断附加额外的元数据。VS Code 使用这些元数据来调整这些诊断的呈现方式。

const diag = new vscode.Diagnostic(new Range(0, 0, 0, 10), 'Unused');
diag.tags = [vscode.Diagnostic.Unnecessary];

DiagnosticTag.Unnecessary 表示该诊断是针对未引用或无法访问的源代码。任何用 DiagnosticTag.Unnecessary 标记的源代码都将以淡化方式呈现。淡化程度由 "editorUnnecessaryCode.opacity" 主题颜色控制。例如,"editorUnnecessaryCode.opacity": "#000000c0" 将以 75% 的不透明度呈现代码。对于高对比度主题,使用 "editorUnnecessaryCode.border" 主题颜色来为不必要的代码加下划线,而不是淡化它。

WebviewPanel.active 和 WebviewPanel.visible

Webview 面板有两个新的只读属性

  • active - 跟踪面板何时获得焦点。
  • visible- 跟踪面板何时在屏幕上。

Webview 持久化

webview API 已扩展,支持保存和恢复 webview 的状态。

webview 上下文中的 getStatesetState API 允许 webview 保存状态并获取一个状态对象,即使 webview 本身进入后台标签页,该状态对象也会被持久化。

// Inside a webview's JavaScript
const vscode = acquireVsCodeApi();

// Look up old state (will be undefined if no state is set)
const oldState = vscode.getState();

// Update the persisted state.
// You can save off any json serializable object.
if (oldState) {
  vscode.setState({ count: oldState.count + 1 });
} else {
  vscode.setState({ count: 1 });
}

此外,扩展可以注册一个 WebviewPanelSerializer,允许给定类型的 webview 在 VS Code 重启后持久化。要启用此功能,扩展必须在其激活方法中调用 vscode.window.registerWebviewPanelSerializer

export function activate(context: vscode.ExtensionContext) {
    ...

    vscode.window.registerWebviewPanelSerializer('myWebviewType', {
        async deserializeWebviewPanel(webviewPanel: vscode.WebviewPanel, state: any) {
            // `state` is the state persisted using `setState` inside the webview
            console.log(`Got state: ${state}`);

            new MyWebview(webviewPanel);
        }
    });
}

扩展还必须添加一个 onWebviewPanel 激活事件

"activationEvents": [
    ...,
    "onWebviewPanel:catCoding"
]

新的 webview 持久化 API 已在webview 扩展创作页面上进行了记录。示例 webview 扩展也演示了如何使用这些新 API。

语言包:最小化翻译

VS Code 现在将使用语言包本身的语言向用户提示可用的语言包。以下是一个示例,用简体中文和英文推荐一个简体中文语言包。

Language Pack recommendation

此显示要求语言包作者在其语言包中翻译以下最少的翻译字符串

{
   showLanguagePackExtensions: localize('showLanguagePackExtensions', "Search language packs in the Marketplace to change the display language to {0}."),
   searchMarketplace: localize('searchMarketplace', "Search Marketplace"),
   installAndRestartMessage: localize('installAndRestartMessage', "Install language pack to change the display language to {0}."),
   installAndRestart: localize('installAndRestart', "Install and Restart")
}

语言服务器协议检查器

使用 vscode-languageclient 的语言服务器可以指定一个设置 [langId].trace.server 以获得日志记录支持。尽管生成的日志对于理解 VS Code 和语言服务器之间的 LSP 通信很有价值,但日志可能很长且难以从中提取有用信息。

有了新的 LSP 检查器,您现在有了一个帮助理解 LSP 日志的工具:https://msdocs.cn/language-server-protocol/inspector/

在检查器中,您可以

  • 扫描语言客户端和服务器之间的请求、响应和通知。
  • 使用搜索或预定义过滤器筛选日志以定位有用信息。

LSP Inspector

检查器对于调试语言扩展很有用。您可以要求用户在他们的错误报告中附加 LSP 日志,并使用检查器来分析日志。

语言服务器指南已更新,包含了关于日志记录支持和 LSP 检查器功能的章节。

语言服务器:端到端测试

一个关于端到端测试的章节已被添加到语言服务器指南中。

与对语言服务器组件进行单元测试相比,端到端测试在 VS Code 中打开一个工作区,在扩展主机中启动语言扩展,并对语言扩展的真实行为进行断言。这使得模拟工作区和 VS Code 状态变得容易,并检查真实的 VS Code 行为。

语言服务器:指南更新

语言服务器指南已进行更新。主要改进包括

  • 如上所述的日志记录和测试部分。
  • 解释语言服务器协议、语言服务器以及它们之间的关系。
  • 更新了 LSP 和语言服务器的插图。
  • 更新了 lsp-sample 示例代码。
  • 更多对 LSP 网站的引用。

提议的扩展 API

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

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

请注意,您不能发布使用提议 API 的扩展。我们很可能会在下一个版本中进行破坏性更改,我们绝不希望破坏现有扩展。

WorkspaceEdit 可以创建/重命名/删除文件

我们添加了一个提议的 API,扩展了 WorkspaceEdit,使其可以用于创建、重命名和删除文件或文件夹。这对于复杂的重构很有用,例如在重命名类型时重命名文件,但也应该能够实现其他场景。

本地重命名事件

我们正在提议两个在重命名发生前后触发的事件。它们分别被称为 onWillRenameFileonDidRenameFile,它们允许扩展对重命名做出反应或参与其中。

QuickInput API

新的 QuickPickInputBox API 允许比现有的 showQuickPickshowInputBox API 更灵活地收集用户输入。使用新的 API,您可以创建一个输入对象的新实例,然后根据您的用例在其上注册事件处理程序并设置属性

export namespace window {
  export function createQuickPick<T extends QuickPickItem>(): QuickPick<T>;
  export function createInputBox(): InputBox;
}

示例扩展中有 QuickInput API 的使用示例。

多步输入示例

Multi-step input sample

如果现有的 showQuickPickshowInputBox API 不够灵活,请使用新的 QuickPickInputBox API,否则请继续使用现有的 API,因为它们可以更快地完成工作。

使用问题 #53327 进行反馈和讨论。

终端渲染器

正在提出一个终端“渲染器”的概念。终端渲染器基本上是终端面板内的一个终端实例,但它没有后台进程,而是由 扩展 充当进程。这对于在 VS Code 中实现一个终端多路复用器很有用,其中扩展可以访问某个进程的输入/输出管道,然后将这些管道连接到终端渲染器。Live Share 扩展计划使用这个新 API 来提高其共享终端支持的稳定性和可维护性。

export namespace window {
  export function createTerminalRenderer(name: string): TerminalRenderer;
}

export interface TerminalRenderer {
  name: string;
  dimensions: TerminalDimensions | undefined;
  readonly maximumDimensions: TerminalDimensions | undefined;
  readonly terminal: Terminal;
  readonly onDidAcceptInput: Event<string>;
  readonly onDidChangeMaximumDimensions: Event<TerminalDimensions>;
  write(text: string): void;
}

export interface TerminalDimensions {
  readonly columns: number;
  readonly rows: number;
}

另一个用例示例是扩展创建自己的 REPL。这是通过扩展侦听每个按键并在按下 Enter 键时采取行动来实现的

const shell = vscode.window.createTerminalRenderer('My Extension REPL');
shell.write('Type and press enter to echo the text\r\n\r\n');
shell.terminal.show();

let line = '';
shell.onDidAcceptInput(data => {
  if (data === '\r') {
    shell.write(`\r\necho: "${line}"\r\n\n`);
    line = '';
  } else {
    line += data;
    shell.write(data);
  }
});

跟踪活动终端

我们正在为集成终端提出新的扩展 API,使得可以跟踪活动终端,类似于 window.activeTextEditorwindow.onDidChangeActiveTextEditor

export namespace
  export const activeTerminal: Terminal | undefined;
  export const onDidChangeActiveTerminal: Event<Terminal | undefined>;
}

Terminal.onData 已重命名

Terminal.onData 已重命名为 onDidWriteData,以与我们的命名指南保持一致

export interface Terminal {
  onDidWriteData: Event<string>;
}

定义链接允许定义提供程序返回带有定义的附加元数据

export interface DefinitionLink {
  /**
   * Span of the symbol being defined in the source file.
   *
   * Used as the underlined span for mouse definition hover. Defaults to the word range at
   * the definition position.
   */
  origin?: Range;

  /**
   * The resource identifier of the definition.
   */
  uri: Uri;

  /**
   * The full range of the definition.
   *
   * For a class definition for example, this would be the entire body of the class definition.
   */
  range: Range;

  /**
   * The span of the symbol definition.
   *
   * For a class definition, this would be the class name itself in the class definition.
   */
  selectionRange?: Range;
}

VS Code 使用此附加信息来改善 转到定义 操作的用户体验。

要使用 DefinitionLinkDefinitionProvider 目前必须实现一个 provideDefinition2 方法。一旦 DefinitionLink API 稳定,我们计划移除 provideDefinition2 并更新常规的 DefinitionProvider.provideDefinition 方法,以允许返回 DefinitionLink

新命令

命令 命令 ID
⌘K ⌘\ (Windows, Linux Ctrl+K Ctrl+\) 将编辑器拆分到通过 openSideBySideDirection 配置的正交方向 workbench.action.splitEditorOrthogonal
显示活动编辑器组中已打开的编辑器 workbench.action.showEditorsInActiveGroup
⌃⌘9 (Windows, Linux Shift+Alt+9) 将活动编辑器移动到最后一个编辑器组 workbench.action.moveEditorToLastGroup
⌘K ↑ (Windows, Linux Ctrl+K Up) 向上移动活动编辑器组 workbench.action.moveActiveEditorGroupUp
⌘K ↓ (Windows, Linux Ctrl+K Down) 向下移动活动编辑器组 workbench.action.moveActiveEditorGroupDown
聚焦最后一个编辑器组 workbench.action.focusLastEditorGroup
聚焦第一个编辑器组 workbench.action.firstEditorInGroup
⌘W (Windows Ctrl+F4, Linux Ctrl+W) 关闭活动编辑器组(将把打开的编辑器合并到相邻组中) workbench.action.closeGroup
关闭所有编辑器组 workbench.action.closeAllEditorGroups
关闭活动编辑器组及其编辑器 workbench.action.closeEditorsAndGroup
⌘K ⌘\ (Windows, Linux Ctrl+K Ctrl+\) 向上拆分活动编辑器 workbench.action.splitEditorUp
⌘K ⌘\ (Windows, Linux Ctrl+K Ctrl+\) 向下拆分活动编辑器 workbench.action.splitEditorDown
⌘K ⌘\ (Windows, Linux Ctrl+K Ctrl+\) 向左拆分活动编辑器 workbench.action.splitEditorLeft
⌘K ⌘\ (Windows, Linux Ctrl+K Ctrl+\) 向右拆分活动编辑器 workbench.action.splitEditorRight
将所有编辑器组的编辑器合并到活动编辑器组中 workbench.action.joinAllGroups
⌘4 (Windows, Linux Ctrl+4) 聚焦第四个编辑器组(如果需要,将创建一个新的编辑器组) workbench.action.focusFourthEditorGroup
⌘5 (Windows, Linux Ctrl+5) 聚焦第五个编辑器组(如果需要,将创建一个新的编辑器组) workbench.action.focusFifthEditorGroup
⌘6 (Windows, Linux Ctrl+6) 聚焦第六个编辑器组(如果需要,将创建一个新的编辑器组) workbench.action.focusSixthEditorGroup
⌘7 (Windows, Linux Ctrl+7) 聚焦第七个编辑器组(如果需要,将创建一个新的编辑器组) workbench.action.focusSeventhEditorGroup
⌘8 (Windows, Linux Ctrl+8) 聚焦第八个编辑器组(如果需要,将创建一个新的编辑器组) workbench.action.focusEighthEditorGroup
将活动编辑器移动到左侧编辑器组 workbench.action.moveEditorToLeftGroup
将活动编辑器移动到右侧编辑器组 workbench.action.moveEditorToRightGroup
将活动编辑器移动到上方编辑器组 workbench.action.moveEditorToAboveGroup
将活动编辑器移动到下方编辑器组 workbench.action.moveEditorToBelowGroup
⌘K ⌘← (Windows, Linux Ctrl+K Ctrl+Left) 聚焦左侧的编辑器组 workbench.action.focusLeftGroup
⌘K ⌘→ (Windows, Linux Ctrl+K Ctrl+Right) 聚焦右侧的编辑器组 workbench.action.focusRightGroup
⌘K ⌘↑ (Windows, Linux Ctrl+K Ctrl+Up) 聚焦顶部的编辑器组 workbench.action.focusAboveGroup
⌘K ⌘↓ (Windows, Linux Ctrl+K Ctrl+Down) 聚焦底部的编辑器组 workbench.action.focusBelowGroup
在左侧创建一个新的编辑器组 workbench.action.newEditorGroupLeft
在右侧创建一个新的编辑器组 workbench.action.newEditorGroupRight
在顶部创建一个新的编辑器组 workbench.action.newEditorGroupAbove
在底部创建一个新的编辑器组 workbench.action.newEditorGroupBelow
切换到编辑器布局:单列 workbench.action.editorLayoutSingle
切换到编辑器布局:两列 workbench.action.editorLayoutTwoColumns
切换到编辑器布局:三列 workbench.action.editorLayoutThreeColumns
切换到编辑器布局:两行 workbench.action.editorLayoutTwoRows
切换到编辑器布局:三行 workbench.action.editorLayoutThreeRows
切换到编辑器布局:二乘二网格 workbench.action.editorLayoutTwoByTwoGrid
切换到编辑器布局:两列(下) workbench.action.editorLayoutTwoColumnsBottom
切换到编辑器布局:两列(右) workbench.action.editorLayoutTwoColumnsRight
切换到编辑器布局:居中 workbench.action.editorLayoutCentered

新的 layoutEditorGroups 命令

layoutEditorGroups 命令允许您创建一个编辑器组布局并为其分配一个快捷键。该布局被描述为一个对象,具有一个初始的(可选的)方向(0 = 水平,1 = 垂直)和一个编辑器 groups 数组。每个编辑器组可以有一个 size 和另一个编辑器 groups 数组,这些组将与方向正交布局。如果提供了编辑器组的大小,它们的总和必须为 1,才能应用于每行或每列。例如

{
  "key": "Ctrl+0",
  "command": "layoutEditorGroups",
  "args": {
    "orientation": 1,
    "groups": [{ "size": 0.2 }, { "size": 0.6 }, { "size": 0.2, "groups": [{}, {}] }]
  }
}

这将产生以下布局

Grid Editor Layout Applied

已移除的命令

命令 ID 替代方案
workbench.action.showEditorsInFirstGroup 改用 showEditorsInActiveGroup
workbench.action.showEditorsInSecondGroup 改用 showEditorsInActiveGroup
workbench.action.showEditorsInThirdGroup 改用 showEditorsInActiveGroup
workbench.action.moveEditorToSecondGroup 改用 workbench.action.moveEditor* 命令
workbench.action.moveEditorToThirdGroup 改用 workbench.action.moveEditor* 命令
workbench.action.openLastEditorInGroup 改用 lastEditorInGroup
workbench.action.openFolderAsWorkspaceInNewWindow 改用 duplicateWorkspaceInNewWindow
editor.debug.action.toggleColumnBreakpoint 改用 toggleInlineBreakpoint

历史记录导航命令

命令 ID 替代方案
search.history.showPrevious 改用 history.showPrevious
search.history.showNext 改用 history.showNext
search.replaceHistory.showPrevious 改用 history.showPrevious
search.replaceHistory.showNext 改用 history.showNext
search.history.showPreviousIncludePattern 改用 history.showPrevious
search.history.showNextIncludePattern 改用 history.showNext
search.history.showPreviousExcludePattern 改用 history.showPrevious
search.history.showNextExcludePattern 改用 history.showNext
find.history.showPrevious 改用 history.showPrevious
find.history.showNext 改用 history.showNext
workbench.action.terminal.findWidget.history.showPrevious 改用 history.showPrevious
workbench.action.terminal.findWidget.history.showNext 改用 history.showNext
editor.action.extensioneditor.showPreviousFindTerm 改用 history.showPrevious
editor.action.extensioneditor.showNextFindTerm 改用 history.showNext
editor.action.webvieweditor.showPreviousFindTerm 改用 history.showPrevious
editor.action.webvieweditor.showNextFindTerm 改用 history.showNext
repl.action.historyPrevious 改用 history.showPrevious
repl.action.historyNext 改用 history.showNext

新文档

新的 Python Flask 教程

有一个新的在 Visual Studio Code 中使用 Flask 教程,展示了如何在 VS Code 中快速创建、编辑和调试 Python Flask Web 应用程序。

更新的网站部署教程

我们更新了将静态网站部署到 Azure 教程,该教程介绍了如何使用Azure 存储创建和部署静态网站。通过Azure 存储扩展提供的新功能,网站部署得到了简化。

显著变化

  • 35361:macOS high sierra 中原生窗口标签功能有限
  • 40158:修复多会话情况下的断点验证 UI
  • 42726:打开文件:如果提供绝对路径,无法打开名称中带空格的文件
  • 49591:在工具栏中添加“全部关闭”按钮作为编辑器操作
  • 51200:Linux 上的进程监视器显示错误的进程负载
  • 51440:允许用鼠标中键关闭通知

感谢

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

vscode 的贡献

vscode-vsce 的贡献

language-server-protocol 的贡献

vscode-node-debug 的贡献

vscode-chrome-debug-core 的贡献

vscode-chrome-debug 的贡献

localization 的贡献

Transifex VS Code 项目团队中有超过 800 名成员,每月约有 100 名活跃贡献者。我们感谢您的贡献,无论是提供新的翻译、对翻译进行投票,还是提出流程改进建议。

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

  • 法语: Antoine Griffard, Quentin BRETON。
  • 意大利语: Andrea Dottor, Emilie Rollandin, Aldo Donetti, Luigi Bruno, Piero Azi, Marco Dal Pino, Alessandro Alpi, Emanuele Ricci, Lorthirk, Riccardo Cappello。
  • 德语: Ettore Atalan。
  • 西班牙语: Alejandro Medina, Alberto Poblacion, José M. Aguilar。
  • 日语: Shunya Tajima, Satoshi Kajiura, Seiji Momoto, yoshioms, Hiroyuki Mori, Yuki Ueda, Yano Naoki, Yuichi Nukiyama。
  • 简体中文: Joel Yang, pluwen, Yurui Zhang, Simon Chan, YF, Vicey Wang。
  • 繁体中文: Duran Hsieh, Winnie Lin, Alan Liu, Alan Tsai, Will 保哥, Han Lin。
  • 韩语: Kyunghee Ko。
  • 俄语: Ivan Kuzmenko。
  • 保加利亚语:Любомир Василев。
  • 匈牙利语: Tar Dániel, Dóczi Dominik。
  • 葡萄牙语(巴西): Danilo Dantas, Otacilio Saraiva Maia Neto, Roger Figueiredo, Lucas Miranda, Rafael Oliveira, Yehoshua Oliveira, Bruno Sonnino, Roberto Fonseca。
  • 土耳其语: Adem Coşkuner, Burak Karahan, Koray Sarıtaş。
  • 荷兰语: RubenJacobse, Gerald Versluis, Maurits Kammer。
  • 芬兰语: Feetu Nyrhinen, Jussi Palo, Petri Niinimäki。
  • 希腊语: Nickolaos Platides, Theodore Tsirpanis, George M, Christos Koutsiaris。
  • 印度尼西亚语: Wildan Mubarok, Laurensius Dede Suhardiman, Joseph Aditya P G, G-RiNe Project, Adiyat Mubarak。
  • 拉脱维亚语: kozete。
  • 波兰语: Patryk Brejdak, Iwona Kubowicz, Sebastian Baran, Lukasz Woznicki, Mateusz Przybyłowicz。
  • 瑞典语: Eugen Cazacu。
  • 乌克兰语: Fedir Gordiienko, SergZ, Bogdan Surai。
  • 越南语: Vuong, Hung Nguyen, Thanh Phu, Brian Nguyen。
  • 克罗地亚语: Nikša Mihaica, Bruno Vego。
  • 英语(英国): Matthew John Cheetham。