虚拟文件
文本文档内容提供程序 API 允许您在 Visual Studio Code 中从任意来源创建只读文档。您可以在此找到一个带有源代码的示例扩展:https://github.com/microsoft/vscode-extension-samples/blob/main/virtual-document-sample/README.md。
文本文档内容提供者
API 通过为你的提供者声明一个 uri-scheme 来工作,然后提供者返回文本内容。在注册提供者时必须提供该 scheme,之后无法更改。相同的提供者可以用于多个 scheme,多个提供者也可以注册到单个 scheme。
vscode.工作区.注册文本文档内容提供者(myScheme, myProvider);
呼叫注册文本文档内容提供者返回一个可以撤销注册的一次性对象。提供者必须只实现提供文本文档内容- 函数,通过uri和取消令牌调用。
const myProvider = new (class implements vscode.TextDocumentContentProvider {
provideTextDocumentContent(uri: vscode.Uri): string {
// invoke cowsay, use uri-path as text
return cowsay.say({ text: uri.path });
}
})();
请注意,提供者不会为虚拟文档创建URI - 它的作用是提供给定URI的内容。作为回报,内容提供者被集成到打开文档的逻辑中,以便始终考虑提供者。
这个示例使用了 'cowsay' 命令来生成一个uri,然后编辑器应该显示这个uri:
vscode.commands.registerCommand('cowsay.say', async () => {
let what = await vscode.window.showInputBox({ placeHolder: 'cow say?' });
if (what) {
let uri = vscode.Uri.parse('cowsay:' + what);
let doc = await vscode.工作区.打开文本文档(uri); // 调用提供者
await vscode.Windows.显示文本文档(文档, { 预览: false });
}
});
命令提示符输入,创建一个uri奶牛说-scheme, 打开一个uri的文档,并最终打开一个编辑器来编辑该文档。在步骤3,打开文档时,提供者需要为该uri提供内容。
这样我们就得到了一个完全功能的文本文档内容提供者。接下来的章节将描述如何更新虚拟文档以及如何为虚拟文档注册UI命令。
更新虚拟文件
根据情况,虚拟文件可能会更改。为了支持这一点,提供者可以实现一个onDidChange-事件。
该vscode.事件-type 定义了 VS Code 中事件的合同。实现事件的最简单方法是vscode.事件发射器,像这样:
const myProvider = new (class implements vscode.TextDocumentContentProvider {
// emitter 和其事件
onDidChangeEmitter = new vscode.EventEmitter<vscode.Uri>();
onDidChange = this.onDidChangeEmitter.event;
//...
})();
事件发射器有一个火当文档发生变化时,可以使用此方法通知 VS Code。发生变化的文档通过其作为参数传递给的 uri 来识别。火方法。然后,提供者将再次被调用以提供更新的内容,前提是文档仍然打开。
这便是让 VS Code 监听虚拟文档更改所需的一切。要查看一个利用此功能的更复杂的示例,请参阅:https://github.com/microsoft/vscode-extension-samples/blob/main/contentprovider-sample/README.md。
添加编辑命令
编辑操作可以添加,仅与关联内容提供商提供的文档进行交互。这是一个将牛刚刚说的话倒过来的示例命令:
// register a command that updates the current cowsay
subscriptions.push(
vscode.commands.registerCommand('cowsay.backwards', async () => {
if (!vscode.window.activeTextEditor) {
return; // no editor
}
let { document } = vscode.window.activeTextEditor;
if (document.uri.scheme !== myScheme) {
return; // not my scheme
}
// get path-components, reverse it, and create a new uri
let say = document.uri.path;
let newSay = say
.split('')
.reverse()
.join('');
let newUri = document.uri.with({ path: newSay });
await vscode.window.showTextDocument(newUri, { preview: false });
})
);
上面的片段检查我们是否有活动的编辑器,并且其文档是我们其中一个方案。这些检查是必要的,因为命令对每个人都是可用的(并且可执行)。然后反转uri的路径组件,并从中创建一个新的uri,最后打开编辑器。
最糟糕的是用编辑命令在 declarative 部分package.json是需要的。在贡献-section add this config:
"menus": {
"editor/title": [
{
"command": "cowsay.backwards",
"group": "navigation",
"when": "resourceScheme == cowsay"
}
]
}
这指的是cowsay.反向-命令在该处定义贡献/指挥-section 并表示它应该出现在编辑器标题菜单(右上角的工具栏)。现在,仅仅这一点就意味着该命令对每个编辑器始终显示。这就是当-clause 用于 - 它描述了显示该动作所需的条件。在这个示例中,它指出文档在编辑器中的方案必须是奶牛说-scheme. 配置然后再次重复用于命令面板- 菜单 - 它默认显示所有命令。

活动与可见性
文档提供者在 VS Code 中是一等公民,它们的内容会出现在常规文本文档中,它们使用与文件等相同的基础设施。然而,这也意味着“您的”文档无法隐藏,它们将会出现在onDidOpenTextDocument和onDidCloseTextDocument-活动,它们是的一部分vscode.workspace.textDocuments以及更多。每个人的规则是检查计划查看文档,然后决定是否要对文档进行某些操作。
文件系统 API
如果你需要更多的灵活性和功能,请查看文件系统提供程序API。它允许实现一个完整的文件系统,包括文件、文件夹、二进制数据、文件删除、创建等操作。
你可以在以下位置找到一个带有源代码的示例扩展:https://github.com/microsoft/vscode-extension-samples/tree/main/fsprovider-sample/README.md。
当 VS Code 在一个这样的文件系统的文件夹或工作区中打开时,我们称之为虚拟工作区。当一个虚拟工作区在 VS Code Windows中打开时,这会在左下角的远程指示器中显示一个标签,类似于远程Windows。请参阅虚拟工作区指南了解扩展如何支持此设置。