1.0.2 优化打开逻辑
This commit is contained in:
77
dist/commands.js
vendored
77
dist/commands.js
vendored
@@ -35,6 +35,54 @@ var __importStar = (this && this.__importStar) || (function () {
|
|||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
exports.registerCommands = registerCommands;
|
exports.registerCommands = registerCommands;
|
||||||
const vscode = __importStar(require("vscode"));
|
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) {
|
function registerCommands(context, model, provider, functionExtractor, output) {
|
||||||
// 连接到 API
|
// 连接到 API
|
||||||
console.log('注册 squirrel.connectToApi 命令...');
|
console.log('注册 squirrel.connectToApi 命令...');
|
||||||
@@ -95,34 +143,9 @@ function registerCommands(context, model, provider, functionExtractor, output) {
|
|||||||
vscode.window.showErrorMessage(`刷新失败: ${error}`);
|
vscode.window.showErrorMessage(`刷新失败: ${error}`);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
// 打开文件
|
// 打开文件(单击或双击文件时调用)
|
||||||
const openFileCommand = vscode.commands.registerCommand('squirrel.openFile', async (entry) => {
|
const openFileCommand = vscode.commands.registerCommand('squirrel.openFile', async (entry) => {
|
||||||
if (!model.getIsConnected()) {
|
await openFile(model, provider, entry);
|
||||||
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}`);
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
// 保存文件(通过 VS Code 的保存事件处理,这个命令主要用于显示)
|
// 保存文件(通过 VS Code 的保存事件处理,这个命令主要用于显示)
|
||||||
const saveFileCommand = vscode.commands.registerCommand('squirrel.saveFile', async () => {
|
const saveFileCommand = vscode.commands.registerCommand('squirrel.saveFile', async () => {
|
||||||
|
|||||||
2
dist/commands.js.map
vendored
2
dist/commands.js.map
vendored
@@ -1 +1 @@
|
|||||||
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"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"}
|
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"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"}
|
||||||
10
dist/extension.js
vendored
10
dist/extension.js
vendored
@@ -112,6 +112,8 @@ function activate(context) {
|
|||||||
vscode.workspace.registerFileSystemProvider('squirrel', fileSystemProvider, {
|
vscode.workspace.registerFileSystemProvider('squirrel', fileSystemProvider, {
|
||||||
isCaseSensitive: true
|
isCaseSensitive: true
|
||||||
});
|
});
|
||||||
|
// 将 fileSystemProvider 添加到 context 以便在 commands 中使用
|
||||||
|
global.fileSystemProvider = fileSystemProvider;
|
||||||
// 注册所有命令
|
// 注册所有命令
|
||||||
console.log('正在注册命令...');
|
console.log('正在注册命令...');
|
||||||
(0, commands_1.registerCommands)(context, model, provider, functionExtractor, output);
|
(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.appendLine('[Squirrel] 扩展激活完成');
|
||||||
output.show();
|
output.show();
|
||||||
// 显示欢迎信息
|
// 显示欢迎信息
|
||||||
|
|||||||
2
dist/extension.js.map
vendored
2
dist/extension.js.map
vendored
@@ -1 +1 @@
|
|||||||
{"version":3,"file":"extension.js","sourceRoot":"","sources":["../src/extension.ts"],"names":[],"mappings":"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"}
|
{"version":3,"file":"extension.js","sourceRoot":"","sources":["../src/extension.ts"],"names":[],"mappings":"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"}
|
||||||
32
dist/fileSystemProvider.js
vendored
32
dist/fileSystemProvider.js
vendored
@@ -39,21 +39,35 @@ class SquirrelFileSystemProvider {
|
|||||||
constructor(model) {
|
constructor(model) {
|
||||||
this._onDidChangeFile = new vscode.EventEmitter();
|
this._onDidChangeFile = new vscode.EventEmitter();
|
||||||
this.onDidChangeFile = this._onDidChangeFile.event;
|
this.onDidChangeFile = this._onDidChangeFile.event;
|
||||||
|
// 存储文件实例内容,支持多标签页
|
||||||
|
this.fileContentCache = new Map();
|
||||||
this.model = model;
|
this.model = model;
|
||||||
}
|
}
|
||||||
// 读取文件
|
// 读取文件
|
||||||
async readFile(uri) {
|
async readFile(uri) {
|
||||||
const filePath = this.getPathFromUri(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);
|
const content = await this.model.getFileContent(filePath);
|
||||||
if (content === undefined) {
|
if (content === undefined) {
|
||||||
throw vscode.FileSystemError.FileNotFound(uri);
|
throw vscode.FileSystemError.FileNotFound(uri);
|
||||||
}
|
}
|
||||||
|
// 缓存内容以支持多标签页
|
||||||
|
this.fileContentCache.set(cacheKey, content);
|
||||||
return new TextEncoder().encode(content);
|
return new TextEncoder().encode(content);
|
||||||
}
|
}
|
||||||
// 写入文件
|
// 写入文件
|
||||||
async writeFile(uri, content, options) {
|
async writeFile(uri, content, options) {
|
||||||
const filePath = this.getPathFromUri(uri);
|
const filePath = this.getPathFromUri(uri);
|
||||||
const textContent = new TextDecoder().decode(content);
|
const textContent = new TextDecoder().decode(content);
|
||||||
|
// 更新缓存内容
|
||||||
|
const cacheKey = uri.toString();
|
||||||
|
this.fileContentCache.set(cacheKey, textContent);
|
||||||
const success = await this.model.saveFileContent(filePath, textContent);
|
const success = await this.model.saveFileContent(filePath, textContent);
|
||||||
if (!success) {
|
if (!success) {
|
||||||
throw vscode.FileSystemError.Unavailable('保存文件失败');
|
throw vscode.FileSystemError.Unavailable('保存文件失败');
|
||||||
@@ -61,11 +75,17 @@ class SquirrelFileSystemProvider {
|
|||||||
}
|
}
|
||||||
// 其他必须实现的方法(简化实现)
|
// 其他必须实现的方法(简化实现)
|
||||||
stat(uri) {
|
stat(uri) {
|
||||||
|
// 获取文件内容以确定大小
|
||||||
|
const cacheKey = uri.toString();
|
||||||
|
let content = '';
|
||||||
|
if (this.fileContentCache.has(cacheKey)) {
|
||||||
|
content = this.fileContentCache.get(cacheKey);
|
||||||
|
}
|
||||||
return {
|
return {
|
||||||
type: vscode.FileType.File,
|
type: vscode.FileType.File,
|
||||||
ctime: Date.now(),
|
ctime: Date.now(),
|
||||||
mtime: Date.now(),
|
mtime: Date.now(),
|
||||||
size: 0
|
size: Buffer.byteLength(content, 'utf8')
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
readDirectory(uri) {
|
readDirectory(uri) {
|
||||||
@@ -83,13 +103,23 @@ class SquirrelFileSystemProvider {
|
|||||||
watch(uri, options) {
|
watch(uri, options) {
|
||||||
return new vscode.Disposable(() => { });
|
return new vscode.Disposable(() => { });
|
||||||
}
|
}
|
||||||
|
// 清理文件缓存
|
||||||
|
clearFileCache(uri) {
|
||||||
|
const cacheKey = uri.toString();
|
||||||
|
this.fileContentCache.delete(cacheKey);
|
||||||
|
}
|
||||||
// 从 URI 解析文件路径
|
// 从 URI 解析文件路径
|
||||||
getPathFromUri(uri) {
|
getPathFromUri(uri) {
|
||||||
if (uri.scheme !== 'squirrel') {
|
if (uri.scheme !== 'squirrel') {
|
||||||
throw vscode.FileSystemError.FileNotFound(uri);
|
throw vscode.FileSystemError.FileNotFound(uri);
|
||||||
}
|
}
|
||||||
|
// 移除查询参数,只返回路径部分
|
||||||
return uri.path.substring(1); // 去掉开头的 '/'
|
return uri.path.substring(1); // 去掉开头的 '/'
|
||||||
}
|
}
|
||||||
|
// 获取文件实例ID
|
||||||
|
getInstanceId(uri) {
|
||||||
|
return uri.query ? new URLSearchParams(uri.query).get('instance') || 'default' : 'default';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
exports.SquirrelFileSystemProvider = SquirrelFileSystemProvider;
|
exports.SquirrelFileSystemProvider = SquirrelFileSystemProvider;
|
||||||
//# sourceMappingURL=fileSystemProvider.js.map
|
//# sourceMappingURL=fileSystemProvider.js.map
|
||||||
2
dist/fileSystemProvider.js.map
vendored
2
dist/fileSystemProvider.js.map
vendored
@@ -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"}
|
{"version":3,"file":"fileSystemProvider.js","sourceRoot":"","sources":["../src/fileSystemProvider.ts"],"names":[],"mappings":"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"}
|
||||||
Binary file not shown.
@@ -3,6 +3,57 @@ import { FileModel, FileEntry } from './model';
|
|||||||
import { FileProvider } from './provider';
|
import { FileProvider } from './provider';
|
||||||
import { FunctionExtractor } from './functionExtractor';
|
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<void> {
|
||||||
|
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) {
|
export function registerCommands(context: vscode.ExtensionContext, model: FileModel, provider: FileProvider, functionExtractor: FunctionExtractor, output?: vscode.OutputChannel) {
|
||||||
// 连接到 API
|
// 连接到 API
|
||||||
console.log('注册 squirrel.connectToApi 命令...');
|
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) => {
|
const openFileCommand = vscode.commands.registerCommand('squirrel.openFile', async (entry: FileEntry) => {
|
||||||
if (!model.getIsConnected()) {
|
await openFile(model, provider, entry);
|
||||||
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}`);
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
|
||||||
// 保存文件(通过 VS Code 的保存事件处理,这个命令主要用于显示)
|
// 保存文件(通过 VS Code 的保存事件处理,这个命令主要用于显示)
|
||||||
|
|||||||
@@ -116,6 +116,9 @@ export function activate(context: vscode.ExtensionContext) {
|
|||||||
isCaseSensitive: true
|
isCaseSensitive: true
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// 将 fileSystemProvider 添加到 context 以便在 commands 中使用
|
||||||
|
(global as any).fileSystemProvider = fileSystemProvider;
|
||||||
|
|
||||||
// 注册所有命令
|
// 注册所有命令
|
||||||
console.log('正在注册命令...');
|
console.log('正在注册命令...');
|
||||||
registerCommands(context, model, provider, functionExtractor, output);
|
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.appendLine('[Squirrel] 扩展激活完成');
|
||||||
output.show();
|
output.show();
|
||||||
|
|||||||
@@ -5,6 +5,8 @@ export class SquirrelFileSystemProvider implements vscode.FileSystemProvider {
|
|||||||
private model: FileModel;
|
private model: FileModel;
|
||||||
private _onDidChangeFile = new vscode.EventEmitter<vscode.FileChangeEvent[]>();
|
private _onDidChangeFile = new vscode.EventEmitter<vscode.FileChangeEvent[]>();
|
||||||
onDidChangeFile = this._onDidChangeFile.event;
|
onDidChangeFile = this._onDidChangeFile.event;
|
||||||
|
// 存储文件实例内容,支持多标签页
|
||||||
|
private fileContentCache = new Map<string, string>();
|
||||||
|
|
||||||
constructor(model: FileModel) {
|
constructor(model: FileModel) {
|
||||||
this.model = model;
|
this.model = model;
|
||||||
@@ -13,12 +15,24 @@ export class SquirrelFileSystemProvider implements vscode.FileSystemProvider {
|
|||||||
// 读取文件
|
// 读取文件
|
||||||
async readFile(uri: vscode.Uri): Promise<Uint8Array> {
|
async readFile(uri: vscode.Uri): Promise<Uint8Array> {
|
||||||
const filePath = this.getPathFromUri(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);
|
const content = await this.model.getFileContent(filePath);
|
||||||
|
|
||||||
if (content === undefined) {
|
if (content === undefined) {
|
||||||
throw vscode.FileSystemError.FileNotFound(uri);
|
throw vscode.FileSystemError.FileNotFound(uri);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 缓存内容以支持多标签页
|
||||||
|
this.fileContentCache.set(cacheKey, content);
|
||||||
|
|
||||||
return new TextEncoder().encode(content);
|
return new TextEncoder().encode(content);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -27,6 +41,10 @@ export class SquirrelFileSystemProvider implements vscode.FileSystemProvider {
|
|||||||
const filePath = this.getPathFromUri(uri);
|
const filePath = this.getPathFromUri(uri);
|
||||||
const textContent = new TextDecoder().decode(content);
|
const textContent = new TextDecoder().decode(content);
|
||||||
|
|
||||||
|
// 更新缓存内容
|
||||||
|
const cacheKey = uri.toString();
|
||||||
|
this.fileContentCache.set(cacheKey, textContent);
|
||||||
|
|
||||||
const success = await this.model.saveFileContent(filePath, textContent);
|
const success = await this.model.saveFileContent(filePath, textContent);
|
||||||
|
|
||||||
if (!success) {
|
if (!success) {
|
||||||
@@ -36,11 +54,19 @@ export class SquirrelFileSystemProvider implements vscode.FileSystemProvider {
|
|||||||
|
|
||||||
// 其他必须实现的方法(简化实现)
|
// 其他必须实现的方法(简化实现)
|
||||||
stat(uri: vscode.Uri): vscode.FileStat {
|
stat(uri: vscode.Uri): vscode.FileStat {
|
||||||
|
// 获取文件内容以确定大小
|
||||||
|
const cacheKey = uri.toString();
|
||||||
|
let content = '';
|
||||||
|
|
||||||
|
if (this.fileContentCache.has(cacheKey)) {
|
||||||
|
content = this.fileContentCache.get(cacheKey)!;
|
||||||
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
type: vscode.FileType.File,
|
type: vscode.FileType.File,
|
||||||
ctime: Date.now(),
|
ctime: Date.now(),
|
||||||
mtime: 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(() => {});
|
return new vscode.Disposable(() => {});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 清理文件缓存
|
||||||
|
clearFileCache(uri: vscode.Uri): void {
|
||||||
|
const cacheKey = uri.toString();
|
||||||
|
this.fileContentCache.delete(cacheKey);
|
||||||
|
}
|
||||||
|
|
||||||
// 从 URI 解析文件路径
|
// 从 URI 解析文件路径
|
||||||
private getPathFromUri(uri: vscode.Uri): string {
|
private getPathFromUri(uri: vscode.Uri): string {
|
||||||
if (uri.scheme !== 'squirrel') {
|
if (uri.scheme !== 'squirrel') {
|
||||||
throw vscode.FileSystemError.FileNotFound(uri);
|
throw vscode.FileSystemError.FileNotFound(uri);
|
||||||
}
|
}
|
||||||
|
// 移除查询参数,只返回路径部分
|
||||||
return uri.path.substring(1); // 去掉开头的 '/'
|
return uri.path.substring(1); // 去掉开头的 '/'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 获取文件实例ID
|
||||||
|
private getInstanceId(uri: vscode.Uri): string {
|
||||||
|
return uri.query ? new URLSearchParams(uri.query).get('instance') || 'default' : 'default';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
71
第三方API.md
Normal file
71
第三方API.md
Normal file
@@ -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}
|
||||||
|
|
||||||
Reference in New Issue
Block a user