【发布时间】:2021-09-02 14:44:44
【问题描述】:
背景
我正在开发一个插件,用户可以在其中从现有文件模板创建新文件。目标是将多个文件模板合并到主文件菜单下的新子菜单中。如果可能的话,我想创建一个基于模板类别的嵌套子菜单。例如:
New -> New Option -> Option A ->
Sub-Option A
Sub-Option B
Sub-Option C
Option B ->
Option C ->
当前进度
到目前为止,我可以在文件菜单下成功添加文件模板。但是,所有这些都未分组并直接放置在文件菜单中。随着模板数量的不断增加,管理变得越来越困难。
New -> Option A
Option B
Option C
为了创建文件模板,我使用了CreateFileFromTemplateAction 类
class NewFile : CreateFileFromTemplateAction(TEXT, TEST_DESCRIPTION, ICON) {
companion object {
fun createProperties(project: Project, className: String): Properties {
val properties = FileTemplateManager.getInstance(project).defaultProperties
properties += "VERSION" to "1.0.0"
properties += "NAME" to className
return properties
}
}
override fun buildDialog(project: Project, directory: PsiDirectory, builder: CreateFileFromTemplateDialog.Builder) {
builder.addKind("Option A", null, "Option A.kt.ft")
builder.addKind("Option B", null, "Option B.kt.ft")
builder.addKind("Option C", null, "Option C.kt.ft")
}
override fun getActionName(project: PsiDirectory?, directory: String, builder: String?): String {
return NEW_FILE_ACTION
}
override fun createFileFromTemplate(name: String, template: FileTemplate, dir: PsiDirectory) = try {
val className = FileUtilRt.getNameWithoutExtension(name)
val project = dir.project
val properties = createProperties(project, className)
CreateFromTemplateDialog(project, dir, template, AttributesDefaults(className).withFixedName(true), properties)
.create()
.containingFile
} catch (e: Exception) {
LOG.error("Error while creating new file", e)
null
}
}
后来在plugin.xml文件中注册了action和internalFileTemplate
<idea-plugin>
<extensions defaultExtensionNs="com.intellij">
<internalFileTemplate name="Option A"/>
<internalFileTemplate name="Option B"/>
<internalFileTemplate name="Option C"/>
</extensions>
<actions>
<action
id="NewFileAction"
class="NewFile">
<add-to-group group-id="NewGroup" anchor="after" relative-to-action="NewFile"/>
</action>
</actions>
</idea-plugin>
期望
我将非常感谢任何建议或代码 sn-p。如果要求不可行,我还可以使用替代解决方案,例如弹出对话框。
更新
修改plugin.xml代码后,菜单+子菜单正确显示。
<actions>
<group id="MyGroup.FileMenu"
popup="true"
class="com.intellij.ide.actions.NonTrivialActionGroup"
text="New Option"
description="New Option Description">
<add-to-group group-id="NewGroup" anchor="after" relative-to-action="NewFile"/>
<separator/>
<action id="NewFileAction"
class="NewFile"
text="My Action"
description="My Action Description"/>
</group>
</actions>
文件菜单的显示方式如下:
New -> New Option -> Option A
Option B
Option C
但是:
默认输入对话框分别采用自定义变量。例如。它先输入类名$NAME 变量,然后再输入其他变量
我一直在寻找一种方法来获取单个对话框中所有自定义变量的输入。这是使用常规文件模板而不使用插件时的输入对话框示例。
【问题讨论】:
-
RE 2:您似乎在操作中覆盖了
createFileFromTemplate(),但不创建任何文件。似乎没有必要重写此方法。 -
@BasLeijdekkers 谢谢。现在,我在使用文件模板中的自定义变量时遇到了困难。请查看更新后的答案。
-
如果您想要用户定义文件模板的对话框,请查看
com.intellij.ide.fileTemplates.actions.CreateFromTemplateAction。
标签: intellij-idea jetbrains-ide intellij-plugin