尝试以扩展 VS Code 中的代理模式!

2019 年 9 月 (版本 1.39)

更新 1.39.1:此更新解决了这些问题,包括一个安全漏洞修复。

更新 1.39.2:此更新解决了这些问题

下载:Windows:x64 | Mac:Intel | Linux:deb rpm tarball snap


欢迎使用 Visual Studio Code 2019 年 9 月版本。此版本中有许多更新,我们希望你会喜欢,其中一些主要亮点包括:

如果您想在线阅读这些发行说明,请访问 code.visualstudio.com 上的更新页面。

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

工作台

更新的源代码管理视图

源代码管理视图已更新为使用最新的树控件。你现在可以使用源代码管理标题栏上的切换视图模式按钮在列表视图和树视图之间切换。

Source Control toggle view mode button

你可以使用 `scm.defaultViewMode` 设置更改默认视图,该设置接受 `list` 或 `tree` 值。

你现在还可以通过简单地在视图中开始输入来受益于更新后的树控件的自动键盘导航和过滤。

Updated SCM view

在树视图模式下(显示文件夹),Git 扩展现在为文件夹贡献命令,例如暂存更改,该命令将应用于文件夹中的所有文件。

改进的受信任域设置

我们简化了对 1.38 版本中引入的传出链接保护功能的受信任域管理。

你现在可以使用管理受信任域命令轻松地以 JSON 文本文件形式添加、删除或修改受信任域。

Improved trusted domains management

可选择的完成详细信息

现在可以选择自动完成详细信息以进行复制和粘贴。

Selectable completion details

Windows 上更新的日语 UI 字体

在 Windows 上,我们将日语 UI 字体从 `Meiryo` 切换到 `Yu Gothic UI` 和 `Meiryo UI`。

`UI` 字体通过使用较窄的日语假名字符来节省水平空间。您可以通过安装日语语言包,并通过配置显示语言命令将显示语言标识符设置为 `ja` 来使用日语 UI。

在下图中,您可以看到较窄的 `UI` 字体在 Insiders (绿色图标) 菜单栏中的显示效果。

Japanese typeface

改进了建议和悬停中等宽字体的显示

之前,建议和悬停小部件中的内联 `` 段落没有指定 `font-family`。在 Windows/macOS 上,这些段落使用 Chrome 对 `font-family: monospace` 的默认选择进行渲染。

在此迭代中,我们将其与整个 VS Code UI 中使用的系统无衬线字体对齐。

  • Windows:`Courier New` -> `Consolas` (与 `Segoe UI` 对齐)
  • macOS:`Courier` -> `SF Mono`、`Monaco`、`Menlo` (与 `SF Text` 和 `Helvetica Neue` 对齐)
  • Linux:无更改。内联代码段仍以 `Liberation Mono` 渲染,这是 Chrome 在 Linux 上 `font-family: monospace` 的默认设置。

在下面您可以看到 `SF Mono` 为内联代码块提供了更一致的外观。

Suggest and Hover widgets monospace typeface

设置编辑器中 `uniqueItems` 的验证

字符串数组设置的验证,在 1.38 版本中引入,现在支持 `uniqueItems`。

如果使用 `"uniqueItems": true`,设置编辑器中的重复条目将显示警告。

扩展 README 中的代码块高亮

扩展 README 中显示在“扩展”视图“详细信息”窗格中的代码块现在在 VS Code 中高亮显示。

A block of JSON being highlighted

高亮显示使用当前的颜色主题

编辑器

切换折叠

您现在可以使用**切换折叠** (⌘K ⌘L (Windows, Linux Ctrl+K Ctrl+L)) 命令展开和折叠折叠区域。

小地图编辑器选择装饰

编辑器选择现在在小地图中高亮显示

Minimap displays the editor selection

您可以通过修改 `minimap.selectionHighlight` 主题颜色来更改这些装饰的颜色。

小地图触摸事件

小地图滑块现在可以通过触摸拖动。

多光标粘贴的新选项

过去,从剪贴板粘贴多行文本时,VS Code 会检查剪贴板文本的行数是否与光标数匹配,如果匹配,它会将每行“分发”或“展开”到一个光标。您现在可以使用 `editor.multiCursorPaste` 设置控制此行为,该设置可以有以下值:

  • `spread` - 每个光标粘贴一行文本(默认)。
  • `full` - 每个光标粘贴完整的剪贴板文本。

集成终端

在自定义工作目录中打开新终端

新增一个命令,允许在自定义当前工作目录 (cwd) 中创建终端

{
  "key": "cmd+shift+h",
  "command": "workbench.action.terminal.newWithCwd",
  "args": {
    "cwd": "${fileDirname}"
  }
}

你可以创建自己的键盘快捷键,在任意数量的便捷工作目录中打开新终端。`cwd` 值可以是普通路径,也可以是变量

更好的区域设置检测

`terminal.integrated.setLocaleVariables` 设置已替换为新的 `terminal.integrated.detectLocale` 设置。默认值为 `auto`,它会将终端会话中的 `$LANG` 变量设置为检测到的语言 UTF-8 值,但仅当用户未明确配置时。这个更好的默认设置应该会减少与终端中的语言和编码相关的问题。

语言

HTML ARIA 属性引用

HTML ARIA 属性的自动补全和悬停信息现在包含指向相应WAI-ARIA 文档的引用。

HTML ARIA reference

带分号的 CSS 属性补全

CSS 属性补全现在会在行末插入分号。

您可以使用 Ctrl+Enter (Windows / Linux) 或 Cmd+Enter (macOS) 配合此功能创建新行,而无需将结尾的 `;` 推送到新行。

您可以通过 `[css|scss|less].completion.completePropertyWithSemicolon` 设置来控制此功能。

CSS property completion semicolon

CSS 颜色变量预览

补全 CSS 变量时,如果原始变量是颜色字符串,VS Code 现在会显示带有其颜色的补全项

CSS variable completion with color swatch

markdown.links.openLocation

新的 `markdown.links.openLocation` 设置控制 Markdown 文件中的链接打开位置。

`markdown.links.openLocation` 有两个值:

  • `currentGroup` - 在当前编辑器组中打开链接(默认)。
  • `beside` - 在当前 Markdown 编辑器旁边打开链接。

`"markdown.links.openLocation": "beside"` 在处理文档时很有用。

调试

改进了列断点 UI

在调试时,VS Code 现在会内联显示所有断点候选位置。这使用户可以更轻松地将断点放置在更准确的位置。为了不使 UI 混乱,只有当行上存在多个可能位置时才会显示候选断点。

您可以直接与内联断点交互;单击以启用和禁用它们,并调用它们的上下文菜单以进行更多操作。

Inline breakpoints

请注意,此功能需要底层运行时或调试器的支持,我们预计将来只有少数调试扩展会使用此功能。在此版本中,Node DebugDebugger for Chrome 支持此功能。作为扩展作者的示例,我们的Mock Debug 示例“模拟”了对它的支持。

调用堆栈视图中的行内调试操作

当调用堆栈视图中显示会话或线程时,我们现在会在悬停时行内显示调试操作。这将使在调试多个会话或线程时更容易控制调试流。您不再需要先将焦点设置到会话或线程上才能对其执行操作。

如果会话只有一个线程,则所有操作都显示在该会话上,因为该线程未显示。否则,所有操作都在其上下文中显示(会话操作显示在会话上,线程操作显示在线程上)。

Inline debug actions from the Call Stack view

改进的“调用堆栈”视图行为

我们改进了“调用堆栈”视图的功能

  • 单击调试会话或线程不再展开它们。您必须直接单击折叠符号(**>**)UI 元素。这可以防止在您只想移动焦点时意外展开会话或线程。
  • 如果新的调试会话没有中断,VS Code 将不再自动聚焦它们。

VS Code 现在不仅在字符串输出中,还在调试控制台的表达式中检测链接。链接检测算法也得到了改进。

`PreLaunchTask` 现在可以引用默认构建

随着新变量 `${\defaultBuildTask}` 的引入,现在可以拥有一个通用的 `preLaunchTask`,它总是引用默认的构建任务。

{
  "name": "Hello World",
  "type": "node",
  "request": "launch",
  "preLaunchTask": "${defaultBuildTask}"
}

`${defaultBuildTask}` 解析为执行**任务:运行构建任务**命令时运行的任务名称。与使用**运行构建任务**命令类似,如果存在多个默认构建任务,或者没有默认构建任务,则会显示快速选择以选择构建任务。

当 preLaunchTask 错误时保存选择

当发生 `preLaunchTask` 错误时,您现在可以使用**在用户设置中记住我的选择**复选框来记住您的选择。您的选择将存储在用户设置的 `debug.onTaskErrors` 中,它可以有三个值:`prompt`(默认)、`debugAnyway` 和 `showErrors`。

PreLaunchTask error choice dialog

对扩展的贡献

远程开发(预览版)

远程开发扩展的工作仍在继续,这些扩展允许你使用容器、远程机器或适用于 Linux 的 Windows 子系统 (WSL) 作为功能齐全的开发环境。

1.39 版功能亮点包括:

  • 远程资源管理器现在支持 WSL 扩展,让您可以轻松连接到已安装的 Linux 发行版。
  • 新增**在容器卷中克隆存储库**命令,以便您可以在隔离的环境中处理源代码存储库。
  • SSH 连接共享和使用 SSH 连接到 Windows 远程机器的实验性支持。

您可以在远程开发发行说明中了解新的扩展功能和错误修复。

你还可以阅读最近的两篇博文,描述:

预览功能

预览功能尚未准备好发布,但已足够实用。我们欢迎您在这些功能开发期间提供早期反馈。

TypeScript 3.7-beta 支持

尽管 VS Code 在官方发布之前不会捆绑 TypeScript 3.7,但我们已经致力于支持所有令人兴奋的新 TypeScript 3.7-beta 功能

这些功能包括:

  • JavaScript 和 TypeScript 文件中可选链和 nullish 合并的语法高亮。
  • 可选链的完成支持。
  • 使用新的 `javascript.format.semicolons` 和 `typescript.format.semicolons` 设置控制分号。

您今天可以轻松地通过安装TypeScript Nightly 扩展来尝试所有这些新的 TypeScript 3.7 功能。如果您在使用 TypeScript 3.7 beta 时遇到任何错误,请提供反馈并告诉我们!

扩展创作

扩展终端 API

扩展终端 API 已最终确定,允许扩展对终端输入做出反应并完全控制其输出。以下代码在启动时创建一个扩展终端并以红色打印“Hello world”:

const writeEmitter = new vscode.EventEmitter<string>();
const pty: vscode.Pseudoterminal = {
  onDidWrite: writeEmitter.event,
  open: () => writeEmitter.fire('\x1b[31mHello world\x1b[0m'),
  close: () => {}
};
vscode.window.createTerminal({ name: 'My terminal', pty });

有关更多详细信息,请参阅API 参考扩展终端示例

符号和补全的弃用标签

允许将补全项和符号标记为已弃用的符号标签 API 已最终确定。在1.38 版发行说明中了解更多信息。

在这里您可以看到Java 扩展正在使用 `SymbolTag.Deprecated` 来显示引用已弃用类型或成员的源代码,并带有删除线。

Java deprecated method

调试会话名称不再是只读的

现在可以更改 `DebugSession` 的名称。调试会话的名称最初取自 `DebugConfiguration`。任何更改都将正确反映在 UI 中。

如果 Webview 未对本地资源使用 Webview.asWebviewUri,则发出警告

在开发使用Webview API的扩展时,如果您直接使用 `vscode-resource:` URI 而不是新的Webview.asWebviewUri API来加载本地资源创建 Webview,我们现在会记录警告。

Debug warning for a webview that uses vscode-resources

尽管旧的 `vscode-resource:` URI 将继续工作,但我们希望所有 webview 扩展迁移到 `Webview.asWebviewUri` API,因为新 API:

  • 处理从网络驱动器加载本地资源的一些棘手边缘情况。
  • 使得 Webview 可以加载本地和远程内容的混合。
  • 对于 VS Code 的 Web 版本,将更可靠地工作。

TreeView 消息 API

在树视图中设置消息的 API 已最终确定。您可以在树视图扩展示例中看到如何使用消息 API 的示例。

更新了 Octicons 样式

我们更新了 Octicons 以匹配我们的新图标轮廓样式,以便我们的所有图标都保持一致。

Updated Octicons

SCM 文件夹菜单

更新后的 SCM 视图现在支持以树形结构呈现更改。作为 SCM 提供者,您可以使用 `scm/resourceFolder/context` 菜单 ID 向文件夹的菜单贡献命令。

语言服务器协议

语言服务器协议 3.15.0 版本的规范已发布。该版本尚未最终确定,因此仍欢迎在语言服务器协议存储库中以问题或拉取请求的形式提供反馈。流式传输和进度报告支持已添加到语言服务器协议的下一版本。节点服务器和 VS Code 客户端的实现分别作为 `vscode-languageserver@6.0.0-next.1` 和 `vscode-languageclient@6.0.0-next.1` 提供。

调试适配器协议

取消支持

调试适配器协议中新增了一个 `cancel` 请求,它可以向调试适配器提供一个提示,表明前端客户端不再对先前发出的特定请求产生的结果感兴趣。

此请求具有提示特性:调试适配器只能尽力遵守此请求,但不能保证。前端客户端只有在 `supportsCancelRequest` 能力已定义且其值为 `true` 时才能调用此请求。

被取消的请求仍然需要发送响应。这可以是正常结果或错误响应。从已取消的请求返回部分结果是可能的,但请注意,前端客户端没有通用的方法来检测响应是否部分。

在 9 月版本中,VS Code 支持取消 `stacktrace`、`scopes` 和 `variables` 请求(用于**调用堆栈**和**变量**视图)以及 `completions` 请求(用于调试控制台)。

请注意,截至 9 月,只有模拟调试扩展实现了取消。

在源范围中查找可能的断点

DAP 客户端可以使用新的 `breakpointLocations` 请求在给定源范围中查找所有可能的断点位置。这可以在 UI 中用于改进“内联”(“列”)断点的可发现性。

客户端只有在 `supportsBreakpointLocationsRequest` 功能已定义且其值为 `true` 时才能调用 `breakpointLocations` 请求。

建议的扩展 API

每个里程碑都会带来新的提议 API,扩展作者可以进行尝试。一如既往,我们渴望您的反馈。以下是试用提议 API 的方法:

  • 您必须使用 Insiders 版本,因为提议的 API 经常更改。
  • 您的扩展的 package.json 文件中必须包含以下行:"enableProposedApi": true
  • 将最新版本的 vscode.proposed.d.ts 文件复制到您项目的源位置。

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

vscode.env.uiKind

添加了一个新的建议 API `vscode.env.uiKind`,它允许扩展程序从何种 UI 类型中使用。为了支持在浏览器中运行 VS Code,可能的值是 `UIKind.Desktop` 和 `UIKind.Web`。

vscode.env.asExternalUri

拟议的 `vscode.env.asExternalUri` API 允许扩展程序将一个**外部** URI(例如 `http:` 或 `https:` URI)从扩展程序运行的位置解析为客户端机器上相同资源的 URI。这是 `vscode.env.openExternal` API 的补充,不同之处在于它不是使用外部程序打开已解析的 URI,而是将结果返回给扩展程序。

import * as vscode from 'vscode';
import * as http from 'http';

const PORT = 3000;

export function activate(context: vscode.ExtensionContext) {
  startLocalServer(PORT);

  context.subscriptions.push(
    vscode.commands.registerCommand('example.command', async () => {
      const resolved = vscode.env.asExternalUri(
        vscode.Uri.parse(`https://:${PORT}`)
      );
      vscode.window.showInformationMessage(
        `Resolved to: ${resolved} on client and copied to clipboard`
      );
      vscode.env.clipboard.writeText(resolved.toString());
    })
  );
}

function startLocalServer(port: number) {
  const server = http.createServer((req, res) => {
    res.end('Hello world!');
  });
  server.on('clientError', (err, socket) => {
    socket.end('HTTP/1.1 400 Bad Request\r\n\r\n');
  });
  server.listen(port);
  vscode.window.showInformationMessage(`Started local server on port: ${port}`);
}

`vscode.env.asExternalUri` 目前仅支持 `http:` 和 `https:` URI。如果扩展在客户端机器上运行,则此操作为空操作。但是,如果扩展在远程运行,`vscode.env.asExternalUri` 会自动从本地机器到远程目标建立端口转发隧道,并返回隧道的本地 URI。

资源的只读 Webview 编辑器

你可以找到用于预览从着色器到 Excel 文件再到 3D 模型的所有内容的 VS Code 扩展。一些大胆的扩展甚至为可视化编辑二进制文件或 XML 文件构建了复杂的编辑器样式体验。虽然使用 VS Code 现有扩展 API 已经可以实现所有这些功能,但构建预览或自定义编辑器目前需要以非直观的方式拼凑大量 API。它还将很多工作留给了扩展本身,这通常导致用户体验与 VS Code 的其余部分不一致。自定义编辑器 API 提案旨在改善这一点。

自定义编辑器 API 将提供一个框架,供扩展程序创建完全可自定义的读/写编辑器,这些编辑器可用于特定资源的 VS Code 标准文本编辑器。例如,一个 XAML 自定义编辑器可以为你的 `.xaml` 文件显示一个所见即所得 (WYSIWYG) 样式编辑器。我们的最终目标是为扩展程序提供尽可能大的灵活性,同时保持 VS Code 的快速、精简和一致。

本次迭代,我们分享了自定义编辑器 API 提案的第一部分:只读的、基于 webview 的自定义编辑器。您可以在此处找到自定义编辑器提案的概述。自定义编辑器已经用于支持 VS Code 内置的图像预览功能。

目前的提案只是第一步,很可能会进行大量修改。我们将在未来几个月内继续迭代自定义编辑器 API。

TreeView 标题

树视图的标题一直取自扩展的 `package.json` 文件。现在,树视图标题最初取自 `package.json`,但稍后可以更改。对 `title` 属性的更改将正确反映在视图标题的 UI 中。

startDebugging consoleMode 选项用于合并调试控制台

为了更好地支持分层调试会话,我们在 `vscode.debug.startDebugging` API 中添加了一个可选参数 `consoleMode`。此参数控制 VS Code 是否应合并父子调试会话的调试控制台。例如,这对于集群调试特别有用,在集群调试中,有许多子会话,如果所有调试会话都进入同一个调试控制台,则会更清晰。

已删除已弃用的 Terminal.onDidWriteData API

`Terminal.onDidWriteData` 建议的 API 已被删除,取而代之的是全局事件 `window.onDidWriteTerminalData`。

工程

网站更新

我们更新了 Visual Studio Code 网站的图标和颜色,以更好地匹配我们的品牌。这反映在整个网站和文档页面中。

Website colors updated

通过 terser 进行 JavaScript 压缩

我们已将产品构建的 JavaScript 压缩器更改为 terser。以前我们使用的是旧版本的 `uglify-es`。terser 的开发者在我们的采用过程中给予了我们很大的帮助。

文件监视器更新 (Chokidar)

在此里程碑期间,我们将 macOS 和 Linux 的文件监视器更新到版本 `3.x`,这带来了性能改进、内存消耗减少和更小的包大小。您可以从 Chokidar 仓库Chokidar 3 博客文章了解更多信息。

集成测试针对实际构建运行

我们的产品构建作为构建的一部分运行大型集成测试套件。以前,这些测试是在从源代码运行的 VS Code 上执行的。现在,这些测试使用已构建的 VS Code 版本来验证构建是否已准备好发布。

使用 TypeScript 3.6 构建 VS Code

VS Code 核心和内置扩展现在使用TypeScript 3.6 构建。

图片预览已移至内置扩展

VS Code 的图片预览功能已从核心代码库中移出,并移至内置的**图片预览**扩展。图片预览的功能应与以前几乎完全相同。

The built-in Image Preview extension

将图像预览提取到内置扩展中,可以更容易地修复错误和添加功能,并最终允许扩展更容易地覆盖 VS Code 的内置图像预览。

这一变化得益于我们本次迭代完成的自定义编辑器 API 工作。

新文档

Node.js 部署教程

Node.js 部署教程已移至 learn.microsoft.com 上的 Azure JavaScript 开发人员中心

在那里您可以找到使用 Visual Studio Code 进行以下操作的教程:

值得注意的修复

  • 78984:建议小组件中触摸无效
  • 79196:调试控制台显示 REPL 结果和 console.log 输出的顺序错误
  • 80003:常规断点没有标题工具提示
  • 55106:如果至少一个会话验证通过,断点显示为已验证
  • 80435:请允许我在资源管理器侧边栏中隐藏空文件夹部分
  • 80464:SetVariable 请求的失败消息未显示
  • 80402:调试 UI 在调试会话结束时不会清理旋转器
  • 82047:新的标题变量以指示远程名称

感谢

最后但同样重要的是,衷心感谢!以下帮助使 VS Code 变得更好的各位:

对我们问题跟踪的贡献

如果您想帮助我们管理传入问题,请参阅我们的社区问题跟踪页面。

vscode 的贡献

vscode-eslint 的贡献

vscode-languageserver-node 的贡献

language-server-protocol 的贡献

debug-adapter-protocol 的贡献

对 `vscode-debugadapter-node` 的贡献

vscode-css-languageservice 的贡献

vscode-vsce 的贡献

localization 的贡献

有超过 800 名云 + AI 本地化社区成员正在使用 Microsoft 本地化社区平台 (MLCP),其中约有 100 名活跃贡献者参与 Visual Studio Code。我们感谢您的贡献,无论是提供新翻译、投票支持翻译,还是提出流程改进建议。

以下是贡献者的快照。有关项目详情,包括贡献者姓名列表,请访问项目网站:https://aka.ms/vscodeloc

  • 丹麦语:Mark Drastrup, Lasse Stilvang。
  • 荷兰语:Niels ter Haar, Laurens Kwanten。
  • 英语 (英国):Martin Littlecott, s.benson, sonali Dixit。
  • 芬兰语:Kiti Suupohja, Tommi Finnilä。
  • 法语:Thierry DEMAN-BARCELÒ, Maxime Coquerel, Antoine Griffard, Rodolphe NOEL, DJ Dakta。
  • 德语:Christof Opresnik。
  • 希腊语:Θοδωρής Τσιρπάνης。
  • 希伯来语:Yonatan Bachar, Snir Broshi。
  • 印地语:mtar05, निरव आडतिया, Amit Gusain, Degant Puri。
  • 简体中文:Justin Liu, Yizhi Gu, paul cheung, yungkei fan, 斌 项, Yiting Zhu, 一斤瓜子, Tianzhi Zeng, cool yang, Peng Zeng, Y!an, Joel Yang, 楠 姜, 建 周。
  • 繁体中文:Winnie Lin, 蔡牧村, 謝政廷, Yi-Jyun Pan, Poy Chang。
  • 印度尼西亚语:Eriawan Kusumawardhono, Riwut Libinuko, William Surya Permana, Septian Adi, Laurensius Dede Suhardiman。
  • 意大利语:Luigi Bruno, Alessandro Alpi, Claudio Mezzasalma, Marco Dal Pino。
  • 日语:Michihito Kumamoto, Hiroyuki Mori, Aya Tokura, 井上 圭司, Yuzo Konishi, Yoshihisa Ozaki, Kogesaka, Yuta Ojima, TENMYO Masakazu, Koichi Makino, Takayuki Fuwa。
  • 韩语:Hongju, Sungjin Jeong, Seikwang Chung。
  • 拉脱维亚语:Andris Vilde。
  • 立陶宛语:Renatas Laužadis。
  • 波兰语:Kacper Łakomski。
  • 葡萄牙语 (巴西):Marcelo Fernandes, Marcondes Alexandre, Felipe Oliveira, Alan Bueno。
  • 葡萄牙语(葡萄牙):Pedro G..
  • 罗马尼亚语:Mihail-Gabriel Alexe。
  • 俄语:konpl。
  • 西班牙语:José María Aguilar, Abdón Rodríguez P., Ricardo Estrada Rdez, Anix Cormak, Carlos Mendible。
  • 泰米尔语:Rajeshkumar Ramasamy。
  • 土耳其语:Safa Selim。
  • 乌克兰语:Oleksandr Krasnokutskyi, Arthur Murauskas。
  • 越南语:Vương, Van-Tien Hoang, Hai Nguyen, Tuan Duong。