
VS Code 原生不支持通过 vscode:// URL 直接传入文本内容创建未保存文件;实现该功能需开发自定义扩展,注册 TextDocumentContentProvider 处理虚拟 URI,并配合 vscode:// 自定义协议调用。
vs code 原生不支持通过 `vscode://` url 直接传入文本内容创建未保存文件;实现该功能需开发自定义扩展,注册 `textdocumentcontentprovider` 处理虚拟 uri,并配合 `vscode://` 自定义协议调用。
在 VS Code 中,vscode:// 协议(如 vscode://file:///path/to/file.ts)仅支持打开本地文件或工作区资源,无法直接通过 URL 携带原始文本内容生成新文档。你尝试的 data: 或 blob: URL 方案之所以失败,是因为 VS Code 不解析这些协议——它只识别自身定义的 URI scheme,且对非文件路径类 URI 默认启动空窗口。
✅ 正确路径是:开发一个轻量扩展,提供虚拟文档支持。核心步骤如下:
-
注册自定义 URI scheme(如
vscode-mycontent://) -
实现
TextDocumentContentProvider,响应provideTextDocumentContent(uri)并返回动态内容 - 在扩展激活时注册 provider,并监听对应 scheme 的 URI 请求
示例关键代码(extension.ts):
import * as vscode from 'vscode';
export function activate(context: vscode.ExtensionContext) {
// 注册 content provider,处理 'mycontent' scheme
const provider = new class implements vscode.TextDocumentContentProvider {
provideTextDocumentContent(
uri: vscode.Uri,
token: vscode.CancellationToken
): vscode.ProviderResult<string> {
// 从 URI 查询参数提取内容(如 vscode-mycontent://?content=Hello%20World)
const content = decodeURIComponent(uri.query.split('content=')[1] || '');
return content || '// Empty document';
}
};
context.subscriptions.push(
vscode.workspace.registerTextDocumentContentProvider('mycontent', provider)
);
// 可选:添加命令快速测试
context.subscriptions.push(
vscode.commands.registerCommand('myext.openUntitled', () => {
const content = 'const answer = 42;\nconsole.log(answer);';
vscode.workspace.openTextDocument({
content,
language: 'javascript'
}).then(doc => vscode.window.showTextDocument(doc));
})
);
}然后,前端可安全使用该协议触发(需用户已安装扩展):
<a href="vscode-mycontent://?content=Hello%20VS%20Code%21">Open in VS Code</a>
⚠️ 注意事项:
- 用户必须预先安装并启用该扩展,否则链接无效;
-
vscode://后接自定义 scheme(如vscode-mycontent://)需在扩展package.json中声明contributes.url; - 浏览器中点击此类链接会调用 VS Code 并传递 URI,但内容安全性依赖扩展校验(避免 XSS,建议对
uri.query做白名单过滤); - 若场景可控(如内部工具集成),更推荐直接调用
vscode.workspace.openTextDocument({ content })API(仅限扩展内执行),无需 URL 跳转。
总结:虽然原生 URL 不支持“带内容新建文件”,但借助 TextDocumentContentProvider,你能构建出类似 vscode-mycontent://?content=... 的完整解决方案——它本质是将 URL 视为轻量指令,由扩展实时生成虚拟文档,兼顾灵活性与用户体验。


















