IntelliJ IDEA插件开发:如何为文件模板创建子菜单并实现单对话框收集变量
解决方案
1. 实现多级嵌套子菜单
你已经完成了一级子菜单的配置,要实现多层嵌套分类,只需要在plugin.xml中嵌套<group>标签即可,参考配置如下:
<actions> <!-- 一级子菜单:New Option --> <group id="MyGroup.FileMenu" popup="true" class="com.intellij.ide.actions.NonTrivialActionGroup" text="New Option" description="分类文件模板入口"> <add-to-group group-id="NewGroup" anchor="after" relative-to-action="NewFile"/> <!-- 二级子菜单:Option A --> <group id="MyGroup.OptionAGroup" popup="true" class="com.intellij.ide.actions.NonTrivialActionGroup" text="Option A" description="Option A分类模板"> <action id="SubOptionAAction" class="com.yourapp.action.SubOptionAAction" text="Sub-Option A"/> <action id="SubOptionBAction" class="com.yourapp.action.SubOptionBAction" text="Sub-Option B"/> <action id="SubOptionCAction" class="com.yourapp.action.SubOptionCAction" text="Sub-Option C"/> </group> <!-- 其他二级菜单项 --> <action id="OptionBAction" class="com.yourapp.action.OptionBAction" text="Option B"/> <action id="OptionCAction" class="com.yourapp.action.OptionCAction" text="Option C"/> </group> </actions>
如果模板数量较多,也可以不用逐个在XML中注册,通过重写ActionGroup的update方法动态生成子Action即可。
2. 解决多弹窗收集变量问题
出现多次弹窗的核心原因是你调用了两次变量收集逻辑:第一次是CreateFileFromTemplateDialog默认收集$NAME变量,第二次是CreateFromTemplateDialog会再次扫描模板中的自定义变量触发二次弹窗。
修改createFileFromTemplate方法的逻辑,合并变量收集到同一个对话框即可,参考代码如下:
override fun createFileFromTemplate(name: String, template: FileTemplate, dir: PsiDirectory): PsiFile? { return try { val project = dir.project val defaultProperties = FileTemplateManager.getInstance(project).defaultProperties // 直接用CreateFromTemplateDialog一次性收集所有变量,无需拆分步骤 val dialog = CreateFromTemplateDialog( project, dir, template, AttributesDefaults(name).withFixedName(false), // 允许修改文件名 defaultProperties ) dialog.show() if (dialog.isOK) { dialog.createdElement?.containingFile } else null } catch (e: Exception) { LOG.error("创建文件失败", e) null } }
你也可以直接将所有自定义变量声明在模板文件中,IDEA模板引擎会自动扫描所有未赋值的变量,合并到同一个输入对话框中,无需在代码里硬编码变量配置。
内容的提问来源于stack exchange,提问作者Prokash Sarkar
相关产品推荐
相关产品推荐

