一键打开文件 (VS Code Extension)
一键打开文件 是一个强大的效率工具,允许您通过自定义 JavaScript 脚本规则,依据当前上下文(如当前编辑的文件)一次性批量打开多个关联文件。
特别适用于框架开发,例如 FastAdmin、ThinkPHP、Laravel 等,当你打开一个控制器时,可以自动打开其对应的模型、验证器、视图和静态资源文件。
✨ 主要特性
- 完全自定义规则:使用标准 JavaScript 编写规则,灵活性无限。
- 多规则支持:可以在一个规则文件中定义多组规则,运行时通过下拉菜单选择(如“打开关联文件”、“打开配置项”等)。
- 上下文感知:规则脚本可以获取当前触发文件的路径、文件名和工作区根目录。
- 右键菜单集成:支持在编辑器内容或资源管理器中右键直接触发。
- 自动初始化:如果未配置规则文件,首次运行时会自动创建包含常用示例的模板。
🚀 快速开始
- 安装插件后,在任意项目中打开一个文件。
- 右键点击该文件,选择
一键打开文件: 打开关联文件。
- 如果这是您第一次运行,插件会提示您在
.vscode/open-multi.rules.js 创建一个默认规则文件。
- 编辑
.vscode/open-multi.rules.js,根据您的项目结构编写逻辑。
📝 规则文件配置
插件默认从工作区的 .vscode/open-multi.rules.js 读取规则。您也可以在 VS Code 设置中修改 openMulti.ruleFile 配置项。
规则文件示例
规则文件是一个标准的 CommonJS 模块,可以导出一组函数。
示例 1:单规则模式(简单)
如果只导出一个函数,插件将直接执行它。
const path = require('path');
module.exports = function(rootPath, context) {
// context包含: { rootPath, filePath, fileName }
// 示例:打开 package.json
return [
path.join(rootPath, 'package.json')
];
};
示例 2:多规则模式(推荐)
导出对象,Key 为菜单名称,Value 为执行逻辑。运行时会弹出选择框。
const path = require('path');
module.exports = {
// 规则 1: FastAdmin 开发助手
"FastAdmin: 打开关联文件": function(rootPath, context) {
const files = [];
const currentFile = context.filePath; // d:\project\application\admin\controller\Test.php
// ... 编写逻辑解析路径 ...
// 比如自动添加对应的 Model, View, JS 等
return files;
},
// 规则 2: 打开项目配置
"Project: 打开配置文件": function(rootPath, context) {
return [
path.join(rootPath, 'package.json'),
path.join(rootPath, 'tsconfig.json'),
path.join(rootPath, '.gitignore')
];
}
};
🧩 API 参数说明
规则函数接收两个参数:
rootPath (String): 当前工作区的根目录绝对路径。
context (Object):
filePath (String): 触发命令时所在文件的完整绝对路径。
fileName (String): 触发命令时所在文件的文件名(如 index.ts)。
ruleName (String): 当前执行的规则名称。
返回值:必须返回一个包含绝对文件路径的字符串数组 (string[])。
💡 典型应用场景 (FastAdmin/ThinkPHP)
以下是一个完整的 FastAdmin 规则配置,保存到 .vscode/open-multi.rules.js:
const path = require('path');
const fs = require('fs');
module.exports = {
"FastAdmin: Open Related": function(rootPath, context) {
const filesToOpen = [];
const filePath = context.filePath; // 当前文件路径
if (!filePath) return [];
// 统一斜杠
const normalizedPath = filePath.replace(/\\/g, '/');
// 匹配控制器路径: .../application/{module}/controller/{name}.php
const controllerRegex = /^(.*\/)application\/([^\/]+)\/controller\/(.*)\.php$/i;
const match = normalizedPath.match(controllerRegex);
if (match) {
const rootDir = match[1];
const moduleName = match[2]; // e.g. 'admin'
const relativeClassPath = match[3]; // e.g. 'general/Config'
// 1. Model
filesToOpen.push(path.join(rootDir, 'application', moduleName, 'model', relativeClassPath + '.php'));
// 2. Validate
filesToOpen.push(path.join(rootDir, 'application', moduleName, 'validate', relativeClassPath + '.php'));
// 3. JS Asset
if (moduleName === 'admin') {
filesToOpen.push(path.join(rootDir, 'public/assets/js/backend', relativeClassPath.toLowerCase() + '.js'));
}
// 4. Lang
filesToOpen.push(path.join(rootDir, 'application', moduleName, 'lang', 'zh-cn', relativeClassPath.toLowerCase() + '.php'));
// 5. Views (扫描目录下所有html)
const viewDir = path.join(rootDir, 'application', moduleName, 'view', relativeClassPath.toLowerCase());
if (fs.existsSync(viewDir)) {
fs.readdirSync(viewDir).forEach(f => {
if(f.endsWith('.html')) filesToOpen.push(path.join(viewDir, f));
});
}
}
return filesToOpen;
}
};
⚙️ 设置
openMulti.ruleFile: 指定规则文件的路径。默认为 .vscode/open-multi.rules.js。
Happy Coding!