🚀 在 VS Code 中

2021年6月(版本 1.58)

更新 1.58.1:此更新解决了以下安全问题

更新 1.58.2:此更新解决了以下问题

下载:Windows:x64 Arm64 | Mac:通用 Intel silicon | Linux:deb rpm tarball Arm snap


欢迎使用 Visual Studio Code 2021 年 6 月版。此版本包含许多我们希望您会喜欢的更新,其中一些主要亮点包括

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

加入我们的直播,在太平洋时间 7 月 13 日星期二上午 8 点(伦敦时间下午 4 点)观看 VS Code 团队的直播,观看此版本新功能的演示,并现场向我们提问。

Insiders: 想尽快试用新功能吗?您可以下载每晚构建的 Insiders 版本,并尽快试用最新的更新。

工作台

工作区信任

工作区信任功能是 1.57 版本中的一项重大更改,我们认为,即使开发人员不熟悉源代码,也能够安全地浏览代码非常重要。在此里程碑中,我们一直在吸收客户反馈,并专注于修复问题和跟进建议。

为了帮助人们发现可以自定义工作区信任的用户设置,工作区信任编辑器的标题中新增了配置您的设置操作。此操作将调出设置编辑器,并按 @tag:workspaceTrust 进行筛选。

Configure your settings action in the Workspace Trust editor

说到设置,现在有一个新设置可以配置何时显示横幅,指示当前窗口处于受限模式。与 security.workspace.trust.startupPrompt 设置类似,新的 security.workspace.trust.banner 允许您在熟悉工作区信任功能后禁用横幅,并且不需要提醒您正在受限模式下工作。默认情况下,此横幅每个工作区显示一次,并保持显示直到被关闭("untilDismissed")。显示受限模式横幅的其他选项包括 "always""never"

您可以在最近的工作区信任博客文章中了解有关工作区信任的基本原理和开发的更多信息。这篇文章解释了受限模式如何帮助您免受意外和潜在的恶意代码执行的影响,并提供了设置开发机器的技巧,以便您可以快速安全地工作。

设置编辑器

此迭代为设置编辑器增加了对具有固定数量布尔属性的设置对象的支持,方法是将属性呈现为复选框列表。

Settings editor Boolean object renderer demo

此迭代还增加了对枚举数组的额外支持,方法是在编辑模式下使用下拉列表而不是纯文本框。

Settings editor enum array renderer demo

临时工作区

现在有一种新的工作区类型,称为“临时”工作区,它的行为与通常的工作区不同,具体来说:

  • 重新启动或重新加载 VS Code 不会尝试再次打开工作区。
  • 设置为临时工作区的工作区不会显示在最近打开的工作区列表中。

通过在工作区 .code-workspace 文件中添加设置为 truetransient 属性来指定临时工作区

{
  "folders": [],
  "transient": true
}

设置同步

现在有一个故障排除视图用于设置同步,其中包含所有日志和上次同步状态。您可以通过运行命令设置同步:显示同步数据并打开视图子菜单并选中故障排除来启用此视图。

Settings Sync Troubleshoot command in the Settings Sync view menu

主题:GitHub Light Theme

搜索最大结果数设置

现在有一个新设置 search.maxResults,允许您设置文本搜索结果的最大数量。默认值为 20,000,之前为 10,000。加载大量搜索结果时,您可能会看到一些缓慢。

集成终端

编辑器区域中的终端

现在可以在编辑器区域中创建或移动终端,从而实现持久化且始终可见的多维网格布局,而与面板状态无关。

要使用编辑器区域中的终端,有以下几种选项:

  • 通过在编辑器区域中创建终端命令创建。
  • 将终端从选项卡列表拖放到编辑器中。
  • 在终端聚焦时运行将终端移动到编辑器区域
  • 在终端选项卡上下文菜单上选择移动到编辑器区域

4 terminals in the editor area are laid out in a 2 by 2 grid

新的 terminal.integrated.defaultLocation 设置可以设置为 editor,以将新创建的终端默认定向到编辑器区域。

显式设置画布渲染器

在之前的迭代中,我们默认启用了 WebGL 终端渲染器,并将 terminal.integrated.rendererType 设置替换为更简单的 terminal.integrated.gpuAcceleration。不幸的是,某些机器在使用 WebGL 时体验下降,唯一的选择是完全禁用 GPU 加速并切换到速度慢得多的基于 DOM 的渲染器。现在可以将 terminal.integrated.gpuAcceleration 显式设置为 canvas,这对于这些环境可能更可取。

新的 terminal.integrated.showLinkHover 设置允许您禁用终端中的链接悬停。如果您觉得终端链接上的悬停分散注意力,这将非常有用。

编辑器

编辑器滚动条自定义

现在有新设置可以自定义编辑器的滚动条:

  • 使用 editor.scrollbar.horizontaleditor.scrollbar.vertical 控制滚动条的可见性。
  • 使用 editor.scrollbar.horizontalScrollbarSizeeditor.scrollbar.verticalScrollbarSize 更改其粗细。
  • 使用 editor.scrollbar.scrollByPage 确定单击是按页面滚动还是跳转到单击位置(默认行为)。

编辑器下方的垂直滚动条宽度设置为 30 像素。

Vertical editor scroll bar width set to 30 pixels

语言

Markdown 预览中的数学公式渲染

VS Code 的内置 Markdown 预览现在可以使用 KaTeX 渲染数学方程式。

Math rendering in the built-in Markdown preview

行内数学方程式用单美元符号包裹

Inline math: $x^2$

您可以使用双美元符号创建数学方程式块

Math block:

$$
\displaystyle
\left( \sum_{k=1}^n a_k b_k \right)^2
\leq
\left( \sum_{k=1}^n a_k^2 \right)
\left( \sum_{k=1}^n b_k^2 \right)
$$

您可以设置 "markdown.math.enabled": false 以禁用此功能。

Markdown 数学公式语法高亮

VS Code 现在还支持 Markdown 源代码中数学方程式的高亮显示

Syntax highlighting of a math equation in a Markdown file

这在普通 Markdown 文件和笔记本中的 Markdown 单元格中都有效。

TypeScript 4.3.5

我们现在捆绑了 TS 4.3.5。此小版本更新修复了一些重要的错误,包括 JSX 中自动导入不起作用

调试

记住每个文件的所选环境

当在没有 launch.json 文件的情况下启动调试时,VS Code 会查看活动编辑器,并根据编辑器的语言模式决定使用哪个调试扩展。但是,对于某些语言,可能有多个调试扩展,在这种情况下,VS Code 会提示您选择其中一个。为了使调试更顺畅,VS Code 现在会记住每个文件的所选调试器,以便下次启动调试时,会话无需任何提示即可启动。

在下面的短视频中,用户选择 Node.js 调试环境来调试单个 JavaScript 文件,并且当该文件启动新的调试会话时,该选择会被记住。

Debug is started first time and the environment prompt is presented. The next time there is no prompt when the debug session starts

调试控制台建议不再在 Enter 键上接受

调试控制台建议不再在 Enter 键上接受,而仅在 Shift+EnterTab 键上接受。以前,当您只想评估调试控制台输入中已键入的内容时,很容易意外地接受建议。

为了使 Tab 键更容易被发现为接受建议的方式,VS Code 现在在调试控制台输入中有一个提示状态栏(“插入 (Tab)”)。

Debug console input box showing a Status bar rendered in the bottom that says "Insert (Tab)"

扩展贡献

Jupyter 交互窗口

我们已经开始致力于在笔记本生态系统之上提供内置交互窗口体验,并且 Jupyter 扩展已在其设置 jupyter.enableNativeInteractiveWindow 之后采用了它。如果启用了该功能,当从 Python 文件运行代码或直接从命令面板启动时,Jupyter 扩展将打开内置编辑器而不是 webview 实现。内置编辑器与您自定义的快捷键/键位映射或语言扩展一起使用,因为它与工作台深度集成。

Jupyter built-in interactive window demo

Jupyter 笔记本调试

我们一直在努力支持 Jupyter 笔记本中的调试,以便您可以在笔记本单元格中设置断点、逐步执行单元格以及使用所有其他 VS Code 调试器功能。这是一个实验性功能,但您可以通过设置 "jupyter.experimental.debugging": true、在您选择的内核中安装 ipykernel 版本 6,然后单击笔记本工具栏中的调试按钮来试用它。

Jupyter debugging

远程仓库

在此迭代中,我们主要关注 远程仓库扩展的错误修复和一些性能改进,以及与 GitHub Pull Requests and Issues 扩展的更好集成。此外,您现在可以从远程资源管理器中的远程仓库视图中删除远程仓库,并且更好地支持打开带有行范围的 \blob URL。

GitHub Pull Requests and Issues

GitHub Pull Requests and Issues 扩展的本次迭代重点是修复错误。查看更新日志以查看亮点。

远程开发

远程开发扩展方面的工作仍在继续,这些扩展允许您使用容器、远程计算机或 Windows Subsystem for Linux (WSL) 作为功能齐全的开发环境。

1.58 中的功能亮点包括:

  • 可以选择仅为转发的端口打开一次浏览器。
  • devcontainer.json 支持缓存的镜像。
  • 开发容器现在检查“hostRequirements”。

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

实时预览

我们开发了一个 实时预览扩展,该扩展托管了一个用于 Web 开发预览的本地服务器!🎉

它具有编辑器内浏览器预览、实时预览刷新(在文件更改或保存时)、多根目录支持等等!

Live Preview Quick Walkthrough

该扩展还具有一个 Live Preview 任务,该任务运行持久服务器,并允许您查看服务器流量及其关联的文件。

Live Preview Tasks

要了解有关其功能的更多信息,您可以在 Marketplace 中找到详细信息,或查看其存储库

预览功能

TypeScript 4.4 支持

此版本包括对即将发布的 TypeScript 4.4 版本的初始支持。您可以在 TypeScript 博客上阅读有关 TypeScript 4.4 中新语言功能和改进的更多信息。

要开始使用 TypeScript 4.4 每夜构建版本,请安装 TypeScript Nightly 扩展

请分享您的反馈,并告知我们您是否遇到任何 TypeScript 4.4 的错误。

在窗口之间移动终端

现在可以通过在一个窗口中通过终端:分离会话分离终端,然后在另一个窗口中使用终端:附加到会话附加终端,从而在窗口之间移动终端。将来,这应该有助于实现跨窗口拖放!

扩展创作

详细的完成项标签

我们添加了新的 API,用于更详细和结构化的完成项标签。您现在可以使用 vscode.CompletionItemLabel 类型作为项目的标签,它允许您指定标签、详细信息和描述。

这些新属性允许语言扩展显示签名或限定符,但其他完成提供程序也可以利用这一点。例如,GitHub Pull Request and Issues 扩展现在显示别名旁边的全名。

Completion for Github aliases with full names

模态消息的详细信息

用于显示模态信息、警告和错误消息的 API 现在支持提供详细信息。详细信息文本在实际消息下方呈现,并且不那么突出。

A modal dialog with details

上面的对话框是使用以下代码片段生成的。请注意,详细信息文本仅支持模态消息(modal: true)。

vscode.window.showInformationMessage('This is the message', {
  modal: true,
  detail:
    'This is the detail. Rendered less prominent, but with more space for, well, details.'
});

贡献终端配置文件

终端配置文件现在可以由扩展贡献,它们将显示在配置文件选择器中

A contributed profile will show up along side detected and configured terminal profiles

要贡献终端配置文件,您需要执行三件事:

首先,将贡献添加到您的 package.json

"contributes": {
  "terminal": {
    "profiles": [
      {
        "title": "Custom Profile",
        "id": "custom_profile"
      }
    ]
  },
}

接下来,添加激活事件,以便在用户请求配置文件时激活扩展

"activationEvents": [
  "onTerminalProfile:custom_profile"
]

最后,注册终端配置文件提供程序,该提供程序将返回用于创建终端的选项集。选项可以是基于标准进程的 TerminalOptions 或自定义的 ExtensionTerminalOptions

vscode.window.registerTerminalProfileProvider('custom_profile', {
  provideTerminalProfile() {
    return {
      options: {
        name: 'Profile from extension',
        shellPath: 'cmd.exe'
      }
    };
  }
});

更改基于 ExtensionTerminalOptions 的终端名称

新的 Pseudoterminal.onDidChangeName 事件允许更改使用 ExtensionTerminalOptions 创建的终端的名称。

const writeEmitter = new vscode.EventEmitter<string>();
const nameEmitter = new vscode.EventEmitter<string>();
const pty = {
  onDidWrite: writeEmitter.event,
  onDidChangeName: nameEmitter.event,
  open: () => writeEmitter.fire('Press and key to set the terminal title'),
  close: () => {
    /* noop*/
  },
  handleInput: (data: string) => {
    writeEmitter.fire(`Set title to "${data}"`);
    nameEmitter.fire(data);
  }
};
const terminal = (<any>vscode.window).createTerminal({ name: `My Extension REPL`, pty });
terminal.show();

为通过扩展 API 创建的终端设置图标

window.createTerminal 现在接受 iconPath,将图标与选项卡中的终端关联起来。

const term = vscode.window.createTerminal({
  name: `Serve`,
  iconPath: new vscode.ThemeIcon('server-process')
});
term.show();

The iconPath will show up next to the terminal's name

枚举已保存的 Memento 键

有一个新的 Memento.keys() API 来枚举已保存的 Memento 键的集合。此 API 可以更轻松地处理以前保存的数据,并且如果您需要迁移保存的数据,则非常有用。

语言服务器协议

新的语言服务器协议版本以及相应的 npm 模块已发布。该版本包含 诊断拉取模型规范的最终提案。

调试适配器协议

“内存写入”请求和“内存更改”事件的进展

我们计划在未来版本的 VS Code 调试体验中集成内存查看器。为此,调试适配器协议中已经存在 ReadMemory 请求一段时间了。我们现在正在开发相应的 WriteMemory 请求和 Memory 事件。WriteMemory 请求有一个 最终提案,将在下一个里程碑中添加到 DAP。Memory 事件提案仍在 讨论中。如果您是调试扩展作者,并且对这些 DAP 协议添加感兴趣,我们将不胜感激您的反馈。

建议的扩展 API

每个里程碑都带有新的建议 API,扩展作者可以试用它们。与往常一样,我们希望收到您的反馈。以下是您试用建议 API 需要执行的操作:

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

您不能发布使用建议 API 的扩展。下一个版本中可能会有重大更改,我们绝不想破坏现有扩展。

富状态栏悬停

有一个新的建议 API,用于支持状态栏项目上的富悬停。要试用它,请在 StatusBarItem.tooltip2 中提供 MarkdownString

Rich Status bar hover

  • 如果 MarkdownString.supportThemeIcons 为 true,则可以使用带有 $(iconName) 语法的图标。
  • 如果 MarkdownString 是受信任的,您还可以添加命令链接。语法:([test](command:vscode.newWindow))

测试

最终确定测试 API 的进程仍在继续。此迭代中,我们重构了一些测试 API,以更好地匹配扩展主机中其他 API 的样式。要跟踪最终确定过程并了解 API 的更改,请关注 issue #122208

我们预见的主要更改是如何提供“运行配置”。要跟踪或权衡这些运行器 API 的进度,请关注 issue #127096

最后,我们开始了 测试覆盖率的调查和初始实现,这将在未来几周内在 UI 中获得表面积。

内联建议

内联建议 API 允许扩展提供与建议小部件分离的内联建议。内联建议的呈现方式就好像它已被接受一样,但颜色为灰色。用户可以循环浏览建议并使用 Tab 键接受它们。

vscode.languages.registerInlineCompletionItemProvider(
  { pattern: '**' },
  {
    provideInlineCompletionItems: async (document, position) => {
      return [{ text: '< 2) {\n\treturn 1;\n\t}' }];
    }
  }
);

Inline suggestions in the editor

工程

ES2020

我们已更新 TypeScript 项目以允许使用最新的 JavaScript API,例如 Promise.allSettledString.replaceAll。我们还输出了更现代的 JavaScript ES2020,这略微减小了我们主捆绑包的总体大小。

Electron 沙盒支持的进展

在此里程碑中,我们继续使 VS Code 窗口准备好启用 Electron 的 沙盒上下文隔离 功能。

具体来说:

  • 我们取消了加载打开 VS Code 窗口通常所需的资源的 Node.js 依赖项。
  • 我们向 iframe 元素添加了搜索功能,以使行为更接近已弃用的 webview 组件,从而允许我们在将来删除 webview。可以通过在 settings.json 文件中设置 "webview.experimental.useIframes": true 来启用此功能。

文档

数据科学教程和主题

数据科学教程和主题现在位于 https://vscode.js.cn 目录的单独部分下。您可以找到有关使用 Jupyter NotebooksPython 交互窗口的教程,甚至还有分析泰坦尼克号乘客数据的数据科学教程

Data Science table of contents on code.visualstudio.com

值得注意的修复

  • 120956:iPad:无法在编辑器外部触发上下文菜单
  • 122448:如果扩展的依赖项被禁用,则自动禁用扩展
  • 124169:尝试不缩进活动调试行
  • 125144:当线程不再停止时,焦点不会自动传递到另一个线程
  • 125528:当断点视图中不再停止时,取消选择断点
  • 126211:通过调试器启动的 Node 进程在退出 VS Code 时未被终止
  • 126702:macOS:命令行 code . 无法工作
  • 127716:调试悬停:允许键盘搜索属性

感谢

最后但同样重要的是,非常感谢以下人员在本月为 VS Code 做出贡献

对我们的问题跟踪的贡献

vscode 的贡献

贡献到 vscode-extension-samples

贡献到 vscode-html-languageservice

贡献到 vscode-js-debug

贡献到 vscode-languageserver-node

贡献到 language-server-protocol

贡献到 monaco-editor

贡献到 monaco-languages

贡献到 monaco-typescript