2018年8月(版本1.27)

更新 1.27.2: 本次更新解决了这些问题

下载:Windows: x64 | Mac: Intel | Linux 64位: deb rpm tarball | 32位: deb rpm tarball


欢迎来到2018年8月发布的Visual Studio Code。此版本中有许多重要的更新,我们希望您会喜欢,一些关键的亮点包括:

如果您想在线阅读这些发布说明,请访问更新code.visualstudio.com上。
您还可以查看这个1.27版本的亮点视频,由云开发者倡导者Brian Clark提供。

内部人员:想要尽快看到新功能吗?您可以下载每晚的内部人员版本,并在更新可用时立即尝试最新更新。要获取最新的Visual Studio Code新闻、更新和内容,请在Twitter上关注我们@code

工作台

设置编辑器

在过去的几个月里,我们一直在开发一个用于编辑设置的图形用户界面。在1.27版本中,我们将其设为默认设置编辑器。

设置界面

您仍然可以访问JSON设置编辑器,可以通过使用命令Preferences: Open User Settings (JSON)或通过更改默认设置编辑器与"workbench.settings.editor"设置来实现。

我们这个月做的一个改进是通过将设置值描述(enumDescriptions)移动到一个自定义的下拉控件中来清理用户界面:

下拉菜单

已修改的设置现在用蓝线表示,就像编辑器中的修改行一样。齿轮图标打开一个上下文菜单,其中包含将设置重置为其默认值的选项。

修改指示器和上下文菜单

设置值现在会被验证,并且任何验证错误都会显示出来。

验证错误

目录现在在搜索期间将保持可见,并过滤以仅显示具有匹配项的类别。您可以点击一个类别以过滤结果,仅显示该类别下的设置。如果您希望在搜索期间隐藏目录,请将"workbench.settings.settingsSearchTocBehavior"设置为"hidden"

设置搜索

当您在设置中搜索时,我们的Bing驱动的搜索服务仍然提供它认为相关的结果。现在,该服务还将显示来自Marketplace的相关设置的扩展程序。您将在设置搜索结果的底部看到一个按钮,显示匹配的扩展程序。点击后,扩展程序视图将打开,显示匹配的扩展程序。

扩展设置

Windows 和 Linux 上的自定义标题栏和菜单

在过去的几次迭代中,我们一直在努力改进Windows和Linux上标题栏和菜单的外观、感觉以及可用性。在这个迭代中,我们移除了预览标签,目的是尽快使其成为Windows上的默认体验。要启用此功能,您可以将设置"window.titleBarStyle"设置为"custom"

自定义标题栏和菜单

新体验相比默认设置有几个优势:

  • 整个产品中的可主题化标题栏、菜单栏和上下文菜单。这意味着您的深色主题始终保持深色!
  • 菜单栏中的键盘导航更好。我们已经使使用键盘在菜单之间切换和使用菜单助记符变得更加容易。
  • 一个更不显眼的菜单栏。当设置"window.menuBarVisibility""toggle"时,新的体验更加紧凑且不那么突兀。
  • 更好的可访问性。已解决多个可访问性问题,以提高屏幕阅读器对菜单的使用体验。

由于我们希望使这一新体验成为Windows上的默认体验,我们鼓励您尝试并提供反馈,以便我们能够提供最佳的体验。

面包屑导航改进

我们对新的面包屑导航栏进行了调整,进行了各种改进,并修复了一些错误:

  • 编辑器中的聚焦文档符号现在会高亮显示。
  • 当运行焦点命令(⇧⌘; (Windows, Linux Ctrl+Shift+;))时,面包屑导航会自动启用。
  • 面包屑导航与主题配合使用效果更好。
  • 面包屑现在遵循文件排除配置。

面包屑高亮

新建终端菜单

Tasks 菜单已重命名为 Terminal,并且为集成终端添加了更多条目。

终端菜单

平台特定的快捷键

现在可以通过在键绑定的when子句中使用isLinuxisMacisWindows来为特定操作系统启用键盘快捷键:

[
  {
    "key": "ctrl+o",
    "command": "workbench.action.files.openFolder",
    "when": "!isMac"
  },
  {
    "key": "cmd+o",
    "command": "workbench.action.files.openFolder",
    "when": "isMac"
  }
]

这使得在不同机器之间共享您的keybindings.json文件变得更加容易。

以新原生标签页打开窗口

一个新的仅适用于macOS的命令,workbench.action.newWindowTab,将窗口作为新的原生标签页打开。newWindowTab没有默认的键绑定,并且需要启用设置window.nativeTabs

文件在外部删除/重命名时不再关闭

我们将workbench.editor.closeOnFileDelete设置的默认值从true更改为false。这意味着在VS Code外部(或通过Git等程序或集成终端中的命令)删除或重命名的文件将不再关闭作为编辑器标签打开的文件。相反,文件将指示它已从磁盘中删除,您可以保存文件以恢复它。

从磁盘删除

注意:除非文件是脏的,否则文件的内容在重启之间不会被保留。

中键点击以在新编辑器中打开文件

现在可以在资源管理器视图中使用鼠标中键点击以在新编辑器中打开文件,而不是在预览模式中重用先前的编辑器。

可访问性改进

我们已经修复了许多可访问性问题——主要是关于键盘导航、屏幕阅读器支持和焦点。完整列表可以在这里找到。这是一项持续的努力,我们计划在九月继续推进。

改进的Windows后台更新

我们已经在自定义的Windows背景更新程序上做了一些稳定性工作,以解决导致某些用户安装失败的问题。这是一个持续的工作项目,在即将发布的版本中会有更多改进。

编辑器

自动关闭和环绕字符

当输入某些括号如{[(时,根据编程语言的不同,它们通常会在后面跟随特定字符(例如;:.,=}])>)时自动闭合,这些字符通常不能开始一个表达式。这种行为可以通过editor.autoClosingBrackets设置进行自定义。同样地,可以通过editor.autoClosingQuotes自定义在输入引号如"'`时的自动闭合行为。

当选择文本并输入这些字符之一时,所选内容将被括号或引号包围。现在可以通过新的editor.autoSurround设置单独调整此行为。

语言

CSS导入的路径补全

CSS、SCSS 和 Less 的路径补全 @import 现已可用。SCSS 部分的 @import 也已处理。

css-import

现在在CSS、SCSS和Less中,@importurl()链接可以跳转到定义。

css定义

JSON

内置的JSON语言扩展现在支持新的JSON Schema Draft-07

最有趣的添加是ifthenelse关键字,以允许条件模式评估。

{
  "type": "integer",
  "minimum": 1,
  "maximum": 1000,
  "if": { "minimum": 100 },
  "then": { "multipleOf": 100 },
  "else": {
    "if": { "minimum": 10 },
    "then": { "multipleOf": 10 }
  }
}

if 关键字意味着,如果值模式的结果通过验证,则应用 then 模式,否则应用 else 模式。

HTML

HTML格式化工具已更新至JS Beautifier的1.8.1版本。

这为"html.format.wrapAttributes"设置添加了一个新选项:

  • "aligned-multiple" 当达到最大行长度时,将换行属性,并将所有换行后的行与第一个属性对齐。

对齐多个

TypeScript 3.0.3

VS Code 现在附带 TypeScript 3.0.3。这个次要版本修复了许多错误并提高了稳定性。您可以在此处阅读完整的更改集 here

调试

已加载脚本视图现在可重复使用

一年多以来,调试视图中的已加载脚本资源管理器是由Node.js调试扩展贡献的,其他调试器无法使用。在此版本中,我们已将已加载脚本视图添加为内置调试器功能。所有具有“脚本”概念的调试扩展都将能够在动态更新的视图中支持对其脚本的访问。

此外,我们已经改进了旧版加载脚本资源管理器的一些不足之处:

  • 单子文件夹链现在被折叠成一个节点。这使得深入但稀疏的文件夹层次结构变得更加容易。
  • 我们已经开始解决可访问性问题。

中键点击以移除断点

现在可以在断点视图中使用鼠标中键轻松移除断点。

将“openDebug”的默认设置更改为每次会话开始时打开

对于新用户来说,有时在启动调试会话时,调试视图不会每次都自动打开,这可能会让人感到困惑。如果用户还不熟悉用户界面,他们不知道应该查找什么关键词来打开界面。为了避免混淆,我们将debug.openDebug的默认值更改为openOnSessionStart,以便在每次会话开始时都打开调试视图,而不仅仅是在第一次(这是之前的默认行为)。

扩展开发

扩展日志记录

作为activate函数参数的ExtensionContext有一个新属性logPath。这是扩展可以存储日志文件的目录的绝对文件路径。该路径对于扩展是唯一的,不会被其他扩展重复使用。

语言服务器协议

语言服务器协议的新版本已发布,并包含了与VS Code一起使用的相应节点模块。

新版本支持以下内容:

  • 服务器发送的代码操作类型公告,允许客户端填充相应的菜单项。
  • 一个用于textDocument/prepareRename的实现。
  • 支持在工作区编辑中进行文件操作(创建、重命名和删除)。

vscode-languageclient: JSON 日志格式和日志流

以前,在使用vscode-languageclient构建语言服务器扩展时,您可以指定[langId].trace.server来将LSP日志发送到VS Code的输出通道中。

[langId].trace.server 现在可以以机器可读的 JSON 格式 输出日志信息:

"languageServerExample.trace.server": {
  "format": "json", // or "text"
  "verbosity": "verbose" // or "off" | "messages"
}

这开启了有趣的使用场景,例如将LSP日志流式传输到LSP Inspector中以可视化语言服务器的行为:

lsp-streaming

你可以在Microsoft/language-server-protocol-inspectorlsp-log-streaming-sample中了解更多信息。

调试扩展:内置加载脚本视图

加载的脚本资源管理器现在是VS Code调试器的内置组件。为了使用它,调试器扩展需要以以下方式更改其调试适配器:

  • 在从initialize请求返回的Capabilities中添加一个值为truesupportsLoadedSourcesRequest功能。
  • 通过返回当前加载的源集合来实现loadedSources请求。
  • 为新加载或卸载的源发送loadedSource事件。

新主题颜色

面包屑有一个新的主题颜色:

  • breadcrumb.background: 面包屑项目的背景颜色。

设置编辑器有新的主题颜色:

  • settings.dropdownListBorder: 新下拉控件的边框颜色。
  • settings.modifiedItemIndicator: 指示已修改设置的线条颜色。

Git 扩展 API

Git 扩展已经开始公开一个更明确的 API。这个 API 可以被任何其他扩展使用,以与用户工作区中打开的 Git 仓库进行交互。由于它仍处于初步阶段,我们将在未来的版本中不断改进这个 API。

提议的扩展API

每个里程碑都伴随着新的提议API,扩展作者可以尝试使用它们。我们一如既往地重视您的反馈。以下是您尝试提议API需要做的事情:

  • 你必须使用Insiders,因为提议的API经常变化。
  • 您必须在扩展的package.json文件中包含这一行:"enableProposedApi": true
  • 将最新版本的vscode.proposed.d.ts文件复制到您的项目中。

请注意,您不能发布使用提议API的扩展。我们可能会在下一个版本中进行重大更改,并且我们从不希望破坏现有的扩展。

SCM: 选择的源代码控制

为了让扩展知道用户选择了哪些源代码控制实例在用户界面中可见,SourceControl 实例现在有一个 selected 属性以及一个 onDidChangeSelection 事件来表示该状态。

export interface SourceControl {
  /**
   * Whether the source control is selected.
   */
  readonly selected: boolean;

  /**
   * An event signaling when the selection state changes.
   */
  readonly onDidChangeSelection: Event<boolean>;
}

评论提供者

我们在这个迭代中引入了评论的概念,它允许扩展在编辑器中创建和管理对话,并新增了一个评论面板。这使得扩展能够支持代码审查场景。

评论被组织成线程并与特定文档相关联。

export enum CommentThreadCollapsibleState {
  Collapsed = 0,
  Expanded = 1
}

interface CommentThread {
  threadId: string;
  resource: Uri;
  range: Range;
  comments: Comment[];
  collapsibleState?: CommentThreadCollapsibleState;
}

interface Comment {
  commentId: string;
  body: MarkdownString;
  userName: string;
  gravatar: string;
  command?: Command;
}

要显示评论,扩展必须注册一个DocumentCommentProviderWorkspaceCommentProvider

export interface CommentThreadChangedEvent {
  readonly added: CommentThread[];
  readonly removed: CommentThread[];
  readonly changed: CommentThread[];
}

interface CommentInfo {
  threads: CommentThread[];
  commentingRanges?: Range[];
}

interface DocumentCommentProvider {
  provideDocumentComments(
    document: TextDocument,
    token: CancellationToken
  ): Promise<CommentInfo>;
  createNewCommentThread(
    document: TextDocument,
    range: Range,
    text: string,
    token: CancellationToken
  ): Promise<CommentThread>;
  replyToCommentThread(
    document: TextDocument,
    range: Range,
    commentThread: CommentThread,
    text: string,
    token: CancellationToken
  ): Promise<CommentThread>;
  onDidChangeCommentThreads: Event<CommentThreadChangedEvent>;
}

interface WorkspaceCommentProvider {
  provideWorkspaceComments(token: CancellationToken): Promise<CommentThread[]>;
  onDidChangeCommentThreads: Event<CommentThreadChangedEvent>;
}

使用DocumentCommentProvider,可以为打开的文档返回评论。在提供评论时,扩展指定了文档上的当前线程,以及文档的哪些范围支持添加新评论。可以从文档中添加或回复评论。

编辑器中的注释

当首次注册WorkspaceCommentProvider时,CommentsPanel会变得可见,并显示提供给它的所有评论。评论按评论线程和资源分组。当在面板中选择评论时,会运行评论的command,因此扩展决定了行为。

评论面板

预览功能

预览功能尚未准备好发布,但功能足够使用。我们欢迎您在开发过程中提供早期反馈。

Electron 3.0 探索

在这个里程碑期间,我们探索了将Electron 3.0.0集成到VS Code中。这是一个重大的Electron版本,包含了Chrome 66和Node.js 10.x(与我们当前包含Chrome 61和Node.js 8.x的版本相比,这是一个巨大的飞跃)。我们计划在不久的将来向我们的Insiders用户推送更新,以收集更多反馈。如果您有兴趣提供帮助,请确保安装VS Code Insiders

工程

扩展和webpack

我们现在正在使用webpack来打包扩展。它实现了两个成就:(1) 减少了扩展的启动时间,因为需要加载的文件更少,解析的源代码也更少;(2) 减少了安装时间,因为需要提取并写入磁盘的文件更少。到目前为止,我们已经将打包大小减少了约4000个文件!

性能金丝雀

我们添加了一个测试工具,以确保我们的启动性能不会退化。有一个新的脚本可以部署到专用机器上,以测试Insider构建的性能。该脚本只需安装最新的构建,并确保它在时间限制内启动。目前,我们从Windows开始,因为性能经常受到防病毒软件更新的影响,但计划是在我们支持的所有平台上进行测试。

IPC 堆栈改进

我们已经改进了自研的IPC堆栈,以支持进程间的字节缓冲区消息。这使得某些场景成为可能,例如在不同的进程之间发送二进制数据而无需额外开销,同时也允许我们优化IPC以提高性能。

显著的修复

  • 6363: 保存时移除备用数据流
  • 25919: 新命令强制以原生标签页形式打开新窗口
  • 49021: 保存时不要重置WSL权限元数据
  • 49403: 在集成终端中调试时,自动附加导致问题
  • 55025: 允许在扩展主机重启时继续调试
  • 56084: 打开编辑器:重新审视组的顺序,使其基于视觉顺序
  • 56691: 当路径中存在#时,启动vscode时出错
  • 57018: 停止/重启调试器无法停止 babel-node

感谢您

最后但同样重要的是,向以下帮助使VS Code变得更好的人们表示衷心的感谢!

vscode 的贡献:

vscode-vsce 的贡献:

vscode-eslint 的贡献:

language-server-protocol的贡献:

vscode-languageserver-node的贡献:

debug-adapter-protocol的贡献:

vscode-css-languageservice 的贡献:

vscode-html-languageservice的贡献:

vscode-json-languageservice 的贡献:

node-jsonc-parser的贡献:

vscode-generator-code 的贡献:

localization的贡献:

Transifex VS Code 项目团队有近1200名成员,每月约有100名活跃贡献者。我们感谢您的贡献,无论是提供新的翻译、投票翻译,还是建议流程改进。

这是本次发布的贡献者快照。有关项目的详细信息,包括贡献者名单,请访问项目网站 https://aka.ms/vscodeloc

  • 保加利亚语: Любомир Василев.
  • 克罗地亚语: Nikša Mihaica.
  • 丹麦语: Christoffer Bech.
  • 英语(英国): Matthew John Cheetham, Swotboy2000.
  • 芬兰语: Petri Niinimäki, Feetu Nyrhinen, Jussi Palo.
  • 法语: Antoine Griffard, Guillaume Bauer, Smrman.
  • 德语: Carsten Siemens, Carsten Kneip, Jonas Droste, Markus Hatvan, Christian Studer, Peter Schneider, Jonas Keller, thefreshman89.
  • 匈牙利语: Tar Dániel, Bence László.
  • Chinese Simplified: Joel Yang, 子实 王, Wang Dongcheng, pluwen, DongWei, Henry Chu, aimin guo, Chris Pan 潘冬冬, 子昂 马.
  • 中文繁体: Duran Hsieh, Winnie Lin, Poy Chang, Alan Tsai.
  • 印尼语: Wildan Mubarok, G-RiNe 项目。
  • 意大利语: Luca Bruni, Alessandro Alpi, Andrea Dottor, Emanuele Curati, Riccardo Cappello, Gianluca Acerbis, Emilie Rollandin, Marco Dal Pino, Luigi Bruno, Lorthirk, Aldo Donetti.
  • 日语: 田島俊也、梶浦智史、貫山雄一、森浩之、yoshioms。
  • 韩语: Kyunghee Ko, PaulNara, smallsnail, Kwangjin Hwang.
  • 立陶宛语: Tomas Cimermonas.
  • 波兰语: Artur, hawkeye116477, Patryk Brejdak, Mateusz Gazdziak, Robert Skórski, Sebastian Baran.
  • 葡萄牙语(巴西): Roberto Fonseca, Bruno Sonnino, Marcelo Fernandes, Lucas Miranda, João Mesquita, Danilo Dantas, Rodrigo Crespi, Arthur Bruel, Thiago Moreira de Souza Arrais, Otacilio Saraiva Maia Neto, Loiane Groner, Fabio Correia.
  • 葡萄牙语(葡萄牙): Richard Nunes, Daniel Correia, Tiago Costa.
  • 罗马尼亚语: Bogdan Mateescu, Szauka.
  • 俄语: Roman Slauta, Ivan Kuzmenko.
  • 西班牙语: 亚历杭德罗·梅迪纳, 何塞·M·阿吉拉尔, 罗伯托·丰塞卡, 哈维尔·莫雷诺, 安迪·冈萨雷斯, 阿尔贝托·波布拉西翁, 南希·托德, 安东尼奥·桑马丁.
  • 泰卢固语: Hari Jujjavarapu, Sridhar L.