Visual Studio Code 1.7版本的详细介绍

1,054 阅读29分钟

2022年7月(1.70版)

下载。Windows:用户 系统 ARM| Mac。Universal 64 bit Arm64| Linux:deb rpm tarball ARM snap

欢迎来到Visual Studio Code的2022年7月版。这个版本有许多更新,我们希望你会喜欢,其中一些关键的亮点包括:

工作台

更容易定制标题栏

对于那些使用自定义标题栏(Windows、macOS和网络上的默认值)的人来说,你可能已经注意到,我们正在为标题栏引入更多的互动内容。虽然已经有设置可以单独隐藏这些元素,但你现在可以右击标题栏来访问一个上下文菜单,以切换菜单栏(在macOS桌面上不显示)、命令中心和布局控制。

title bar context menu

对于期待系统上下文菜单的Windows用户,仍然可以通过右击窗口左上角的VS Code图标或按Alt+Space 来触发该菜单。鼠标的位置被用来决定用Alt+Space 触发时的行为,所以如果自定义菜单位于标题栏的顶部,它就会出现。

system context menu

对于Linux用户,由于问题#156397,标题栏中的空位不会打开上下文菜单。你必须右键点击你想隐藏的标题栏中的一个项目。

改进了菜单栏的折叠

随着命令中心的增加,我们尝试将菜单栏缩小为汉堡包菜单以腾出空间。在听取了用户的反馈后,我们改回了旧的菜单栏折叠行为,直到大部分的菜单被折叠,然后才切换到汉堡包菜单。

responsive menu bar folding

无障碍的macOS标题栏缩放

同样作为改善命令中心体验的一部分,当交互式组件出现在macOS的标题栏中时,标题栏现在将与UI的其他部分一起缩放,以提高可访问性。

macOS title bar zooming

折叠选择

命令 "从选区创建手动折叠范围"(⌘K ⌘,(Windows, LinuxCtrl+K Ctrl+,))从当前选定的行中创建一个折叠范围,并将其折叠起来。这个范围被称为手动折叠范围,它位于折叠提供者计算的范围之上。

手动折叠范围可以通过命令Remove Manual Folding Ranges(⌘K ⌘.(Windows, LinuxCtrl+K Ctrl+.))。

manual folding ranges

手动折叠范围在没有编程语言支持折叠的情况下特别有用。

保留折叠的范围

VS Code现在可以保留折叠的范围,即使折叠的范围不再是折叠提供者计算的范围的一部分。一个典型的例子是,当用户注释了文件,开始了一个字符串字面,或者产生了一个语法错误,使得无法创建所有的范围。这种折叠的范围成为 "恢复的 "范围。一旦折叠提供者在相同的位置返回了范围,或者通过使用删除手动折叠范围的命令,它们就会被删除。

restored folding ranges

隐藏折叠控件

现在可以用设置"editor.showFoldingControls": "never" 来隐藏地沟里的折叠控件。折叠范围仍然可以使用折叠命令和快捷键来展开和折叠。

三向合并编辑器的改进

我们继续完善新的三向合并编辑器,并在这个版本中默认启用它。合并编辑器可以通过点击源控制视图中的冲突文件来打开。

亮点包括接受来自一方的所有修改的新命令,改进的上下文菜单,增强的差异颜色,以及更加强调冲突与非冲突的修改。

我们也开始探索替代性的差异算法,以提高合并冲突的精确性。如果你在diff或合并编辑器中遇到不理想的修改高亮或对齐,我们希望在GitHub问题追踪器中记录这些案例

命令行选项合并

现在你可以使用命令行选项在VS Code中调出合并编辑器。

-m --merge <path1> <path2> <base> <result> Perform a three-way merge by providing paths for two modified versions of a file, the common origin of both modified versions, and the output file to save merge results.

这使你能够将 VS Code 作为 Git 的合并工具,例如,如果你在.gitconfig 中配置了这个:

[merge]
  tool = code-insiders
[mergetool "code-insiders"]
  cmd = code-insiders --wait --merge $REMOTE $LOCAL $BASE $MERGED

搜索文件的装饰

搜索视图中的搜索结果现在具有文件装饰和右边的颜色来表达文件的问题和源控制信息。这与文件资源管理器中已经显示的文件装饰相似。

Search file decorations

搜索多选

搜索视图现在也支持多选。你对选择中的一个结果执行的任何操作(例如,驳回或替换)也将在其他选择的项目上执行。

Search view multiple selection with exclude and accept actions

树形查找控制

树状视图,如文件资源管理器,现在支持查找控件。你可以在树里面按⌘F(Windows,LinuxCtrl+F)来弹出查找控件。你可以使用查找控件来突出显示匹配的元素,或者切换过滤按钮来隐藏所有不匹配搜索词的元素。

Tree Find control showing search and filter

**注意:**如果你习惯于在文件资源管理器有焦点时调用⌘F(Windows,LinuxCtrl+F)在编辑器中打开查找控件,你可以相应地配置你的键盘绑定。

{
  "key": "cmd+f", // "ctrl+f" on Windows/Linux
  "command": "-list.find",
  "when": "listFocus && listSupportsFind"
}

通过新建文件任意创建文件

文件>新建文件...(或入门页面上的新建文件...链接)的体验已经得到改进,允许任意创建文件。你现在可以在快速输入框中输入一个文件名,在磁盘上创建文件。

A input box with test.js inputted into it and the entry New File(test.js) selected

终端

默认启用Shell集成

Shell集成的自动注入在上个版本中被移出预览,现在默认启用。对于支持的shell设置(大多数bash/zsh/pwsh配置),它应该都只是工作,没有任何变化,你应该看到命令的装饰。

When shell integration is enabled, blue, red and grey circles appear next to commands run in the terminal

如果shell集成功能没有自动点亮,你需要设置手动安装在这个版本中已经简化

terminal.integrated.shellIntegration.enabled 设置为true ,自动注入功能就会启用,将此添加到你的settings.json 文件中以禁用该功能:

"terminal.integrated.shellIntegration.enabled": "false"

这将只禁用VS Code的外壳集成注入。即使在禁用的情况下,如果你的设置中启用了VS Code所理解的其他终端的shell集成,它仍然会接收到这些。如果你不喜欢命令和/或滚动条的装饰,你可以只禁用它们的显示,同时仍然利用shell集成带来的额外功能

简化的shell集成手动安装

以前的手动安装需要几个步骤,而且是针对平台和shell的。新的手动安装使用code CLI来获取shell集成脚本,并在跨平台和连接到远程窗口时工作,这意味着你可以在你的dotfiles中同步它,它应该只是工作:

# Manual install on bash
[[ "$TERM_PROGRAM" == "vscode" ]] && . "$(code --locate-shell-integration-path bash)"

你可以在终端shell集成阅读更多关于如何为其他shell安装shell集成。

更多的shell集成配置选项

新的设置terminal.integrated.shellIntegration.decorationsEnabled 可以让你在gutteroverviewRuler ,或者两者都不显示命令装饰。为了方便使用,当你点击一个装饰时,你可以通过上下文菜单中的配置命令装饰来修改这个设置(选择切换可见性来显示选项下拉)。

The command decoration context menu contains the new option Configure Command Decorations

你也可以从下拉菜单中配置默认图标、成功图标或错误图标。

默认颜色和图标标签设置

默认的图标和终端标签颜色可以使用terminal.integrated.tabs.defaultIconterminal.integrated.tabs.defaultColor 来设置每个文件夹。

扩展的PowerShell键盘绑定

有额外的PowerShell按键绑定,比如Ctrl+Space,这要归功于shell的整合。由于缺乏VT编码,这些在以前是不可能的。只要shell集成在pwsh中起作用,以下按键绑定现在应该可以使用:

  • Ctrl+Space- 仅在Windows上默认为MenuComplete
  • Alt+Space- 默认为SetMark
  • Shift+Enter- 默认为AddLine
  • Shift+End- 默认为SelectLine
  • Shift+Home- 默认为SelectBackwardsLine

这适用于所有的平台,甚至是Linux/MacOS,在那里这些键盘绑定通常是不可能的。默认值可以随时在你的pwsh配置文件中用Set-PSReadLineKeyHandler 。 如果你希望有其他的键位绑定,请让我们知道

运行最近的命令作为反向搜索的替代

当shell集成被启用时,我们的目标是使运行最近的命令成为shell反向搜索(Ctrl+R)的跨shell的替代。有一个新的连续搜索模式,在触发该命令时是默认的。这就像大多数shell中的Ctrl+R,可以选择切换回模糊搜索。

Run recent command's contiguous search will match the search term exactly, toggle Fuzzy Search to switch to fuzzy searching

新的inTerminalRunCommandPicker 上下文键是可用的,可以设置像Ctrl+R一样的键绑定,以进入下一个匹配。例如,下面的键绑定现在可以相当完整地替代你的shell的反向搜索,而Ctrl+Alt+R是对旧行为的回退:

{ "key": "ctrl+r",     "command": "workbench.action.terminal.runRecentCommand", "when": "terminalFocus" },
{ "key": "ctrl+alt+r", "command": "workbench.action.terminal.sendSequence", "args": { "text": "\u0012"/*^R*/ }, "when": "terminalFocus" },
{ "key": "ctrl+r",     "command": "workbench.action.quickOpenNavigateNextInViewPicker", "when": "inQuickOpen && inTerminalRunCommandPicker" },
{ "key": "ctrl+c",     "command": "workbench.action.closeQuickOpen", "when": "inQuickOpen && inTerminalRunCommandPicker" },

多行命令现在会在适当的地方显示一个新行符号,也会使用括号内的粘贴模式,这意味着它们会被当作支持shell的粘贴内容来处理。这通常意味着它们都将被添加到同一个提示符中,而不是分别执行它们。

Run recent command now shows the "Return Symbol" Unicode character (⏎, U+23CE) to visualize new lines

其他shell集成的改进

下面是对shell集成的较小改进:

  • 命令导航改进了视觉反馈,短暂地显示 "焦点边界",然后在沟槽中保持一个持久的矩形,以帮助突出缓冲区中的位置。

    A solid rectangle the color of your theme's focus color now appears to the left of the command being navigated to

  • 新的workbench.action.terminal.copyLastCommand ,允许用一个键绑定来复制上一个命令的输出(Ctrl/Cmd+Shift+Up,Ctrl/Cmd+C,Escape,Ctrl/Cmd+End的快捷方式)。

  • Bash shell集成:

    • 支持更多的$PROMPT_COMMAND 格式。
    • 当已经使用帮助器时,Shell集成应该工作得更好。 bash-preexechelper已经被使用的情况下,Shell集成应该工作得更好。

渲染的改进

在启用GPU加速时,对终端的渲染进行了一些改进。

  • 半圆形的Powerline符号现在是自定义渲染的。就像前一版本中的箭头符号一样,这些符号应该与相邻的单元格无缝融合,即使在使用行高的情况下也能延伸到单元格的高度。

    Semi-circle Powerline symbols now render without needing to configure a font

  • 圆角框画字符 (,,,) 现在使用更平滑的曲线。

    These round corner symbols now render as perfect 1/4 circles

  • 改进了背景颜色变化时字形的剪切问题,这在npm 输出警告时经常出现。

    Wide characters like W would sometimes escape the background of a cell. For example, when the background of the text was yellow, the W in "WARN" could show unexpected yellow pixels in the top left. The After image shows that it is now fixed

  • 与上面的剪切问题类似,有一个问题是一些字形的抗锯齿会与其他字符重叠并降低视觉效果。这个问题最容易用上面这样一个背景例子来说明。k Work 中的一个像素也可以从另一个方向逃出单元格的边界。这个像素根本不会再出现在字形中,因为它因与背景颜色几乎相同而被删除。

    A pixel in  could overlap with the cell to the right, in this case that pixel may not be rendered at all if the difference in color and the background is small

来源控制

动作按钮的改进

我们根据用户的反馈继续打磨源控制动作按钮:

  • 只有在高度确定本地分支领先或落后于远程跟踪分支的情况下,才会显示同步更改的动作按钮。
  • 在考虑智能提交设置的情况下,提交行动按钮只根据更改的资源列表启用。
    • git.enableSmartCommit
    • git.suggestSmartCommit
    • git.smartCommitChanges
  • 提交行动按钮的图标会根据分支保护设置进行更新。
    • git.branchProtection
    • git.branchProtectionPrompt

改进的重定位冲突解决

在这个里程碑中,我们解决了在解决合并冲突时rebase流程中的一些小问题。用户现在应该能够在解决所有合并冲突后,使用源码控制视图中的提交按钮继续进行重构操作。

提交输入字段的拼写检查

在这个里程碑中,我们确认所有必要的扩展API都可用,以支持提交输入字段的拼写检查。我们联系了两个流行的拼写检查扩展的作者,并提交了拉动请求,说明如何更新他们的扩展以提供提交描述文本的拼写检查。

调试

JavaScript 调试

当你创建一个启动配置来调试一个JavaScript/TypeScript程序时,你可以设置"console": "integratedTerminal" ,在终端运行该程序(而不是直接生成的进程)。几个月前,我们注意到launch.json 配置中的"args" 对shell来说是部分转义的,但不是完全的。这意味着,试图向你的程序传递一个参数可能会意外地触发你的shell中的特殊行为。我们清理了这个问题,然后意识到设置参数,包括对shell有特殊含义的字符是一件有用的事情,而且一些用户正在依赖这种行为。

我们讨论了正确的修复方法,并决定这种行为应该是选择性的,而且需要对调试适配器协议(DAP)进行修改。我们对DAP进行了修改,在VS Code和js-debug中实现了它,其他调试适配器也应该很快跟进。

下面是如何在节点启动配置中使用新的行为:

{
    "type": "node",
    "console": "integratedTerminal",
    ...

    // If you pass args as a single string, the characters will not be escaped for the terminal,
    // so the command in backticks will be evaluated, and output will be redirected to "outfile".
    // The user is responsible for knowing the type of shell that this will be run in,
    // and doing any escaping necessary.
    "args": "`echo hello` > outfile",

    // If you pass args as an array, the characters will be escaped for the terminal,
    // so that the program receives them verbatim.
    "args": ["`echo hello` > outfile"]
}

调试会话的挑选器

调试时,你现在可以运行Debug。在命令调板中选择调试会话。这将显示一个带有你的活动调试会话的选择器,你可以用它来搜索和过滤你的个别调试会话。每个选取器项目的描述将显示催生它的会话(如果适用的话)。

在选取器中选择一个项目将在调用堆栈视图中聚焦该调试会话。调试动作(例如,暂停、步骤、重启、停止)将在重点调试会话上执行。选择一个会话也会显示该会话的Debug Console。

Debug Session Picker Demo

任务

对运行任务命令的过滤支持

任务:运行任务(workbench.action.tasks.runTask) 动作支持按任务名称和类型进行过滤,以一种更简洁和可配置的方式来选择和执行任务。

比如说。

{
  "key": "ctrl+h",
  "command": "workbench.action.tasks.runTask",
  "args": {
    "task": "VS Code - Build",
    "type": "npm"
  }
}

改进的自动任务流程

Trusted Workspace功能允许VS Code简化运行自动任务的流程。默认情况下,如果一个文件夹是受信任的,自动任务就会运行,否则每个文件夹会提示你一次。这种行为可以通过task.allowAutomaticTasks 设置(默认为auto )来配置,在运行自动任务前总是(on)或从不(off)提示。

语言

格式化JSON时保留换行符

现在你可以在格式化JSON文档中的一行时保持初始行的位置。例如,在一行中包含数值的数组在格式化后仍会将这些数值保持在同一行。JSON文件中额外的换行符(换行符)也会被保留下来。要启用这个功能,请设置选项JSON > Format:保留行在设置编辑器中。

笔记本

转到最近失败的单元

如果你最近运行的单元格失败了,现在有一个按钮可以跳到该单元格。你也可以运行笔记本。转到最近失败的单元,执行同样的操作。

当你运行一组单元并想知道哪个单元失败并停止了该组的执行时,这很有用。

Go To Most Recently Failed Cell Demo

笔记本Markdown预览附件的渲染

现在可以在Jupyter笔记本中渲染嵌入式base64图片。

粘贴到Jupyter笔记本中并通过![image alt-text](attachment:image.png) 引用的图片现在将在VS Code笔记本中按预期呈现。

以下是Markdown源代码:

Notebook Markdown cell source code with image link

将被呈现为:

Notebool Markdown cell preview with attachment rendered

分享笔记本链接

分享子菜单中的复制 vscode.dev 链接命令现在支持笔记本链接。

VS Code for the Web

设置显示语言

你现在可以通过在扩展视图中的语言包扩展上的设置显示语言按钮来设置浏览器的显示语言:

Set Display Language button on a language pack in the Extensions view

设置后,您可以通过使用当前设置的语言包扩展上的清除显示语言按钮来清除显示语言:

Clear Display Language button on the current language pack in the Extensions view

对扩展的贡献

Python

上手体验

Python扩展演练现在可以让用户顺利过渡到安装Python(如果需要),并选择它。在未安装Python时,会打开Microsoft Store或适当的演练瓦片,用户可以自动运行显示的说明。任何与解释器有关的提示只有在用户操作需要解释器时才会显示,而不是在启动时。另外,UI提示也得到了改进,对错误和建议的修改更加精确。

Python in-product Get started walkthrough

状态栏中的解释器信息

增加了一个新的设置python.interpreter.infoVisibility ,它可以控制何时在状态栏中显示所选解释器的信息。默认情况下,解释器信息只在打开Python相关文件时显示(onPythonRelated)。它可以被设置为always ,以恢复到旧的行为,即无论打开什么文件都会显示所选的解释器。增加了一个警告状态,以表明所选解释器无效的情况。

Interpreter information in the Status bar

自动调试配置

Python扩展现在支持自动调试配置,它分析了当前的项目并为你提供了不需要额外修改的调试配置。

该扩展可以识别Django、Flask和FastApi项目,以及简单的Python文件。

你可以了解更多关于自动调试配置最近的一些改进

Flask automatic debug configuration

实验性扩展。WWBD

有一个新的实验性Python扩展名为WWBD,作为Python环境工作流程想法的沙盒。截至目前,有一个针对虚拟环境的Create Environment命令,看看一个命令是否可以帮助用户建立一个新的虚拟环境(完整的细节和其他扩展功能见WWBD扩展页)。你可以阅读项目库中的Ideas类别,了解正在考虑的其他想法,包括conda支持。

Jupyter

复制绘图图像到剪贴板

Jupyter扩展中,现在可以将单元格输出中的绘图复制到剪贴板中。请确保你选择了正确的表现形式,因为目前只支持PNG输出。

Select image/png when copying plot to the clipboard

一旦你设置了正确的表现形式,选择右上方的复制到剪贴板按钮。

Copy plot button

网络扩展

以下功能被移植到Jupyter扩展的网络版中。

  • 图形查看器
  • 数据框架查看器

如果你想试验一下这些功能,可以在你的本地机器上用......启动Jupyter。

jupyter notebook --no-browser --NotebookApp.allow_origin_pat=https://.*\.vscode-cdn\.net

然后用Jupyter命令连接到它**。vscode.dev指定Jupyter服务器进行连接**。

更多信息(和评论),请看这个讨论项目

交互式窗口恢复

交互式窗口会话现在可以通过打开设置interactiveWindow.restore ,在VS Code窗口重新加载时进行恢复。

Interactive Window restore

限制。原始内核状态在窗口重载时并不持久(更多信息见本讨论项目)。如果你使用的是远程Jupyter服务器,交互式窗口在重载时将会连接到之前的内核会话。

从.env文件加载环境变量

对从.env 文件加载环境变量进行了一些修正,包括检测对.env 文件的修改。Python 内核现在将从设置python.envFile 中定义的文件中加载环境变量。

GitHub 拉动请求和问题

GitHub 拉动请求和问题扩展有了更多进展,它允许你处理、创建和管理拉动请求和问题。这个版本的亮点包括。

  • 有一个新的按钮,只显示拉动请求自查看者最后一次审查以来的变化。
  • 在源码控制视图中新的提交和创建拉动请求动作让你可以在一个步骤中完成Git提交并转到创建PR视图。
  • githubPullRequests.pullRequestDescription 设置可用于配置PR描述的源文本。

查看扩展的0.48.0版本的更新日志,看看其他的亮点。

远程开发

远程开发扩展的工作仍在继续,它允许你使用容器、远程机器或Windows Subsystem for Linux(WSL)作为一个全功能的开发环境。

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

预览功能

编辑器粘性滚动

现在可以显示用户界面,显示用户在滚动过程中所处的范围。这个 "粘性滚动 "用户界面将显示编辑器顶部所处的类/界面/命名空间/函数/方法/构架,帮助你了解文档中的位置。通过editor.experimental.stickyScroll.enabled 设置启用粘性滚动。

"Sticky scroll" showing the source code scope for a TypeScript file

支持TypeScript 4.8

这次更新包括对即将发布的TypeScript 4.8的支持。请参阅TypeScript 4.8迭代计划,了解更多关于TypeScript团队目前正在进行的工作的细节。

要开始使用TypeScript 4.8的夜间构建,请安装TypeScript Nightly扩展。

设置配置文件

在过去的几个月里,我们一直在努力支持VS Code中的设置配置文件,这也是社区中最受欢迎的要求之一。这项功能可在Insiders版本中通过workbench.experimental.settingsProfiles.enabled 设置进行预览。试用它,并通过在VS Code仓库中创建问题或在问题#116740中发表评论让我们知道你的反馈。

在这个里程碑中,我们还在VS Code for the Web中增加了对设置配置文件的支持。你可以使用insiders.vscode.dev和相同的workbench.experimental.settingsProfiles.enabled 设置进行尝试。

Settings Profiles demo, showing the theme, zoom level, and Activity bar position changing as the profile is switched

主题。浅粉色

任务重新连接

在窗口重新加载时,通过启用task.experimental.reconnection ,可以重新连接到观察任务,这使得在扩展变化或VS Code版本更新后,可以更快地恢复工作。

代码操作

我们一直在努力为VS Code中的Code Actions提供更好的体验。代码操作包括重构、源码操作和快速修复。

新的实验性的Code Actions控件可以从上下文菜单中选择 RefactorSource Action,从lighbulb中打开,或通过Quick Fix打开。通过editor.experimental.useCustomCodeActionMenu 设置进行尝试。通过在VS代码库中创建问题或在问题#152913中发表评论,让我们了解任何反馈。

代码动作的重构预览也可以从新的代码动作控件中获得。将鼠标悬停在已启用的项目上,查看如何预览。自定义键绑定支持选择代码动作,以及预览选择。

Code Action control demo, showing control access from the context menu, a lightbulb, and Quick Fix.

在这个里程碑中,我们还增加了对代码动作的自定义键绑定的支持,其中包括快速修复(⌘.(Windows, LinuxCtrl+.))。你可以试试,把下面的片段加上你想要的键盘快捷键,keybindings.json

[  {    "key": "ctrl+k",    "when": "CodeActionMenuVisible",    "command": "focusPreviousCodeAction"  },  {    "key": "ctrl+j",    "when": "CodeActionMenuVisible",    "command": "focusNextCodeAction"  }]

跨越VS代码的网络和桌面的编辑会话

编辑会话的工作仍在继续,当你继续在VS Code for the Web或桌面的版本库上工作时,你可以带着你未提交的修改。一些亮点包括:

  • 在关闭编辑会话功能时,你现在可以从云中删除所有存储的编辑会话。
  • 现在支持用微软认证登录。
  • 如果你在定位你的编辑会话时遇到困难,你可以用编辑会话查看你的所有编辑会话**。显示编辑**会话命令。

要试用编辑会话,请在您的设置中设置workbench.experimental.editSessions.enabled ,并使用编辑会话。存储当前的编辑会话命令,根据提示用 GitHub 或微软认证登录。然后使用 "编辑会话"。恢复最新的编辑会话命令,在另一台机器上的存储库或VS Code实例中,将所有修改的文件的工作内容恢复到你的工作空间。你可以在任何时候使用 "编辑会话 "签出**。签出**命令。

随着我们对编辑会话体验的不断迭代,请尝试它,并通过问题#141293的评论与我们分享您的反馈。

扩展编写

用于 "when "条款的 "not in "操作符

有一个操作符已经存在于when子句中,即in ,它允许在另一个具有数组或对象类型值的上下文键中动态查找一个上下文键的值。我们添加了一个新的操作符not in ,它否定了这一点。详情请参见when 条款contexts文档。

htmlLanguageParticipants贡献点

一个新的贡献点htmlLanguageParticipants ,允许类HTML语言声明它们要继承所有的HTML语言服务器功能,如代码补全、悬停和轮廓。这对于不想实现完整语言服务器的编程语言扩展是很有用的。

一个例子是内置的handlebars 扩展,现在它的package.json 中加入了自己的htmlLanguageParticipants

"contributes": {
  "htmlLanguageParticipants": [
     {
       "languageId": "handlebars"
      }
    ]
}

Quarkus扩展已经采用了这个贡献点。它通过对嵌入式QuteHTML模板语言的额外建议来丰富HTML的功能。

Qute HTML participant

落入编辑器的API

文本编辑器投放API让扩展处理文件或其他内容投放到文本编辑器。这些投放事件可以来自VS Code内部,比如从VS Code的资源管理器中拖动一个文件到文本编辑器中,也可以从你的操作系统中投放一个文件到VS Code中产生。

Using the drop into editor API to insert an image in Markdown by dragging it from VS Code's Explorer

要把文件拖入编辑器,用户可以在拖动时按住kbsytyle(Shift) ,然后把文件拖到文件的特定位置。在这一点上,你的扩展可以选择如何处理掉的数据。

请查看 "放入编辑器 "扩展示例,了解该API的一个简单的操作实例。

建议的API

每个里程碑都会有新的提议的API,扩展作者可以尝试它们。一如既往,我们希望得到您的反馈。以下是试用提议的API的步骤:

  1. 找到一个你想尝试的建议,并将其名称添加到package.json#enabledApiProposals
  2. 使用最新的vscode-dts并运行vscode-dts dev 。它将下载相应的d.ts 文件到你的工作区。
  3. 你现在可以对该提案进行编程。

你不能发布一个使用提议的API的扩展。在下一个版本中可能会有破坏性的变化,我们不想破坏现有的扩展。

Webview上下文菜单

新的webview上下文菜单提案使高级webview可以很容易地自定义用户在webview内右键点击时显示的上下文菜单。这个新的贡献点使用VS Code的正常上下文菜单,所以自定义菜单与编辑器的其他部分相适应。Webviews也可以为Webview的不同部分显示自定义上下文菜单。

要尝试这个新的API,你需要启用contribWebviewContext 建议:

"enabledApiProposals": [
  "contribWebviewContext"
]

要在你的webview中添加一个新的上下文菜单项,在menus ,在新的webview/context 部分下添加一个新条目。每个贡献都需要一个command (这也是标题的来源)和一个when 子句。when子句应该包括webview == 'YOUR_WEBVIEW_VIEW_TYPE' ,以确保上下文菜单只适用于你的扩展的webviews:

"contributes": {
  "menus": {
    "webview/context": [
      {
        "command": "catCoding.yarn",
        "when": "webview == 'catCoding'"
      },
      {
        "command": "catCoding.insertLion",
        "when": "webview == 'catCoding' && webviewSection == 'editor'"
      }
    ]
  },
  "commands": [
    {
      "command": "catCoding.yarn",
      "title": "Yarn 🧶",
      "category": "Cat Coding"
    },
    {
      "command": "catCoding.insertLion",
      "title": "Insert 🦁",
      "category": "Cat Coding"
    },
    ...
  ]
}

在webview内部,你也可以使用data-vscode-context 数据属性(或在JavaScript中使用dataset.vscodeContext )为HTML的特定区域设置上下文。data-vscode-context 值是一个JSON对象,它指定了当用户右键点击元素时要设置的上下文。最终的上下文是通过从文档根到被点击的元素来确定的。

以这个HTML为例:

<div class="main" data-vscode-context='{"webviewSection": "main", "mouseCount": 4}'>
  <h1>Cat Coding</h1>

  <textarea data-vscode-context='{"webviewSection": "editor", "preventDefaultContextMenuItems": true}'></textarea>
</div>

如果用户右键点击textarea ,以下上下文将被设置:

  • webviewSection == 'editor' - 这覆盖了来自父元素的 。webviewSection
  • mouseCount == 4 - 这是从父元素中继承来的。
  • preventDefaultContextMenuItems == true - 这是一个特殊的上下文,隐藏了VS Code通常添加到webview上下文菜单中的复制和粘贴条目。

如果用户在<textarea> 里面点击右键,他们会看到。

Custom context menus showing in a webview

视图大小

视图大小建议让扩展为其贡献的视图提供权重:

"contributes": {
    "views": {
        "github-pull-request": [
            {
                "id": "github:createPullRequest",
                "type": "webview",
                "name": "Create Pull Request",
                "size": 2
            },
            {
                "id": "github:compareChanges",
                "name": "Compare Changes",
                "size": 1
            }
        ]
    }
}

大小的作用类似于CSS属性flex-grow 。在上面的例子中,带有"size": 2 的视图的大小将是带有"size": 1 的视图的两倍。只有当视图容器是由同一个扩展贡献的时候,大小属性才会被尊重。

可扩展的HTML笔记本渲染器

我们内置的笔记本渲染器现在暴露了一个实验性的API,让扩展可以定制HTML内容的渲染。这个API目前暴露了一个单一的钩子,postRender ,它在HTML内容的初始渲染之后被调用。

要尝试使用这个实验性 API,你的扩展需要扩展vscode.builtin-renderer API

"contributes": {
  "notebookRenderer": [
    {
      "id": "vscode-samples.my-custom-html-extension",
      "displayName": "My custom html renderer extension",
      "entrypoint": {
        "extends": "vscode.builtin-renderer",
        "path": "./out/main.js"
      }
    }
  ]
}

然后你的渲染器可以在vscode-builtin-renderer 上注册一个渲染钩子:

import type { RendererContext } from 'vscode-notebook-renderer';

export async function activate(ctx: RendererContext<void>) {
  const htmlRenderer = await ctx.getRenderer('vscode.builtin-renderer');
  if (!htmlRenderer) {
      throw new Error(`Could not load 'vscode.builtin-renderer'`);
  }

  htmlRenderer.experimental_registerHtmlRenderingHook({
    // Invoked after the HTML content for `outputItem` has been rendered to `element`
    postRender(outputItem: OutputItem, element: HTMLElement): HTMLElement | undefined {
      // You can either modify `element` or return a replacement element
    }
  });
}

测试一下这个新的API,并让我们知道你的想法!

调试适配器协议

argsCanBeInterpretedByShell for RunInTerminalRequest

RunInTerminalRequest 支持一个新的属性,argsCanBeInterpretedByShell ,它告诉客户端在命令args 中的特殊shell字符是否应该不被转义。这是为了使用户能够编写在终端启动的启动配置,并包括应该由shell解释的字符。

工程

支持Electron沙盒的进展

在这个里程碑中,我们在默认情况下启用Electron的沙盒方面取得了实质性进展。我们计划在8月为内部人员启用沙盒,并最终使其成为稳定版VS代码的默认选项。

对于那些好奇的人来说,在设置中配置"window.experimental.useSandbox": true ,就可以启用沙盒模式。希望你不会注意到任何变化,但如果你发现问题,请向我们报告。

Markdown语言服务器

在这次迭代中,我们将VS Code的大部分工具提取出来,用于编写Markdown的语言服务器。这包括我们的路径完成、文档大纲和诊断的工具。

VS Code 内置的 Markdown 扩展已经切换到使用这个新的语言服务器,尽管希望你不会注意到行为上的任何不同。不过这种转换应该有助于提高性能,因为它把Markdown工具移到了自己的进程中。转移到一个语言服务器也帮助我们改善了我们实验性的Markdown链接诊断的性能。

我们希望其他工具和编辑器也能从这些新的软件包中受益,甚至为它们做出贡献。我们可以一起为每个人建立更好的Markdown工具!如果你有兴趣,请查看相关项目:

蝶变软件包的依赖性

蝶变软件包的依赖性现在由一个脚本生成,而不是硬编码。这解决了2016年提出的一个问题,即缺失的依赖关系会导致程序在某些机器上运行时崩溃。

文档和扩展

开发容器CLI

开发容器命令行界面(CLI)主题已更新为最新版本的CLI。开发容器CLI可以让你构建和运行开发容器,是开发容器规范的一个开源参考实现

Banner from the Development Containers Specification website

Azure开发者CLI(azd)

Azure开发者CLI及其配套的VS Code扩展现在已经进入公开预览阶段。Azure Developer CLI(azd)通过提供开发人员友好的命令,映射到工作流程中的关键阶段,加快了从本地开发环境到Azure的时间:代码、构建、部署、监控、重复。

Azure Developer CLI extension

Azure开发者CLI使用可扩展的模板,包括在Azure中启动和运行应用程序所需的一切。这些模板包括最佳实践、应用程序代码和可重复使用的基础设施作为代码资产。不仅如此,它们还涵盖了端到端的场景,远远超过了 "你好,世界!"。

通过Azure Developer CLI,你可以初始化、配置和部署一个应用程序,或者更好的是,使用'azd up',一步到位!关于支持的azd 命令的列表,请参见开发者CLI参考

谢谢你

最后,但肯定不是最不重要的,我们要向 谢谢你向VS代码的贡献者致敬。