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
更改在将鼠标移到悬停内容上时是否应保持其可见。
子词支持
我们新增了子词导航和子词删除的命令。这些命令会在驼峰式命名 (camelCase) 的位置和下划线 (_
) 处停止。
以下是您可以如何绑定它们的示例
{ "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 功能的浏览器兼容性数据为最新状态。
对未知 At 规则的优雅处理
使用 CSS 预处理器的人可能会使用在构建时编译为有效 CSS 的自定义 at 规则。以前,VS Code 无法解析或处理此类 at 规则。在此版本中,我们对 at 规则提供了更好的支持,以便它们
- 由于它们仍然遵循 CSS 语法,因此会获得正确的语法高亮。
- 不再在不正确的位置生成错误。
- 生成正确的错误,这些错误可以通过
css.lint.unknownAtRules
来控制。
扩展
扩展视图的新默认视图
到目前为止,扩展视图的默认视图包含一个已安装扩展的部分和另一个推荐扩展的部分。已安装但已禁用的扩展与已启用的扩展混在一起,使得与后者交互变得困难。我们现在提供了一个新的默认设置,其中已启用的扩展首先显示,然后是推荐扩展的部分,最后是一个折叠的已禁用扩展部分。
您始终可以使用扩展视图中的上下文菜单重新排序、折叠/展开或隐藏这些部分中的任何一个。您还可以使用视图菜单中的打开视图...命令来显示/隐藏这些部分。
忽略扩展推荐
我们会根据您打开的文件和您的工作区环境向您推荐扩展。我们理解并非每个推荐都适合您的项目,因此您现在可以忽略特定的推荐。
要忽略一个推荐,请点击扩展项打开详情面板,然后按下忽略推荐按钮。被忽略的推荐将不再向您推荐。
管理工作区推荐
您已经可以通过在 extensions.json
文件中使用工作区推荐来配置一组为您的工作区用户推荐的扩展。现在管理这些推荐变得更加容易。点击扩展视图中的任何扩展以打开详情面板。然后您可以使用下面的新命令来添加推荐或禁止某些您不希望为您的工作区用户推荐的扩展。
- 扩展: 添加到推荐扩展(工作区)
- 扩展: 添加到推荐扩展(工作区文件夹)
- 扩展: 忽略推荐扩展(工作区)
- 扩展: 忽略推荐扩展(工作区文件夹)
语言包
VS Code 现在仅附带英语作为显示语言,其他语言依赖于可从 VS Code 市场安装的语言包。如果您在 VS Code 的 1.23 或 1.24 版本提示时安装了语言包,您应该不会注意到这个变化。如果您从旧版本的 VS Code 升级或进行全新安装,您会看到一个提示,要求安装您操作系统 UI 语言的语言包。可以从市场使用扩展视图(⇧⌘X (Windows、Linux Ctrl+Shift+X))安装其他语言包。
总结如下
- 如果您从 VS Code 1.22 或更早版本更新到 1.25,显示语言将是英语,并且 VS Code 会提示您安装操作系统的 UI 语言包(如果市场中有这样的语言包可用)。
- 如果您从 1.23 或 1.24 更新到 1.25,您应该已经被提示安装 UI 语言的语言包。如果您这样做了,1.25 将正常启动,并且显示语言会呈现为所选的 UI 语言。如果您没有安装语言包,那么您将被提示安装。
- 全新安装 VS Code 1.25 或更高版本时,如果市场中有合适的语言包可用,您将被提示安装。
预览功能
预览功能尚未准备好发布,但已足够实用。我们欢迎您在这些功能开发期间提供早期反馈。
新设置编辑器
在这个里程碑中,我们继续致力于开发一个用于编辑设置的图形用户界面。它仍然是一个预览版,但如果您想尝试一下,可以使用首选项:打开设置(预览)命令打开它。我们希望听到您的任何反馈——您可以将其留在这个 GitHub 问题上。
与上个月相比的一些新变化是
- 一个将设置组织成新类别的“目录”(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 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):等待 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 扩展] 为添加到索引的文件添加自定义前景色 PR #46066
- EbXpJ6bp (@EbXpJ6bp):改进扩展编辑器中的依赖项和贡献 UI PR #52126
- Schuyler Cebulskie (@Gawdl3y):在“关于”对话框中添加 V8 版本并美化它 PR #51511
- 已删除用户 (@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 的 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。