You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 05:21:01