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":"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"} \ 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 e2846a1..e335f95 100644 Binary files a/squirrel-nut-explorer-1.0.0.vsix and b/squirrel-nut-explorer-1.0.0.vsix differ 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} +