52 lines
1.4 KiB
TypeScript
52 lines
1.4 KiB
TypeScript
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<void> {
|
|
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 }
|
|
);
|
|
}
|