尝试以扩展 VS Code 中的代理模式!

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 更改在将鼠标移到悬停内容上时是否应保持其可见。

子词支持

我们新增了子词导航和子词删除的命令。这些命令会在驼峰式命名 (camelCase) 的位置和下划线 (_) 处停止。

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 功能的浏览器兼容性数据为最新状态。

对未知 At 规则的优雅处理

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

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

CSS Unknown At-Rules

扩展

扩展视图的新默认视图

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

Default Extensions View

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

Customize Extensions View

忽略扩展推荐

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

要忽略一个推荐,请点击扩展项打开详情面板,然后按下忽略推荐按钮。被忽略的推荐将不再向您推荐。

Dismiss Recommendations

管理工作区推荐

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

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

语言包

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

总结如下

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

预览功能

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

新设置编辑器

在这个里程碑中,我们继续致力于开发一个用于编辑设置的图形用户界面。它仍然是一个预览版,但如果您想尝试一下,可以使用首选项:打开设置(预览)命令打开它。我们希望听到您的任何反馈——您可以将其留在这个 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 Storage 创建和部署静态网站。借助 Azure Storage 扩展提供的新功能,网站部署得到了简化。

显著变化

  • 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。