From 0502a9ddb8f299c607d29a7fd4c72f549b626bfa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=9D=BF=20=E5=AE=89?= Date: Wed, 17 Sep 2025 12:57:41 +0800 Subject: [PATCH] =?UTF-8?q?1.0.2=20=E4=BC=98=E5=8C=96=E6=89=93=E5=BC=80?= =?UTF-8?q?=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dist/commands.js | 77 ++++++++++++++++++----------- dist/commands.js.map | 2 +- dist/extension.js | 10 +++- dist/extension.js.map | 2 +- dist/fileSystemProvider.js | 32 ++++++++++++- dist/fileSystemProvider.js.map | 2 +- squirrel-nut-explorer-1.0.0.vsix | Bin 176900 -> 180421 bytes src/commands.ts | 80 ++++++++++++++++++++----------- src/extension.ts | 12 ++++- src/fileSystemProvider.ts | 40 +++++++++++++++- 第三方API.md | 71 +++++++++++++++++++++++++++ 11 files changed, 267 insertions(+), 61 deletions(-) create mode 100644 第三方API.md diff --git a/dist/commands.js b/dist/commands.js index 1bf4435..cff3424 100644 --- a/dist/commands.js +++ b/dist/commands.js @@ -35,6 +35,54 @@ var __importStar = (this && this.__importStar) || (function () { Object.defineProperty(exports, "__esModule", { value: true }); exports.registerCommands = registerCommands; const vscode = __importStar(require("vscode")); +// 查找已打开的文档 +function findExistingDocument(filePath) { + const documents = vscode.workspace.textDocuments; + for (const doc of documents) { + if (doc.uri.scheme === 'squirrel' && doc.uri.path === `/${filePath}`) { + return doc; + } + } + return undefined; +} +// 打开文件的通用函数 +async function openFile(model, provider, entry) { + if (!model.getIsConnected()) { + vscode.window.showErrorMessage('请先连接到 pvfUtility API'); + return; + } + // 检查是否已经有相同的文件打开 + const existingDocument = findExistingDocument(entry.key); + if (existingDocument) { + // 如果文件已打开,则聚焦到该标签页 + await vscode.window.showTextDocument(existingDocument); + return; + } + // 如果文件未打开,则在新标签页中打开 + try { + await vscode.window.withProgress({ + location: vscode.ProgressLocation.Notification, + title: `正在加载文件 ${entry.name}...`, + cancellable: false + }, async (progress) => { + const content = await model.getFileContent(entry.key); + if (content !== undefined) { + // 创建虚拟文档,使用时间戳确保URI唯一以支持多标签页 + const timestamp = Date.now(); + const uri = vscode.Uri.parse(`squirrel:/${entry.key}?instance=${timestamp}`); + const doc = await vscode.workspace.openTextDocument(uri); + await vscode.window.showTextDocument(doc, { preview: false }); + provider.refresh(); + } + else { + vscode.window.showErrorMessage(`加载文件 ${entry.name} 失败`); + } + }); + } + catch (error) { + vscode.window.showErrorMessage(`打开文件失败: ${error}`); + } +} function registerCommands(context, model, provider, functionExtractor, output) { // 连接到 API console.log('注册 squirrel.connectToApi 命令...'); @@ -95,34 +143,9 @@ function registerCommands(context, model, provider, functionExtractor, output) { vscode.window.showErrorMessage(`刷新失败: ${error}`); } }); - // 打开文件 + // 打开文件(单击或双击文件时调用) const openFileCommand = vscode.commands.registerCommand('squirrel.openFile', async (entry) => { - if (!model.getIsConnected()) { - vscode.window.showErrorMessage('请先连接到 pvfUtility API'); - return; - } - try { - await vscode.window.withProgress({ - location: vscode.ProgressLocation.Notification, - title: `正在加载文件 ${entry.name}...`, - cancellable: false - }, async (progress) => { - const content = await model.getFileContent(entry.key); - if (content !== undefined) { - // 创建虚拟文档 - const uri = vscode.Uri.parse(`squirrel:/${entry.key}`); - const doc = await vscode.workspace.openTextDocument(uri); - await vscode.window.showTextDocument(doc); - provider.refresh(); - } - else { - vscode.window.showErrorMessage(`加载文件 ${entry.name} 失败`); - } - }); - } - catch (error) { - vscode.window.showErrorMessage(`打开文件失败: ${error}`); - } + await openFile(model, provider, entry); }); // 保存文件(通过 VS Code 的保存事件处理,这个命令主要用于显示) const saveFileCommand = vscode.commands.registerCommand('squirrel.saveFile', async () => { diff --git a/dist/commands.js.map b/dist/commands.js.map index f024fd5..3e4e339 100644 --- a/dist/commands.js.map +++ b/dist/commands.js.map @@ -1 +1 @@ -{"version":3,"file":"commands.js","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAKA,4CAgGC;AArGD,+CAAiC;AAKjC,SAAgB,gBAAgB,CAAC,OAAgC,EAAE,KAAgB,EAAE,QAAsB,EAAE,iBAAoC,EAAE,MAA6B;IAC5K,UAAU;IACV,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;IAC9C,MAAM,cAAc,GAAG,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,uBAAuB,EAAE,KAAK,IAAI,EAAE;QACvF,IAAI,CAAC;YACD,MAAM,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC;gBAC7B,QAAQ,EAAE,MAAM,CAAC,gBAAgB,CAAC,YAAY;gBAC9C,KAAK,EAAE,yBAAyB;gBAChC,WAAW,EAAE,KAAK;aACrB,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE;gBAClB,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,OAAO,EAAE,CAAC;gBACtC,IAAI,OAAO,EAAE,CAAC;oBACV,MAAM,CAAC,MAAM,CAAC,sBAAsB,CAAC,sBAAsB,CAAC,CAAC;oBAC7D,QAAQ,CAAC,OAAO,EAAE,CAAC;oBAEnB,uBAAuB;oBACvB,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;oBACjC,MAAM,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC;wBAC7B,QAAQ,EAAE,MAAM,CAAC,gBAAgB,CAAC,YAAY;wBAC9C,KAAK,EAAE,aAAa;wBACpB,WAAW,EAAE,KAAK;qBACrB,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE;wBAClB,MAAM,iBAAiB,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;wBACnD,MAAM,CAAC,MAAM,CAAC,sBAAsB,CAAC,UAAU,CAAC,CAAC;oBACrD,CAAC,CAAC,CAAC;gBACP,CAAC;qBAAM,CAAC;oBACJ,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,uBAAuB,CAAC,CAAC;gBAC5D,CAAC;YACL,CAAC,CAAC,CAAC;QACP,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,SAAS,KAAK,EAAE,CAAC,CAAC;QACrD,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,SAAS;IACT,MAAM,cAAc,GAAG,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,uBAAuB,EAAE,KAAK,IAAI,EAAE;QACvF,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,EAAE,CAAC;YAC1B,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,sBAAsB,CAAC,CAAC;YACvD,OAAO;QACX,CAAC;QAED,IAAI,CAAC;YACD,MAAM,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC;gBAC7B,QAAQ,EAAE,MAAM,CAAC,gBAAgB,CAAC,YAAY;gBAC9C,KAAK,EAAE,aAAa;gBACpB,WAAW,EAAE,KAAK;aACrB,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE;gBAClB,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,OAAO,EAAE,CAAC;gBACtC,IAAI,OAAO,EAAE,CAAC;oBACV,MAAM,CAAC,MAAM,CAAC,sBAAsB,CAAC,UAAU,CAAC,CAAC;oBACjD,QAAQ,CAAC,OAAO,EAAE,CAAC;gBACvB,CAAC;qBAAM,CAAC;oBACJ,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC;gBAC/C,CAAC;YACL,CAAC,CAAC,CAAC;QACP,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,SAAS,KAAK,EAAE,CAAC,CAAC;QACrD,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,OAAO;IACP,MAAM,eAAe,GAAG,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,mBAAmB,EAAE,KAAK,EAAE,KAAgB,EAAE,EAAE;QACpG,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,EAAE,CAAC;YAC1B,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,sBAAsB,CAAC,CAAC;YACvD,OAAO;QACX,CAAC;QAED,IAAI,CAAC;YACD,MAAM,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC;gBAC7B,QAAQ,EAAE,MAAM,CAAC,gBAAgB,CAAC,YAAY;gBAC9C,KAAK,EAAE,UAAU,KAAK,CAAC,IAAI,KAAK;gBAChC,WAAW,EAAE,KAAK;aACrB,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE;gBAClB,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAEtD,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;oBACxB,SAAS;oBACT,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,aAAa,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;oBACvD,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;oBACzD,MAAM,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;oBAC1C,QAAQ,CAAC,OAAO,EAAE,CAAC;gBACvB,CAAC;qBAAM,CAAC;oBACJ,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC;gBAC5D,CAAC;YACL,CAAC,CAAC,CAAC;QACP,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,WAAW,KAAK,EAAE,CAAC,CAAC;QACvD,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,sCAAsC;IACtC,MAAM,eAAe,GAAG,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,mBAAmB,EAAE,KAAK,IAAI,EAAE;QACpF,MAAM,CAAC,MAAM,CAAC,sBAAsB,CAAC,+BAA+B,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,cAAc,EAAE,cAAc,EAAE,eAAe,EAAE,eAAe,CAAC,CAAC;AACjG,CAAC"} \ No newline at end of file +{"version":3,"file":"commands.js","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/extension.js b/dist/extension.js index f2abe9a..028e7e0 100644 --- a/dist/extension.js +++ b/dist/extension.js @@ -112,6 +112,8 @@ function activate(context) { vscode.workspace.registerFileSystemProvider('squirrel', fileSystemProvider, { isCaseSensitive: true }); + // 将 fileSystemProvider 添加到 context 以便在 commands 中使用 + global.fileSystemProvider = fileSystemProvider; // 注册所有命令 console.log('正在注册命令...'); (0, commands_1.registerCommands)(context, model, provider, functionExtractor, output); @@ -139,7 +141,13 @@ function activate(context) { } } }); - context.subscriptions.push(configChangeListener, saveListener); + // 注册文件关闭事件以清理缓存 + const closeListener = vscode.workspace.onDidCloseTextDocument((doc) => { + if (doc.uri.scheme === 'squirrel') { + fileSystemProvider.clearFileCache(doc.uri); + } + }); + context.subscriptions.push(configChangeListener, saveListener, closeListener); output.appendLine('[Squirrel] 扩展激活完成'); output.show(); // 显示欢迎信息 diff --git a/dist/extension.js.map b/dist/extension.js.map index aba9432..50aa0b6 100644 --- a/dist/extension.js.map +++ b/dist/extension.js.map @@ -1 +1 @@ -{"version":3,"file":"extension.js","sourceRoot":"","sources":["../src/extension.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"extension.js","sourceRoot":"","sources":["../src/extension.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/fileSystemProvider.js b/dist/fileSystemProvider.js index dbdb6fb..414ed08 100644 --- a/dist/fileSystemProvider.js +++ b/dist/fileSystemProvider.js @@ -39,21 +39,35 @@ class SquirrelFileSystemProvider { constructor(model) { this._onDidChangeFile = new vscode.EventEmitter(); this.onDidChangeFile = this._onDidChangeFile.event; + // 存储文件实例内容,支持多标签页 + this.fileContentCache = new Map(); this.model = model; } // 读取文件 async readFile(uri) { const filePath = this.getPathFromUri(uri); + // 检查是否有缓存的内容(用于多标签页支持) + const cacheKey = uri.toString(); + if (this.fileContentCache.has(cacheKey)) { + const content = this.fileContentCache.get(cacheKey); + return new TextEncoder().encode(content); + } + // 从模型获取内容 const content = await this.model.getFileContent(filePath); if (content === undefined) { throw vscode.FileSystemError.FileNotFound(uri); } + // 缓存内容以支持多标签页 + this.fileContentCache.set(cacheKey, content); return new TextEncoder().encode(content); } // 写入文件 async writeFile(uri, content, options) { const filePath = this.getPathFromUri(uri); const textContent = new TextDecoder().decode(content); + // 更新缓存内容 + const cacheKey = uri.toString(); + this.fileContentCache.set(cacheKey, textContent); const success = await this.model.saveFileContent(filePath, textContent); if (!success) { throw vscode.FileSystemError.Unavailable('保存文件失败'); @@ -61,11 +75,17 @@ class SquirrelFileSystemProvider { } // 其他必须实现的方法(简化实现) stat(uri) { + // 获取文件内容以确定大小 + const cacheKey = uri.toString(); + let content = ''; + if (this.fileContentCache.has(cacheKey)) { + content = this.fileContentCache.get(cacheKey); + } return { type: vscode.FileType.File, ctime: Date.now(), mtime: Date.now(), - size: 0 + size: Buffer.byteLength(content, 'utf8') }; } readDirectory(uri) { @@ -83,13 +103,23 @@ class SquirrelFileSystemProvider { watch(uri, options) { return new vscode.Disposable(() => { }); } + // 清理文件缓存 + clearFileCache(uri) { + const cacheKey = uri.toString(); + this.fileContentCache.delete(cacheKey); + } // 从 URI 解析文件路径 getPathFromUri(uri) { if (uri.scheme !== 'squirrel') { throw vscode.FileSystemError.FileNotFound(uri); } + // 移除查询参数,只返回路径部分 return uri.path.substring(1); // 去掉开头的 '/' } + // 获取文件实例ID + getInstanceId(uri) { + return uri.query ? new URLSearchParams(uri.query).get('instance') || 'default' : 'default'; + } } exports.SquirrelFileSystemProvider = SquirrelFileSystemProvider; //# sourceMappingURL=fileSystemProvider.js.map \ No newline at end of file diff --git a/dist/fileSystemProvider.js.map b/dist/fileSystemProvider.js.map index 98c04a9..87324ad 100644 --- a/dist/fileSystemProvider.js.map +++ b/dist/fileSystemProvider.js.map @@ -1 +1 @@ -{"version":3,"file":"fileSystemProvider.js","sourceRoot":"","sources":["../src/fileSystemProvider.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,+CAAiC;AAGjC,MAAa,0BAA0B;IAKnC,YAAY,KAAgB;QAHpB,qBAAgB,GAAG,IAAI,MAAM,CAAC,YAAY,EAA4B,CAAC;QAC/E,oBAAe,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC;QAG1C,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACvB,CAAC;IAED,OAAO;IACP,KAAK,CAAC,QAAQ,CAAC,GAAe;QAC1B,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;QAC1C,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;QAE1D,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YACxB,MAAM,MAAM,CAAC,eAAe,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QACnD,CAAC;QAED,OAAO,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC7C,CAAC;IAED,OAAO;IACP,KAAK,CAAC,SAAS,CAAC,GAAe,EAAE,OAAmB,EAAE,OAAgD;QAClG,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;QAC1C,MAAM,WAAW,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAEtD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QAExE,IAAI,CAAC,OAAO,EAAE,CAAC;YACX,MAAM,MAAM,CAAC,eAAe,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QACvD,CAAC;IACL,CAAC;IAED,kBAAkB;IAClB,IAAI,CAAC,GAAe;QAChB,OAAO;YACH,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI;YAC1B,KAAK,EAAE,IAAI,CAAC,GAAG,EAAE;YACjB,KAAK,EAAE,IAAI,CAAC,GAAG,EAAE;YACjB,IAAI,EAAE,CAAC;SACV,CAAC;IACN,CAAC;IAED,aAAa,CAAC,GAAe;QACzB,OAAO,EAAE,CAAC;IACd,CAAC;IAED,eAAe,CAAC,GAAe;QAC3B,MAAM,MAAM,CAAC,eAAe,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;IAC1D,CAAC;IAED,MAAM,CAAC,GAAe;QAClB,MAAM,MAAM,CAAC,eAAe,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;IAC1D,CAAC;IAED,MAAM,CAAC,MAAkB,EAAE,MAAkB,EAAE,OAA+B;QAC1E,MAAM,MAAM,CAAC,eAAe,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;IAC3D,CAAC;IAED,KAAK,CAAC,GAAe,EAAE,OAAmD;QACtE,OAAO,IAAI,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAC3C,CAAC;IAED,eAAe;IACP,cAAc,CAAC,GAAe;QAClC,IAAI,GAAG,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;YAC5B,MAAM,MAAM,CAAC,eAAe,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QACnD,CAAC;QACD,OAAO,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY;IAC9C,CAAC;CACJ;AAtED,gEAsEC"} \ No newline at end of file +{"version":3,"file":"fileSystemProvider.js","sourceRoot":"","sources":["../src/fileSystemProvider.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/squirrel-nut-explorer-1.0.0.vsix b/squirrel-nut-explorer-1.0.0.vsix index e2846a1540195257b3b049f5290e06abb7d439c0..e335f953d196a60a0ce3c916b9f0a80c16917fea 100644 GIT binary patch delta 19246 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

-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 V3Ye@wS|Du{R}TMNf~y;8{{#3&e%$~7 delta 15740 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 diff --git a/src/commands.ts b/src/commands.ts index 20a0501..20f7aa7 100644 --- a/src/commands.ts +++ b/src/commands.ts @@ -3,6 +3,57 @@ import { FileModel, FileEntry } from './model'; import { FileProvider } from './provider'; import { FunctionExtractor } from './functionExtractor'; +// 查找已打开的文档 +function findExistingDocument(filePath: string): vscode.TextDocument | undefined { + const documents = vscode.workspace.textDocuments; + for (const doc of documents) { + if (doc.uri.scheme === 'squirrel' && doc.uri.path === `/${filePath}`) { + return doc; + } + } + return undefined; +} + +// 打开文件的通用函数 +async function openFile(model: FileModel, provider: FileProvider, entry: FileEntry): Promise { + if (!model.getIsConnected()) { + vscode.window.showErrorMessage('请先连接到 pvfUtility API'); + return; + } + + // 检查是否已经有相同的文件打开 + const existingDocument = findExistingDocument(entry.key); + if (existingDocument) { + // 如果文件已打开,则聚焦到该标签页 + await vscode.window.showTextDocument(existingDocument); + return; + } + + // 如果文件未打开,则在新标签页中打开 + try { + await vscode.window.withProgress({ + location: vscode.ProgressLocation.Notification, + title: `正在加载文件 ${entry.name}...`, + cancellable: false + }, async (progress) => { + const content = await model.getFileContent(entry.key); + + if (content !== undefined) { + // 创建虚拟文档,使用时间戳确保URI唯一以支持多标签页 + const timestamp = Date.now(); + const uri = vscode.Uri.parse(`squirrel:/${entry.key}?instance=${timestamp}`); + const doc = await vscode.workspace.openTextDocument(uri); + await vscode.window.showTextDocument(doc, { preview: false }); + provider.refresh(); + } else { + vscode.window.showErrorMessage(`加载文件 ${entry.name} 失败`); + } + }); + } catch (error) { + vscode.window.showErrorMessage(`打开文件失败: ${error}`); + } +} + export function registerCommands(context: vscode.ExtensionContext, model: FileModel, provider: FileProvider, functionExtractor: FunctionExtractor, output?: vscode.OutputChannel) { // 连接到 API console.log('注册 squirrel.connectToApi 命令...'); @@ -63,34 +114,9 @@ export function registerCommands(context: vscode.ExtensionContext, model: FileMo } }); - // 打开文件 + // 打开文件(单击或双击文件时调用) const openFileCommand = vscode.commands.registerCommand('squirrel.openFile', async (entry: FileEntry) => { - if (!model.getIsConnected()) { - vscode.window.showErrorMessage('请先连接到 pvfUtility API'); - return; - } - - try { - await vscode.window.withProgress({ - location: vscode.ProgressLocation.Notification, - title: `正在加载文件 ${entry.name}...`, - cancellable: false - }, async (progress) => { - const content = await model.getFileContent(entry.key); - - if (content !== undefined) { - // 创建虚拟文档 - const uri = vscode.Uri.parse(`squirrel:/${entry.key}`); - const doc = await vscode.workspace.openTextDocument(uri); - await vscode.window.showTextDocument(doc); - provider.refresh(); - } else { - vscode.window.showErrorMessage(`加载文件 ${entry.name} 失败`); - } - }); - } catch (error) { - vscode.window.showErrorMessage(`打开文件失败: ${error}`); - } + await openFile(model, provider, entry); }); // 保存文件(通过 VS Code 的保存事件处理,这个命令主要用于显示) diff --git a/src/extension.ts b/src/extension.ts index 92af655..7b2f6dc 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -116,6 +116,9 @@ export function activate(context: vscode.ExtensionContext) { isCaseSensitive: true }); + // 将 fileSystemProvider 添加到 context 以便在 commands 中使用 + (global as any).fileSystemProvider = fileSystemProvider; + // 注册所有命令 console.log('正在注册命令...'); registerCommands(context, model, provider, functionExtractor, output); @@ -147,7 +150,14 @@ export function activate(context: vscode.ExtensionContext) { } }); - context.subscriptions.push(configChangeListener, saveListener); + // 注册文件关闭事件以清理缓存 + const closeListener = vscode.workspace.onDidCloseTextDocument((doc) => { + if (doc.uri.scheme === 'squirrel') { + fileSystemProvider.clearFileCache(doc.uri); + } + }); + + context.subscriptions.push(configChangeListener, saveListener, closeListener); output.appendLine('[Squirrel] 扩展激活完成'); output.show(); diff --git a/src/fileSystemProvider.ts b/src/fileSystemProvider.ts index eb8d7bc..87d883f 100644 --- a/src/fileSystemProvider.ts +++ b/src/fileSystemProvider.ts @@ -5,6 +5,8 @@ export class SquirrelFileSystemProvider implements vscode.FileSystemProvider { private model: FileModel; private _onDidChangeFile = new vscode.EventEmitter(); onDidChangeFile = this._onDidChangeFile.event; + // 存储文件实例内容,支持多标签页 + private fileContentCache = new Map(); constructor(model: FileModel) { this.model = model; @@ -13,12 +15,24 @@ export class SquirrelFileSystemProvider implements vscode.FileSystemProvider { // 读取文件 async readFile(uri: vscode.Uri): Promise { const filePath = this.getPathFromUri(uri); + + // 检查是否有缓存的内容(用于多标签页支持) + const cacheKey = uri.toString(); + if (this.fileContentCache.has(cacheKey)) { + const content = this.fileContentCache.get(cacheKey)!; + return new TextEncoder().encode(content); + } + + // 从模型获取内容 const content = await this.model.getFileContent(filePath); if (content === undefined) { throw vscode.FileSystemError.FileNotFound(uri); } + // 缓存内容以支持多标签页 + this.fileContentCache.set(cacheKey, content); + return new TextEncoder().encode(content); } @@ -27,6 +41,10 @@ export class SquirrelFileSystemProvider implements vscode.FileSystemProvider { const filePath = this.getPathFromUri(uri); const textContent = new TextDecoder().decode(content); + // 更新缓存内容 + const cacheKey = uri.toString(); + this.fileContentCache.set(cacheKey, textContent); + const success = await this.model.saveFileContent(filePath, textContent); if (!success) { @@ -36,11 +54,19 @@ export class SquirrelFileSystemProvider implements vscode.FileSystemProvider { // 其他必须实现的方法(简化实现) stat(uri: vscode.Uri): vscode.FileStat { + // 获取文件内容以确定大小 + const cacheKey = uri.toString(); + let content = ''; + + if (this.fileContentCache.has(cacheKey)) { + content = this.fileContentCache.get(cacheKey)!; + } + return { type: vscode.FileType.File, ctime: Date.now(), mtime: Date.now(), - size: 0 + size: Buffer.byteLength(content, 'utf8') }; } @@ -64,11 +90,23 @@ export class SquirrelFileSystemProvider implements vscode.FileSystemProvider { return new vscode.Disposable(() => {}); } + // 清理文件缓存 + clearFileCache(uri: vscode.Uri): void { + const cacheKey = uri.toString(); + this.fileContentCache.delete(cacheKey); + } + // 从 URI 解析文件路径 private getPathFromUri(uri: vscode.Uri): string { if (uri.scheme !== 'squirrel') { throw vscode.FileSystemError.FileNotFound(uri); } + // 移除查询参数,只返回路径部分 return uri.path.substring(1); // 去掉开头的 '/' } + + // 获取文件实例ID + private getInstanceId(uri: vscode.Uri): string { + return uri.query ? new URLSearchParams(uri.query).get('instance') || 'default' : 'default'; + } } \ No newline at end of file diff --git a/第三方API.md b/第三方API.md new file mode 100644 index 0000000..00e0da3 --- /dev/null +++ b/第三方API.md @@ -0,0 +1,71 @@ +pvfUtility WebApi +介绍 +pvfUtility 2020开始 一项重大的更新就是提供了HTTP接口进行自动化操作 + +这使得第三方工具可以利用http rest api进行文件读写 + +只需在软件内打开pvf,就能通过第三方工具进行下一步的操作 + + +获取pvfUtility版本号 +插件作者可以以版本来来确定用户当前使用的pvfUtility是否适用某些API接口 +请求类型:GET +http://localhost:/Api/PvfUtiltiy/getVersion +返回结果 +//注:使用此接口pvfUtility版本号需大于2022.9.30.2 +{"Data":"2022.9.30.3","IsError":false,"Msg":null} + + +获取nut文件列表 +请求类型:GET +http://localhost:/Api/PvfUtiltiy/GetFileList?dirName=sqr&returnType=0&fileType=nut +解释:dirName=equipment(目录名称) +fileType=.equ(文件后缀名) 注:使用fileType pvfUtility版本号必须大于:2022.08.08.2 + +返回结果示例(returnType=1) +{ + "Data": [ + "sqr/arad_cashshop.nut", + "sqr/hair_avagacha.nut", + "sqr/neck_avagacha.nut", + "sqr/belt_avagacha.nut" + ], + "IsError": false, + "Msg": null +} + + +批量获取nut文件内容 +请求类型:POST +http://localhost:/Api/PvfUtiltiy/GetFileContents +请求参数 +{"FileList":["sqr/arad_cashshop.nut","sqr/neck_avagacha.nut"],"UseCompatibleDecompiler":false,"EncodingType":Null} + +解释 +UseCompatibleDecompiler=是否使用兼容性反编译器 +注:使用encodingType参数 pvfUtility版本号需大于2022.12.3.1, +//encodingType:仅适用于文本文件,默认使用UTF8 +//TW=中国台湾 +//CN=中国大陆 +//KR=韩国 +//JP=日本 +//UTF8 +//Unicode + + +返回结果示例(注:文件内容为utf-8编码) +{ +{"Data":{"FileContentData":{"sqr/arad_cashshop.nut":"\r\nlocal a = 0;\r\n","sqr/neck_avagacha.nut":"\r\nlocal b = 1;\r\n"}},"IsError":false,"Msg":null} + + +上传新的文件内容 +新增或覆盖文件内容 + +请求类型:POST +http://localhost:/Api/PvfUtiltiy/ImportFile?filePath=[文件路径] +请求参数(文本内容): +文件内容 + +返回结果 +{"IsError":false,"Msg":null} +