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 月发布版。我们非常激动地将上个月宣布为预览版的几个功能转为稳定版。一些主要亮点包括
- 网格编辑器布局 - 自定义水平和垂直编辑器布局。
- 大纲视图 - 文档的符号树大纲和导航。
- 便携模式 - 从 U 盘或文件共享中运行或复制您的 VS Code 设置。
- 悬停显示选项 - 控制悬停信息的外观。
- 子词导航 - 在 camelCase (驼峰式) 单词中快速导航。
- 浮动调试工具栏 - 始终保持调试工具栏可见,而不会隐藏编辑器标签页。
- 扩展视图改进 - 轻松查看已启用、已禁用和推荐的扩展。
- 预览:设置编辑器 - 现在带有“目录”以组织设置。
- 语言服务器协议检查器 - 扩展作者可以可视化 LSP 协议流量。
- 新的 Python Flask 教程 - 使用 VS Code 创建和调试 Python Flask Web 应用程序。
如果您想在线阅读这些发行说明,请访问 code.visualstudio.com 上的更新页面。
您还可以观看由云开发大使 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 设置,例如通过 U 盘或文件共享。便携模式在 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" },
建议选择
语言智能感知提供程序通常知道哪些建议是最好的,从这个版本的 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 网格布局的 CSS 属性,自 Edge 16 版本以来已受支持。通过从 MDN 获取数据,VS Code 保持了 CSS 功能的浏览器兼容性数据的最新状态。
优雅处理未知的 @ 规则
使用 CSS 预处理器的人可能会使用自定义的 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 语言的语言包。可以从 Marketplace 使用扩展视图(⇧⌘X (Windows, Linux Ctrl+Shift+X))安装其他语言包。
总结一下
- 如果您从 VS Code 1.22 或更早版本更新到 1.25,显示语言将是英语,并且 VS Code 会提示您安装操作系统 UI 语言的语言包(如果 Marketplace 中有这样的语言包)。
- 如果您从 1.23 或 1.24 更新到 1.25,您应该已经被提示安装 UI 语言的语言包。如果您这样做了,1.25 将正常启动,并且显示语言将呈现为您选择的 UI 语言。如果您没有安装语言包,那么您将被提示安装。
- 全新安装 VS Code 1.25 或更高版本时,如果 Marketplace 中有合适的语言包,将会提示您安装。
预览功能
预览功能尚未准备好发布,但已足够实用。我们欢迎您在这些功能开发期间提供早期反馈。
新设置编辑器
在这个里程碑中,我们继续致力于开发一个用于编辑设置的图形用户界面。它仍然是一个预览版,但如果您想尝试一下,可以使用 首选项:打开设置(预览) 命令打开它。我们希望听到您的任何反馈 - 您可以在这个 GitHub 问题上留下您的意见。
与上个月相比,一些新的变化是
- 一个“目录”(TOC),将设置组织成新的类别。
- 设置行的布局经过了清理和刷新。
- “重置”按钮已被移除 - 将设置编辑为其默认值将从
settings.json
中移除它。
另外,请尝试 "workbench.settings.settingsSearchTocBehavior"
设置,看看在搜索设置时“目录”的三种不同选项(show
、hide
、filter
),并告诉我们您更喜欢哪个选项。
Windows 用户设置
Windows 用户现在有一个新的 预览 安装包可用,它不需要管理员权限即可安装。这个安装包还提供了更流畅的后台更新体验。此功能目前仅在 Insiders 版本中可用,因为我们希望在七月份获得更多反馈,以便为我们的稳定版用户提供最佳体验。
以下是 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
,但只要 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
:被聚焦的空编辑器组的边框颜色。
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
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 检查器,您现在有了一个帮助理解 LSP 日志的工具:https://msdocs.cn/language-server-protocol/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
,使其可以用于创建、重命名和删除文件或文件夹。这对于复杂的重构很有用,例如在重命名类型时重命名文件,但也应该能够实现其他场景。
本地重命名事件
我们正在提议两个在重命名发生前后触发的事件。它们分别被称为 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 |
|
切换到编辑器布局:二乘二网格 | 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: 添加高亮活动缩进指南的设置 #49148 PR #49298
- Daniel Frankcom (@danielfrankcom): 添加了背景 ANSI 颜色代码 PR #49764
- Darius Keeley (@Dari-K): 修复 #51533 PR #52075
- David (@ddruker): [GIT 扩展] 为添加到索引的文件添加自定义前景色 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): max_old_space_size 标志对于 32 位构建超出范围。 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): 修复规范中的拼写错误 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。