源代码控制 API
源代码控制 API 允许扩展作者定义源代码控制管理 (SCM) 功能。它提供了一个简洁而强大的 API 界面,允许将许多不同的 SCM 系统集成到 Visual Studio Code 中,同时所有这些系统都具有通用的用户界面。
VS Code 本身附带一个源代码控制提供程序,即 Git 扩展,它是此 API 的最佳参考,如果你想贡献你自己的 SCM 提供程序,这是一个很好的起点。Marketplace 中还有其他很好的示例,例如SVN 扩展。
本文档将帮助你构建一个扩展,使任何 SCM 系统都能与 VS Code 一起使用。
注意:你始终可以参考我们文档中的
vscode
命名空间 API 参考。
源代码控制模型
SourceControl
是负责使用资源状态(SourceControlResourceState
的实例)填充源代码控制模型的实体。资源状态本身组织在组中,即 SourceControlResourceGroup
的实例。
你可以使用 vscode.scm.createSourceControl
创建一个新的 SourceControl。
为了更好地理解这三个实体是如何相互关联的,让我们以Git 为例。考虑以下 git status
的输出
vsce main* → git status
On branch main
Your branch is up-to-date with 'origin/main'.
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: README.md
renamed: src/api.ts -> src/test/api.ts
Changes not staged for commit:
(use "git add/rm <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
deleted: .travis.yml
modified: README.md
此工作区中有很多事情正在发生。首先,README.md
文件已被修改、暂存,然后再次修改。其次,src/api.ts
文件已移动到 src/test/api.ts
,并且该移动已暂存。最后,.travis.yml
文件已被删除。
对于此工作区,Git 定义了两个资源组:工作树和索引。该组内的每个文件更改都是一个资源状态
- 索引 - 资源组
README.md
,已修改 - 资源状态src/test/api.ts
,从src/api.ts
重命名 - 资源状态
- 工作树 - 资源组
.travis.yml
,已删除 - 资源状态README.md
,已修改 - 资源状态
请注意,同一个文件 README.md
是两个不同的资源状态的一部分。
这是 Git 如何创建此模型的
function createResourceUri(relativePath: string): vscode.Uri {
const absolutePath = path.join(vscode.workspace.rootPath, relativePath);
return vscode.Uri.file(absolutePath);
}
const gitSCM = vscode.scm.createSourceControl('git', 'Git');
const index = gitSCM.createResourceGroup('index', 'Index');
index.resourceStates = [
{ resourceUri: createResourceUri('README.md') },
{ resourceUri: createResourceUri('src/test/api.ts') }
];
const workingTree = gitSCM.createResourceGroup('workingTree', 'Changes');
workingTree.resourceStates = [
{ resourceUri: createResourceUri('.travis.yml') },
{ resourceUri: createResourceUri('README.md') }
];
对源代码控制和资源组所做的更改将传播到源代码控制视图。
源代码控制视图
随着源代码控制模型的更改,VS Code 能够填充源代码控制视图。可以使用 SourceControlResourceDecorations
自定义资源状态
export interface SourceControlResourceState {
readonly decorations?: SourceControlResourceDecorations;
}
前面的示例足以在源代码控制视图中填充一个简单列表,但是用户可能希望对每个资源执行许多用户交互。例如,当用户单击资源状态时会发生什么?资源状态可以选择提供一个命令来处理此操作
export interface SourceControlResourceState {
readonly command?: Command;
}
菜单
有六个源代码控制菜单 ID,你可以在其中放置菜单项,以便为用户提供更丰富的用户界面。
scm/title
菜单位于 SCM 视图标题的右侧。navigation
组中的菜单项将内联显示,而所有其他菜单项将在 …
下拉菜单中显示。
这三个是类似的
scm/resourceGroup/context
将命令添加到SourceControlResourceGroup
项。scm/resourceState/context
将命令添加到SourceControlResourceState
项。- 当
SourceControlResourceState
的 resourceUri 路径包含文件夹并且用户选择了树状视图而不是列表视图模式时,scm/resourceFolder/context
会将命令添加到出现的中间文件夹。
将菜单项放置在 inline
组中使其内联显示。所有其他菜单项组将显示在通常使用鼠标右键单击访问的上下文菜单中。
请注意,SCM 视图支持多选,因此命令会接收一个或多个资源的数组作为其参数。
例如,Git 通过将 git.stage
命令添加到 scm/resourceState/context
菜单并使用此类方法声明来支持暂存多个文件
stage(...resourceStates: SourceControlResourceState[]): Promise<void>;
在创建它们时,SourceControl
和 SourceControlResourceGroup
实例需要你提供一个 id
字符串。这些值将分别填充到 scmProvider
和 scmResourceGroup
上下文键中。你可以在菜单项的 when
子句中依赖这些上下文键。以下是 Git 如何为其 git.stage
命令显示内联菜单项的方法
{
"command": "git.stage",
"when": "scmProvider == git && scmResourceGroup == merge",
"group": "inline"
}
scm/sourceControl
菜单是源代码控制存储库视图中每个 SourceControl
实例的上下文菜单
scm/change/title
允许你为快速差异内联差异编辑器的标题栏贡献命令,在后面进行了描述。该命令将作为参数传递文档的 URI、其中的更改数组以及内联更改差异编辑器当前关注的更改的索引。例如,以下是 stageChange
Git 命令的声明,该命令使用测试 originalResourceScheme
上下文键是否等于 git
的 when
子句贡献给此菜单
async stageChange(uri: Uri, changes: LineChange[], index: number): Promise<void>;
SCM 输入框
源代码控制输入框(位于每个源代码控制视图的顶部)允许用户输入消息。你可以获取(和设置)此消息以执行操作。例如,在 Git 中,这用作提交框,用户在其中键入提交消息,并且 git commit
命令会拾取它们。
export interface SourceControlInputBox {
value: string;
}
export interface SourceControl {
readonly inputBox: SourceControlInputBox;
}
用户可以键入 Ctrl+Enter(或 macOS 上的 Cmd+Enter)来接受任何消息。你可以通过为你的 SourceControl
实例提供 acceptInputCommand
来处理此事件。
export interface SourceControl {
readonly acceptInputCommand?: Command;
}
快速差异
VS Code 还支持显示快速差异编辑器装订线装饰。单击这些装饰将显示内联差异体验,你可以向其中贡献上下文命令
这些装饰由 VS Code 本身计算。你需要做的就是向 VS Code 提供任何给定文件的原始内容。
export interface SourceControl {
quickDiffProvider?: QuickDiffProvider;
}
使用 QuickDiffProvider
的 provideOriginalResource
方法,你的实现能够告诉 VS Code 与资源匹配的原始资源的 Uri
,其 Uri
作为参数提供给该方法。
将此 API 与workspace
命名空间中的 registerTextDocumentContentProvider
方法结合使用,该方法允许你为任意资源提供内容,给定一个与它注册的自定义 scheme
匹配的 Uri
。
后续步骤
要了解有关 VS Code 可扩展性模型的更多信息,请尝试以下主题
- SCM API 参考 - 阅读完整的 SCM API 文档
- Git 扩展 - 通过阅读 Git 扩展实现来学习
- 扩展 API 概述 - 了解完整的 VS Code 可扩展性模型。
- 扩展清单文件 - VS Code package.json 扩展清单文件参考
- 贡献点 - VS Code 贡献点参考