import * as vscode from "vscode"; import * as path from "path"; /** * 将相对路径解析为工作区绝对路径 */ export function resolveWorkspaceFilePath(filePath: string): string { if (path.isAbsolute(filePath)) { return filePath; } const workspaceFolders = vscode.workspace.workspaceFolders; if (!workspaceFolders || workspaceFolders.length === 0) { throw new Error("请先打开一个文件夹作为工作区,这样我就能为您修改文件了"); } return path.join(workspaceFolders[0].uri.fsPath, filePath); } /** * 使用 VS Code 原生 diff 视图展示文件修改前后对比 */ export async function showFileDiff( filePath: string, oldContent: string, title?: string ): Promise { const absolutePath = resolveWorkspaceFilePath(filePath); const fileUri = vscode.Uri.file(absolutePath); const newBytes = await vscode.workspace.fs.readFile(fileUri); const newContent = Buffer.from(newBytes).toString("utf-8"); if (oldContent === newContent) { return; } const language = (await vscode.workspace.openTextDocument(fileUri)).languageId; const oldDoc = await vscode.workspace.openTextDocument({ content: oldContent, language, }); const diffTitle = title || `${path.basename(absolutePath)} (修改前 <-> 修改后)`; await vscode.commands.executeCommand( "vscode.diff", oldDoc.uri, fileUri, diffTitle, { preview: false } ); }