尝试以扩展 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 上的更新页面。
您还可以观看 Cloud Developer Advocate Brian Clark 制作的 1.25 版发布亮点视频

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

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

内部版本:想尽快看到新功能?您可以下载每晚内部版本,并在最新更新可用时立即试用。获取最新 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 设置,例如通过 USB 驱动器或文件共享。Windows 和 Linux 的 ZIP 下载以及 macOS 的常规应用程序下载都支持便携模式。单击此处了解更多信息。

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

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

empty drop

历史导航

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

为了简单性和一致性,我们将导航输入框的默认键盘绑定从 上箭头下箭头 分别更改为 Ctrl+上箭头(或 macOS 上的 Cmd+上箭头)和 Ctrl+下箭头(或 macOS 上的 Cmd+下箭头)键。您始终可以通过更新 ⌘↑ (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" },

建议选择

语言 IntelliSense 提供程序通常知道哪些建议是最佳的,在此版本的 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 伪选择器和伪元素

在 4 月份的版本中,我们开始从 Mozilla 开发者网络获取数据,以获得最新的 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

自版本 16 以来,Edge 中已支持 justify-items 属性以及 CSS Grid Layout 的许多其他 CSS 属性。通过从 MDN 获取数据,VS Code 使 CSS 功能的浏览器兼容性数据保持最新。

优雅处理未知规则

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

  • 由于仍遵守 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 升级或全新安装,您将看到提示安装您的 OS UI 语言的语言包。可以使用扩展视图 (⇧⌘X (Windows, Linux Ctrl+Shift+X)) 从市场安装其他语言包。

总结一下

  • 如果您从 VS Code 1.22 或更旧版本更新到 1.25,显示语言将是英语,并且如果市场上有所需的语言包,VS Code 将提示您安装 OS UI 语言的语言包。
  • 如果您从 1.23 或 1.24 更新到 1.25,您应该已经收到安装 UI 语言语言包的提示。如果已安装,1.25 将正常启动,并且显示语言将显示为所选的 UI 语言。如果您没有安装语言包,则会提示您安装。
  • 全新安装 VS Code 1.25 或更高版本时,如果市场上有所需的语言包,将提示您安装语言包。

预览功能

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

新设置编辑器

在此里程碑中,我们继续开发用于编辑设置的 GUI。它仍然是预览版,但如果您想尝试一下,可以使用“首选项:打开设置(预览)”命令打开它。我们很乐意听取您的任何反馈 - 您可以在此 GitHub 问题中留言。

New Settings Editor

与上个月相比,一些新变化包括

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

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

Windows 用户设置

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

以下是 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,这可以是编辑器的右侧或下方。

文本编辑器和 Web 视图的 ViewColumn 值仍然按编辑器区域中从左到右的出现顺序排列,如下所示

Grid Editor Numbering

尽管 ViewColumn 枚举已扩展到 ViewColumn.Nine,但只要 TextEditor 包含在网格中,它就始终具有分配为视图列的数字。

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

网格编辑器布局:新命令

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

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

2x2 网格的示例

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

默认情况下在活动 ViewColumn 中打开编辑器

现在,在打开文本编辑器或 Web 视图时,如果未提供 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 时将焦点选项设置为 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) 现在可以与 UriPosition 一起调用,编辑器将相应地启动重命名操作。例如

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

Web 视图面板有两个新的只读属性

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

Web 视图持久性

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

Web 视图上下文中的 getStatesetState API 允许 Web 视图保存状态并获取一个持久化对象,即使 Web 视图本身进入后台选项卡也会持久化。

// 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,允许给定类型的 Web 视图在 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"
]

新的 Web 视图持久化 API 已在Web 视图扩展创作页面上进行了文档说明。示例 Web 视图扩展也演示了如何使用这些新 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,因为这些 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
切换到编辑器布局:2x2 网格 workbench.action.editorLayoutTwoByTwoGrid
切换到编辑器布局:两列 (底部) workbench.action.editorLayoutTwoColumnsBottom
切换到编辑器布局:两列 (右侧) workbench.action.editorLayoutTwoColumnsRight
切换到编辑器布局:居中 workbench.action.editorLayoutCentered

layoutEditorGroups 命令

layoutEditorGroups 命令允许您创建编辑器组布局并为其分配键盘绑定。布局被描述为一个对象,其中包含初始(可选)方向(0 = 水平,1 = 垂直)和其中的编辑器数组。每个编辑器组可以具有大小和另一个与方向正交布局的编辑器数组。如果提供了编辑器组大小,它们的总和必须为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。