如何在Jetbrains MPS中为自定义DSL添加右键Run调用CLI工具?
在JetBrains MPS中为自定义DSL添加右键「Run」操作
完全可行,无需依赖JAR构建场景,以下是具体实现方案:
核心逻辑
借助MPS的Action系统实现右键菜单注册,结合TextGen API触发配置文件生成,可按需添加后续执行逻辑。
具体步骤
1. 编写右键动作类
创建继承自BaseAction的Java类,在execute方法中实现核心逻辑:
public class RunDslAction extends BaseAction { @Override protected void doExecute(@NotNull DataContext context, @NotNull AnActionEvent event) { // 获取选中的DSL根节点 SNode dslNode = context.getData(CommonDataKeys.NODE); if (dslNode == null) return; // 指定配置文件输出目录(示例:项目下的output文件夹) File outputDir = new File(ProjectPaths.getProjectPath(event.getProject()), "output"); if (!outputDir.exists()) outputDir.mkdirs(); // 调用TextGen生成配置文件 TextGenFacade.getInstance().generate(dslNode, outputDir); // 可选:启动外部应用加载生成的配置 try { Runtime.getRuntime().exec("path/to/your/app " + new File(outputDir, "config.txt").getAbsolutePath()); } catch (IOException e) { Messages.showErrorDialog("启动应用失败: " + e.getMessage(), "Error"); } } }
2. 注册右键菜单
在插件模块的plugin.xml中配置Action,将其添加到节点右键菜单:
<action id="com.your.dsl.run" class="com.your.dsl.RunDslAction" text="Run"> <!-- 加入节点右键菜单,放在Generate动作之后 --> <add-to-group group-id="jetbrains.mps.ide.actions.NodePopupMenu" anchor="after" relative-to-action="jetbrains.mps.ide.actions.GenerateAction"/> <!-- 限制仅对DSL根节点显示 --> <constraints> <canPerform condition="com.your.dsl.RunActionCondition"/> </constraints> </action>
3. 配置显示条件(可选)
创建RunActionCondition类,确保只有你的DSL节点才会显示该右键选项:
public class RunActionCondition implements ActionConstraint { @Override public boolean isApplicable(@NotNull DataContext context) { SNode node = context.getData(CommonDataKeys.NODE); // 替换为你的DSL根概念 return node != null && node.getConcept().isSubConceptOf(YourDslRootConcepts.INSTANCE.getYourRootConcept()); } }
4. 关联TextGen模板
确保你的DSL已配置好对应的textgen模板,保证调用TextGenFacade.generate()时能正确生成目标配置文件。
注意事项
- 该方案完全独立于JAR构建流程,无需参考Kajak示例的打包逻辑
- 输出目录可自定义,比如让用户通过MPS设置面板配置,或固定为项目内路径
- 启动外部应用时需处理路径兼容性,避免硬编码绝对路径
内容的提问来源于stack exchange,提问作者Matthew
相关产品推荐
相关产品推荐

