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 伪选择器和伪元素
在 4 月版本中,我们开始从 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 补全中

自版本 16 以来,Edge 中已支持 justify-items 属性以及许多其他用于 CSS 网格布局的 CSS 属性。通过从 MDN 获取数据,VS Code 使 CSS 功能的浏览器兼容性数据保持最新。
优雅地处理未知 @规则
使用 CSS 预处理器的人可能会使用在构建时编译为有效 CSS 的自定义 @规则。以前,VS Code 无法解析或处理此类 @规则。在此版本中,我们对 @规则提供了更好的支持,因此它们
- 接收正确的语法高亮显示,因为它们仍然遵守 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 问题上留下反馈。

与上个月相比的一些新更改是
- 一个将设置组织到新类别的“目录”。
- 清理和刷新的设置行布局。
- 已删除“重置”按钮——将设置编辑为默认值将从
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,这可以在编辑器的右侧或下方。
文本编辑器和 Web 视图的 ViewColumn 值仍然按编辑器区域中从左到右的出现顺序排列,如下所示

即使 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 中打开
如果打开文本编辑器或 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:聚焦的空编辑器组的边框颜色。

editorPane.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
Web 视图面板有两个新的只读属性
active- 跟踪面板何时获得焦点。visible- 跟踪面板何时在屏幕上。
Web 视图持久性
Web 视图 API 已扩展,支持保存和恢复 Web 视图的状态。
Web 视图上下文中的 getState 和 setState 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 现在将提示用户使用语言包语言中可用的语言包。以下是推荐简体中文语言包的示例,其中包含简体中文和英文。

此显示要求语言包作者在其语言包中翻译以下最小翻译字符串
{
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 对于调试语言扩展可能很有用。你可以要求用户将 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,它扩展了 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,使其能够跟踪活动终端,类似于 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 |
|
| 切换到编辑器布局:2x2 网格 | 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 存储创建和部署静态网站。Azure 存储扩展提供的新功能简化了网站部署。
显著变化
- 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):等待 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
- 已删除用户 (@ghost):[修复] 为 _hue2rgb 添加缺失的返回类型 PR #51285
- Jing Zhou (@gnijuohz):当 git 提交输入框只包含空格时显示警告 PR #45254
- Christoph Seitz (@go2sh):为占位符添加转换 PR #51621
- Jan Pilzer (@Hirse):添加 gitignore 语言 PR #51026
- Ian Sanders (@iansan5653):通过检查拖动项是否可放下,限制在打开的编辑器上拖动时的突出显示 PR #52623
- James (@jwhitmarsh):允许在类型为 text/ng-template 的 script 标签内进行 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:[进行中] 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):在包命令中支持 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。