跳转到内容

VSCode 1.69

主要内容摘抄自 VSCode 1.69 发行说明,文中“我们”即 VSCode

3 路合并编辑器

在此版本中,我们继续开发 3 向合并编辑器。可以通过将 git.mergeEditor 设置为 true 来启用此功能,并将在未来的版本中默认启用此功能。

合并编辑器允许您快速解决 Git 合并冲突。启用后,可以通过单击“源代码管理”视图中的冲突文件来打开合并编辑器。复选框可用于接受和合并“他们的”或“您的”中的更改。

合并编辑器中提供了所有语言功能(包括诊断、断点和测试),因此您可以立即获得有关合并结果中任何问题的反馈。

合并编辑器支持单词级合并——只要更改不相交,双方都可以应用。如果插入顺序很重要,可以交换。在任何时候,冲突也可以手动解决。

小地图上下文菜单

VS Code 小地图在编辑器一侧显示源代码文件的高级轮廓。您已经能够通过“查看:切换小地图”命令切换小地图的可见性,或使用“编辑器 > 小地图:启用”(editor.minimap.enabled) 设置完全禁用小地图。在此版本中,现在有一个上下文菜单,可以轻松显示或隐藏小地图。

您还可以使用大小 (editor.minimap.size)、比例 (editor.minimap.scale) 和滑块 (editor.minimap.showSlider) 设置来调整外观。如果小地图处于隐藏状态,您仍可以通过右键单击侧面装订线来显示上下文菜单。

使用编辑器创作提交消息

在这个里程碑上,现在,只要提交输入框中未提供任何消息,您就可以使用全文编辑器来编写提交消息。要使用此新流程,请单击“提交”按钮,而不提供提交消息。

现在,您可以在编辑器中编写提交消息。要接受提交消息并完成提交操作,请关闭编辑器选项卡或在编辑器工具栏中选择“接受提交消息”按钮。要取消提交操作,您可以清除文本编辑器的内容并关闭编辑器选项卡,或者在编辑器工具栏中选择“放弃提交消息”按钮。

您可以通过切换 git.useEditorAsCommitInput 设置来禁用此新流程,并回退到使用快速输入控件的上一个体验。更改设置后,必须重新启动 VS Code 才能使更改生效。

要对在集成终端中执行的 git commit 命令使用相同的流程,请启用 git.terminalGitEditor 设置。启用该设置后,您将必须重新启动终端会话。

支持 Markdown 中的尖括号链接

Markdown 允许您使用尖括号来编写包含空格或其他特殊字符的链接目标:

[Some link](<path to file with spaces.md>)

在此迭代中,我们改进了对尖括号链接的支持,以便它们在编辑器中正确突出显示和单击。

HTML 最终新行格式化程序设置更改

设置 html.format.endWithNewline 已被删除,取而代之的是 files.insertFinalNewline

files.insertFinalNewline 适用于所有编程语言。如果希望每种语言进行不同的设置,可以使用语言范围:

{
"[html]": {
"files.insertFinalNewline": true
}
}

可扩展的笔记本渲染器

笔记本渲染器允许扩展自定义单元格和输出在笔记本中的呈现方式。在此迭代中,我们扩展了笔记本渲染器 API,以允许渲染器增强另一个渲染器,包括 VS Code 中的一些内置渲染器。这允许扩展向笔记本渲染添加新功能,而无需重新实现完整的渲染器。它还提供了更好的用户体验,因为用户不必在新的渲染器之间切换即可查看正确渲染的内容。

Notebook 扩展 Markdown 呈现器示例演示扩展如何使用表情符号支持扩展 VS Code 的内置 Markdown 呈现器。让我们快速浏览一下关键部分!

可扩展笔记本渲染器的 API 是有意松散定义的。首先,我们的扩展需要贡献一个新的笔记本渲染器。因为我们要扩展现有的渲染器,所以我们在这里使用 entrypoint 字段来指定要扩展的渲染器的 ID(在本例中为 VS Code 的内置 vscode.markdown-it-renderer)以及要加载的渲染器脚本的路径:

"notebookRenderer": [
{
"id": "sample.markdown-it.emoji-extension",
"displayName": "Markdown it Emoji renderer",
"entrypoint": {
"extends": "vscode.markdown-it-renderer",
"path": "./out/emoji.js"
}
}
]

现在,只要激活 vscode.markdown-it-renderer ,此渲染器就会被激活。

现在,为了扩展 vscode.markdown-it-renderer,我们的渲染器可以在基础渲染器上调用一个方法。此方法特定于基本呈现器。在本例中,我们首先使用 getRenderer 获取基础渲染器,然后在其上调用 extendMarkdownIt 以增强它用于渲染的 Markdown-It 实例:

import type * as MarkdownIt from 'markdown-it';
import type { RendererContext } from 'vscode-notebook-renderer';
interface MarkdownItRenderer {
extendMarkdownIt(fn: (md: MarkdownIt) => void): void;
}
export async function activate(ctx: RendererContext<void>) {
// Acquire the base renderer
const markdownItRenderer = await ctx.getRenderer('vscode.markdown-it-renderer') as MarkdownItRenderer | undefined;
if (!markdownItRenderer) {
throw new Error(`Could not load 'vscode.markdown-it-renderer'`);
}
// Load our Markdown-It extension
const emoji = require('markdown-it-emoji');
// Call the base renderer's extension method (extendMarkdownIt) to augment
// the Markdown-It with emoji support.
markdownItRenderer.extendMarkdownIt((md: MarkdownIt) => {
return md.use(emoji, {});
});
}

这里要注意的关键部分是 extendMarkdown 它只是基础渲染器返回的一个方法。其他可扩展渲染器可以轻松返回自己的扩展点。

请查看 Notebook 扩展 Markdown 渲染器示例,获取扩展 VS Code 的内置 Markdown-It 渲染器的完整示例。

粘贴编辑提供程序

我们更新了 documentPaste API 提案,使其更易于正确实现,特别是在使用多个游标时。

提醒一下,此 API 允许扩展挂钩到文本编辑器内的复制和粘贴。扩展可以使用它来修改粘贴时插入的文本。文档粘贴扩展示例显示了运行中的更新的 API:

/**
* Provider that maintains a count of the number of times it has copied text.
*/
class CopyCountPasteEditProvider implements vscode.DocumentPasteEditProvider {
private readonly countMimeTypes = 'application/vnd.code.copydemo-copy-count';
private count = 0;
prepareDocumentPaste?(
_document: vscode.TextDocument,
_ranges: readonly vscode.Range[],
dataTransfer: vscode.DataTransfer,
_token: vscode.CancellationToken
): void | Thenable<void> {
dataTransfer.set(this.countMimeTypes, new vscode.DataTransferItem(this.count++));
dataTransfer.set('text/plain', new vscode.DataTransferItem(this.count++));
}
async provideDocumentPasteEdits(
_document: vscode.TextDocument,
_ranges: readonly vscode.Range[],
dataTransfer: vscode.DataTransfer,
_token: vscode.CancellationToken
): Promise<vscode.DocumentPasteEdit | undefined> {
const countDataTransferItem = dataTransfer.get(this.countMimeTypes);
if (!countDataTransferItem) {
return undefined;
}
const textDataTransferItem = dataTransfer.get('text') ?? dataTransfer.get('text/plain');
if (!textDataTransferItem) {
return undefined;
}
const count = await countDataTransferItem.asString();
const text = await textDataTransferItem.asString();
// Build a snippet to insert
const snippet = new vscode.SnippetString();
snippet.appendText(`(copy #${count}) ${text}`);
return { insertText: snippet };
}
}
export function activate(context: vscode.ExtensionContext) {
// Enable our provider in plaintext files
const selector: vscode.DocumentSelector = { language: 'plaintext' };
// Register our provider
context.subscriptions.push(
vscode.languages.registerDocumentPasteEditProvider(
selector,
new CopyCountPasteEditProvider(),
{
pasteMimeTypes: ['text/plain']
}
)
);
}

Electron 18 更新

在这个里程碑中,我们完成了将 Electron 18 捆绑到 VS Code 桌面的探索。此更新附带 Chromium 100.0.4896.160 和 Node.js 16.13.2