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月版本。我们很高兴将上个月宣布为预览版的多项功能推向稳定版。主要亮点包括:
- 网格编辑器布局 - 自定义水平和垂直编辑器布局。
- 大纲视图 - 文档的符号树大纲和导航。
- 便携模式 - 从 USB 闪存驱动器或文件共享运行或复制您的 VS Code 设置。
- 悬停显示选项 - 控制悬停信息的显示。
- 子单词导航 - 快速在 camelCase 单词中导航。
- 浮动调试工具栏 - 始终显示调试工具栏,而不会隐藏编辑器选项卡。
- 扩展视图改进 - 轻松查看已启用、已禁用和推荐的扩展。
- 预览:设置编辑器 - 现在包含一个“目录”来组织设置。
- 语言服务器协议检查器 - 扩展作者可以可视化 LSP 协议流量。
- 新的 Python Flask 教程 - 使用 VS Code 创建和调试 Python Flask Web 应用程序。
如果您想在线阅读这些发行说明,请访问 code.visualstudio.com 上的更新页面。
您还可以查看 Cloud Developer Advocate Brian Clark 制作的 1.25 版本 亮点视频。
发布说明按以下与 VS Code 重点领域相关的部分进行排列。以下是一些进一步的更新
- 工作区 - 将文件和文件夹拖放到空白的资源管理器中,统一历史记录导航。
- 编辑器 - 智能建议选择,代码片段占位符转换。
- 语言 - 重命名文件夹时更新 JS/TS 导入,CSS 伪选择器和元素。
- 预览功能 - Windows 用户安装,Windows 和 Linux 的自定义工具和菜单栏。
- 扩展开发 - 贡献网格编辑器布局,预选完成项。
- 新命令 - 新的网格编辑器布局命令和键盘快捷键。
Insiders:想尽快看到新功能吗?您可以下载每夜更新的 Insiders 构建版本,并第一时间尝试最新的更新。有关最新的 Visual Studio Code 新闻、更新和内容,请在 Twitter 上关注我们 @code!
工作台
网格编辑器布局
您现在可以水平和垂直排列编辑器,并且可以并排显示超过 3 个编辑器。

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

新的 **视图** > **编辑器布局** 菜单中提供了一组预定义的编辑器布局。

默认情况下,在侧边打开的编辑器(例如,通过单击编辑器工具栏的 **拆分编辑器** 操作)将会在活动编辑器右侧打开。如果您更倾向于在活动编辑器下方打开编辑器,请配置新设置 workbench.editor.openSideBySideDirection: down。
有许多 新命令 可以仅通过键盘调整编辑器布局,但如果您更喜欢使用鼠标,拖放是任意方向拆分编辑器的快速方法。

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

有关对扩展和主题的影响,请参阅“扩展开发”部分,并参阅“新命令”以获取新的网格编辑器布局命令列表。
专业提示:如果您在鼠标悬停在拆分编辑器的工具栏操作上时按住
Alt键,它将提供拆分到另一个方向的选项。这是快速拆分到右侧或底部的便捷方法。

由于网格布局工作,我们更改了 **居中文档布局** 的行为。
- 现在可以在居中文档布局中打开任何编辑器布局。因此,这为用户提供了更大的灵活性。
- 居中文档布局不再根据布局自动启用和禁用。因为这有时会令人困惑并导致意外行为。
大纲视图
大纲视图已取消预览,现在默认启用。它是文件资源管理器底部的独立部分。展开后,它将显示当前活动编辑器的符号树。
大纲视图具有不同的 **排序方式** 模式、可选的光标跟踪,并支持常规的打开手势。它还包含一个输入框,您可以在键入时查找或过滤符号。错误和警告也会在大纲视图中显示,让您一眼就能看到问题的所在。

有几个大纲视图设置允许您启用/禁用图标并控制错误和警告的显示(所有默认启用)。
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 工作区文件拖放到空白的资源管理器中以打开它们。

历史记录导航
在 VS Code 中,输入历史记录的导航现在更加自然和一致。您可以使用 UpArrow (history.showPrevious) 和 DownArrow (history.showNext) 键导航搜索和问题视图中的输入框,以及编辑器、终端和 Web 视图中的查找小部件。
为了简洁和一致性,我们将导航输入框之间的默认快捷键从 UpArrow 和 DownArrow 更改为 Ctrl+UpArrow(macOS 上为 Cmd+UpArrow)和 Ctrl+DownArrow(macOS 上为 Cmd+DownArrow)。您可以通过更新 ⌘↑ (Windows, Linux Ctrl+Up)、⌘↓ (Windows, Linux Ctrl+Down) 和 ⌘↑ (Windows, Linux Ctrl+Up) 快捷键来恢复之前的行为。
注意:我们还删除了所有现有的 18 个历史记录导航命令,并将它们统一为两个命令 history.showPrevious 和 history.showNext。
编辑器
悬停显示选项
一些用户更喜欢编辑器中没有任何悬停建议覆盖文本,现在可以通过三个额外的设置自定义编辑器悬停。使用 editor.hover.enabled 来切换编辑器悬停,使用 editor.hover.delay 来自定义悬停显示的时间,并使用 editor.hover.sticky 来更改当鼠标移到它上面时悬停是否保持可见。
子单词支持
我们有了新的子单词导航和子单词删除命令。这些命令将在驼峰式命名法位置和下划线(_)处停止。

以下是如何绑定它们的示例:
{ "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 用于预选建议,并且在可用时,编辑器将选择该建议而不是列表中的第一个。

代码片段占位符转换
代码片段终于支持占位符转换。占位符转换就像变量转换一样,但更具动态性。当从一个占位符切换到下一个时,会应用转换,它们的语法规则是:${int/regex/format_string/opts}。
下面是一个将“Hello World”替换为其德语对应项的示例:
"HelloWorld": {
"prefix": "say_hello",
"body": "${1} ${2} -> ${1/Hello/Hallo/} ${2/World/Welt/}"
}

有关更多详细信息和如何充分利用转换功能的潜力,请参阅 代码片段语法。
集成终端
性能改进
集成终端的解析器被从头开始重写,以增强 ANSI 兼容性,并将输入数据处理速率提高约 30%。这是来自 xterm.js 的上游社区贡献。
粗体文本亮色设置
终端目前将所有粗体文本转换为使用亮色变体。这在不同终端模拟器之间存在一些不一致,并且主要是出于历史原因。您现在可以关闭此自动转换,以允许使用非亮色作为粗体文本。
{
"terminal.integrated.drawBoldTextInBrightColors": false
}
这是来自 xterm.js 的上游社区贡献。
调试
浮动调试工具栏
在上一个里程碑中,我们引入了一个新设置,用于将调试工具栏固定在调试视图中 ("debug.toolBarLocation": "docked")。在此里程碑中,我们审查了用户反馈,并尝试改进浮动工具栏的行为 ("debug.toolBarLocation": "floating")。
根据用户反馈的 共识,工具栏应始终可见(无论哪个视图处于活动状态),并且不应隐藏任何内容(例如编辑器选项卡)。因此,我们通过允许将浮动工具栏拖到编辑器区域来“解除其束缚”。这应该有助于那些大量使用编辑器选项卡但又希望始终看到调试工具栏的用户。

由于现有的 debug.hideActionBar 设置由 debug.toolBarLocation 设置的 hidden 值处理,我们现在 **删除** debug.hideActionBar。
语言
TypeScript 2.9.2
VS Code 现在随附 TypeScript 2.9.2。此小版本修复了许多错误并提高了稳定性。您可以在 此处阅读完整的更改列表。
重命名文件夹时更新导入路径
上一个版本带来了在移动或重命名 JavaScript 或 TypeScript 文件时自动更新导入路径的功能。此功能现在在您移动或重命名目录时也有效。同样,默认情况下,如果我们可以更新路径,VS Code 将会提示您。您可以使用 javascript.updateImportsOnFileMove.enabled 和 typescript.updateImportsOnFileMove.enabled 设置来控制提示行为。
有效值是:
"prompt"- 默认值。询问是否应更新路径。"always"- 总是自动更新路径。"never"- 不自动更新路径,也不提示。
分层 Markdown 文档符号
内置的 Markdown 支持使用新的 DocumentSymbol API 来确保 Markdown 标头在“大纲”视图中正确嵌套。

来自 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

提高了浏览器兼容性数据的准确性
感谢 mdn/browser-compat-data,我们将 MDN 的此部分内容引入了我们的 CSS/SCSS/Less 补全。

justify-items 属性以及 CSS Grid Layout 的许多其他 CSS 属性,自 16 版以来在 Edge 中得到了支持。通过从 MDN 获取数据,VS Code 保持了 CSS 功能的浏览器兼容性数据最新。
优雅地处理未知的 At-Rules
使用 CSS 预处理器的人可能会使用自定义 at-rules,这些 at-rules 在构建时会被编译为有效的 CSS。以前,VS Code 无法解析或处理此类 at-rules。在此版本中,我们对 at-rules 提供了更好的支持,以便它们
- 可以接收正确的语法高亮显示,因为它们仍然遵循 CSS 语法。
- 不再在不正确的位置生成错误。
- 生成可由
css.lint.unknownAtRules控制的正确错误。

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

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

关闭扩展推荐
我们根据您打开的文件和工作区环境为您推荐扩展。我们理解并非所有推荐都适合您的项目,因此您现在可以关闭特定推荐。
要关闭推荐,请单击扩展项以打开详细信息窗格,然后按 **忽略推荐** 按钮。被忽略的推荐将不再向您推荐。

管理工作区推荐
您已经可以通过 extensions.json 文件中的 工作区推荐 来配置一组要推荐给您工作区用户的扩展。管理这些推荐现在变得更加容易。单击扩展视图中的任何扩展以打开详细信息窗格。然后,您可以使用下面的新命令添加推荐或拒绝您不希望推荐给您工作区用户使用的某些扩展。
- 扩展:添加到推荐的扩展(工作区)
- 扩展:添加到推荐的扩展(工作区文件夹)
- 扩展:忽略推荐的扩展(工作区)
- 扩展:忽略推荐的扩展(工作区文件夹)
语言包
VS Code 现在只提供英语作为显示语言,其他 语言 需要从 VS Code Marketplace 安装语言包。如果您在 VS Code 1.23 或 1.24 版本提示时安装了语言包,您将不会注意到此更改。如果您是从旧版本 VS Code 升级或进行全新安装,系统将提示您安装操作系统的 UI 语言的语言包。可以使用扩展视图 (⇧⌘X (Windows, Linux Ctrl+Shift+X)) 从 Marketplace 安装其他语言包。
总结如下:
- 如果您从 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 中有合适的语言包,则会提示您安装。
预览功能
预览功能尚未准备好发布,但已足够实用。我们欢迎您在这些功能开发期间提供早期反馈。
新设置编辑器
在此里程碑中,我们继续开发用于编辑设置的 GUI。它仍处于预览状态,但如果您想尝试一下,可以使用 **首选项:打开设置(预览)** 命令打开它。我们希望收到您的任何反馈 - 您可以在 此 GitHub 问题上留下反馈。

与上个月相比,一些新变化包括:
- 一个“目录”(TOC),将设置组织成新类别。
- 已清理和更新的设置行布局。
- “重置”按钮已被移除 - 将设置编辑为默认值将从
settings.json中移除它。
另外,请尝试 "workbench.settings.settingsSearchTocBehavior" 设置,查看搜索设置时“目录”的三个不同选项(show、hide、filter),并告诉我们您更喜欢哪个选项。
Windows 用户安装
Windows 用户现在有一个新的 **预览** 安装程序包,该程序包安装时无需管理员权限。此安装程序包还提供更流畅的后台更新体验。此功能目前仅在 Insiders 版本中可用,因为我们希望在 7 月份获得更多反馈,以便为我们的稳定版用户提供最佳体验。
以下是 Insiders 用户安装程序的下载链接:
Windows/Linux 自定义标题栏和菜单
Windows 和 Linux 用户现在可以使用 window.titleBarStyle 设置值 custom,我们还实现了一个新的匹配菜单栏。该设置尚未默认启用,但可以通过 window.titleBarStyle 设置启用。
启用 Windows 和 Linux 设置后,旧菜单栏将被新的菜单栏替换,该菜单栏与您的浅色或深色主题相匹配。新菜单栏还包含一些增强功能,例如使用箭头键进行顶层键盘导航。最后,整个产品中的菜单也将与新菜单栏匹配。

我们将继续改进新的菜单和标题栏,并解决标记为 workbench-title 或 workbench-menu 的问题。
终端:动态纹理图集
已添加一个实验性设置,用于为 终端画布启用新的“动态纹理图集”。这改变了终端用于存储字符字形的缓存策略。字形不再是默认背景上的固定集合,而是根据需要添加到纹理图集中,无论使用什么背景。这应该可以减少第一次终端启动时间,减少未使用默认背景的字符的渲染时间,以及提高整体渲染性能。
这最终将成为默认设置,目前您可以选择启用以下设置:
{
"terminal.integrated.experimentalTextureCachingStrategy": "dynamic"
}
这是来自 xterm.js 的上游社区贡献。
扩展开发
网格编辑器布局:ViewColumn
支持新的网格编辑器布局功能只有少量 API 调整。最值得注意的是,有一个新的 ViewColumn.Beside 操作,可用于将编辑器打开到活动编辑器旁边。有了网格编辑器布局,打开的编辑器数量不再有限制,因此使用该选项将始终在活动编辑器旁边创建一个新的编辑器,除非旁边已经有空间。根据用户设置 workbench.editor.openSideBySideDirection,这可以是编辑器右侧或下方。
文本编辑器和 Webview 的 ViewColumn 值仍然按照它们在编辑器区域中从左到右的出现顺序确定,如下所示:

即使 ViewColumn 枚举扩展到了 ViewColumn.Nine,只要文本编辑器包含在网格中,它始终会分配一个视图列号。
当编辑器组被移动或关闭时,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:已聚焦的空编辑器组的边框颜色。

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

已弃用的主题颜色
随着网格编辑器布局功能的引入,主题颜色 editorGroup.background 不再受支持。
重命名命令
现在可以使用 Uri 和 Position 调用重命名命令 (editor.action.rename),编辑器将相应地启动重命名操作。例如:
vscode.commands.executeCommand('editor.action.rename', [
vscode.Uri.file('/my/file.abc'),
new vscode.Position(14, 7)
]);
DiagnosticTag
Diagnostic 标签允许扩展为诊断附加额外的元数据。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 上下文中的 getState 和 setState 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 现在将提示用户安装可用语言包,其语言与提示语言一致。下面是一个推荐简体中文语言包的示例,以简体中文和英文显示。

此显示要求语言包作者翻译其语言包中的以下最小翻译字符串:
{
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 Inspector,您现在有一个工具可以帮助理解 LSP 日志:https://msdocs.cn/language-server-protocol/inspector/
在 Inspector 中,您可以:
- 扫描语言客户端和服务器之间的请求、响应和通知。
- 使用搜索或预定义过滤器筛选日志以查找有用信息。

Inspector 对于调试语言扩展非常有用。您可以要求用户在他们的 bug 报告中附加 LSP 日志,并使用 Inspector 来分析这些日志。
已更新 语言服务器指南,其中包括有关日志记录支持和 LSP Inspector 功能的部分。
语言服务器:端到端测试
在 语言服务器指南中添加了关于端到端测试的部分。
与单元测试语言服务器组件相比,端到端测试会打开 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,该 API 扩展了 WorkspaceEdit,使其可用于创建、重命名和删除文件或文件夹。这对于复杂的重构很有用,例如在重命名类型时重命名文件,但同时也应该能够实现其他场景。
本地重命名事件
我们提议两个事件,在重命名发生之前和之后触发。它们分别称为 onWillRenameFile 和 onDidRenameFile,它们允许扩展程序对重命名做出反应或参与其中。
QuickInput API
新的 QuickPick 和 InputBox API 允许比现有的 showQuickPick 和 showInputBox API 更灵活地收集用户输入。使用新的 API,您可以创建一个输入对象的实例,然后在该实例上根据用例注册事件处理程序并设置属性。
export namespace window {
export function createQuickPick<T extends QuickPickItem>(): QuickPick<T>;
export function createInputBox(): InputBox;
}
在 示例扩展中提供了 QuickInput API 用法的示例。
多步输入示例

如果现有的 showQuickPick 和 showInputBox API 不够灵活,请使用新的 QuickPick 和 InputBox 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,这些 API 可以跟踪活动终端,类似于 window.activeTextEditor 和 window.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>;
}
DefinitionLink
定义链接允许定义提供者返回有关定义的附加元数据。
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 使用这些附加信息来改进“转到定义”操作的用户体验。
要使用 DefinitionLink,DefinitionProvider 目前必须实现 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": [{}, {}] }]
}
}
这将产生以下布局:

已移除命令
| 命令 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 的贡献
- bitshiftza (@bitshiftza):修复 #39458 PR #52506
- @brentwang23:为 #46203 实现单词部分移动和删除 PR #48023
- Howard Chen (@chenhowa): await git.pullFrom 和 git.pushTo 以确保任何失败都能显示… PR #49167
- Cherry Wang (@chryw):Markdown 和通用工具栏图标一致性检查 PR #50484
- @CoenraadS:为 highlightActiveIndentGuide 添加设置 #49148 PR #49298
- Daniel Frankcom (@danielfrankcom):添加了背景 ANSI 颜色代码 PR #49764
- Darius Keeley (@Dari-K):修复 #51533 PR #52075
- David (@ddruker):[GIT EXTENSION] 为已添加到索引的文件添加自定义前景颜色 PR #46066
- EbXpJ6bp (@EbXpJ6bp):改进扩展编辑器中的依赖项和贡献 UI PR #52126
- Schuyler Cebulskie (@Gawdl3y):向关于对话框添加 V8 版本并进行美化 PR #51511
- Deleted user (@ghost):[修复] 为 _hue2rgb 添加缺少的返回类型 PR #51285
- Jing Zhou (@gnijuohz):当 git commit 输入框只包含空格时显示警告 PR #45254
- Christoph Seitz (@go2sh):为占位符添加转换 PR #51621
- Jan Pilzer (@Hirse):添加 gitignore 语言 PR #51026
- Ian Sanders (@iansan5653):通过检查拖放项是否可放置来限制对打开编辑器拖放操作的突出显示 PR #52623
- James (@jwhitmarsh):允许在具有 text/ng-template 类型的文件中的脚本标签内执行 Emmet 操作 PR #51849
- Catalin Pirvu (@katakonst):当 git 包含多个项目时,在消息字段中恢复焦点。 PR #46068
- Krzysztof Cieślak (@Krzysztof-Cieslak):为 incrementFileName 的
1.txt格式添加支持 PR #50869 - Leonardo Braga (@LeonardoBraga)
- Jon Malmaud (@malmaud):修复扩展文档中的拼写错误。 PR #51509
- Momoto, Seiji (@momoto):修复 main.contribution.ts 中的拼写错误 PR #52104
- Nahom Abi (@NahomAgidew):修复 #43625:推送时旋转同步图标 PR #52146
- Ori Ashual (@oriash93):添加是否显示终端重用警报的选项 PR #44461
- Eugen Cazacu (@oygen87):删除一个注释 PR #50971
- Dániel Tar (@qcz)
- Ronald Rey (@reyronald):向扩展视图添加“推荐”操作 PR #50419
- @rianadon:[WIP] Windows 的彩色标题栏 PR #39972
- ryenus (@ryenus):允许自定义默认扩展视图中的视图 PR #47766
- Shizeng Zhou (@shizengzhou):移除边框。修复 #48765 PR #48825
- Benjamin Smith (@SirHoneyBiscuit):添加隐藏/显示更新时发布说明的选项 #44020 PR #44271
- Alfonso Perez (@alfonsoperez):在列 1 触发 deleteAllLeft 时继续删除行 PR #28392
- Spencer (@spalger):修复从列 1 执行 DeleteAllLeft 时的错误 PR #40876
- Benjamin Crawford (@subylan):32 位构建的 max_old_space_size 标志超出范围。 PR #52792
- Tomáš Hübelbauer (@TomasHubelbauer)
- @vemoo:“无法创建键绑定来重新启动特定任务”的修复 PR #36474
- Winner Crespo (@wistcc):添加令牌化被跳过的警告 PR #51265
- @zhuowei:修复 #35361:修复 macOS 10.13 上的原生标签 PR #52775
对 vscode-vsce 的贡献
- Jimi (Dimitris) Charalampidis (@JimiC):添加使用 'npm version' 进行发布的权限 PR #263
- Kevin Cunnane (@kevcunnane):支持在 package 命令中使用 Yarn PR #260
- Ritwick Dey (@ritwickdey):在发布扩展时使用 useYarn 参数 PR #268
对 language-server-protocol 的贡献
- Colin Rofls (@cmyr):修复 specification.md 中的拼写错误 PR #499
- Samarth Wahal (@LordZamy):修复 spec 中的拼写错误 PR #508
对 vscode-node-debug 的贡献
- jramsay (@jramsay):为 VS Live Share 启用已加载脚本 PR #180
对 vscode-chrome-debug-core 的贡献
- @digeff:修复新脚本和更改脚本可能出现的竞态条件 PR #336
- Johannes Ewald (@jhnns):修复 internalSourceBreakpoint 中不安全的数组访问 PR #335
对 vscode-chrome-debug 的贡献
- Chance An (@changsi-an)
- Michael Crane (@mrcrane)
- 在所有启动情况下设置 Chrome PID PR #687
对 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。