使用IntelliJ插件的文件模板扩展

时间:2018-04-09 18:26:42

标签: scala intellij-idea plugins intellij-plugin

所以我想在我的IntelliJ IDEA插件中创建一个文件模板,我设法从其他一些插件中挖掘它们,但模板总是想成为一个java文件,我不能将它的扩展名改为.cqt ins。的.java 我想通了:

我需要将这些添加到plugin.xml

<internalFileTemplate name="Croquette File" />

我需要

<createFromTemplateHandler implementation="...CroquetteCreateFromTemplateHandler" />

使用文件创建操作

<action
       id="Croquette.NewFile"
       class="...NewCroquetteFileDefinitionAction"
       text="Croquette File"
       description="Create a new Croquette file" >
    <add-to-group group-id="NewGroup" anchor="after" relative-to-action="NewGroup1"/>
</action>

NewCroquetteFileDefinitionAction包含:

class NewCroquetteFileDefinitionAction
        extends CreateFileFromTemplateAction(
            NewCroquetteFileDefinitionAction.NEW_CQT_FILE,
            "",
            CroquetteIcons.fileIcon)
        with DumbAware {

    import NewCroquetteFileDefinitionAction._

    override def buildDialog(
            project: Project,
            directory: PsiDirectory,
            builder: CreateFileFromTemplateDialog.Builder): Unit = {
        builder
            .setTitle(NEW_CQT_FILE)
            .addKind("Croquette File", CroquetteIcons.fileIcon, "Croquette File")
            .setValidator(new InputValidatorEx {
                override def getErrorText(inputString: String): String =
                    if (!inputString.isEmpty && !containsFuckyCharacters(inputString))
                        s"'$inputString' is not a valid Croquette file name."
                    else null

                override def checkInput(inputString: String): Boolean = getErrorText(inputString) != null


                override def canClose(inputString: String): Boolean = checkInput(inputString)
            })
    }

    override def getActionName(directory: PsiDirectory, newName: String, templateName: String): String = NEW_CQT_FILE

    override def hashCode(): Int = 0

    override def equals(obj: Any): Boolean = obj.isInstanceOf[NewCroquetteFileDefinitionAction]
}

object NewCroquetteFileDefinitionAction {
    val NEW_CQT_FILE = "New Croquette File"

    def containsFuckyCharacters(strIn: String): Boolean = {
        List("+", "-", "<", ">", "\\", "/", ",", ".", "[", "]", "{", "}", "@", "&", "$", ";", "*").foreach(ch =>
            if (strIn.contains(ch))
                return true
        )
        false
    }
}

我猜我必须在CroquetteDefaultPropertiesProvider类中做一些事情,但不确定是什么,或者即使猜测是否正确,因为我找不到任何关于如何使用插件创建文件模板的文档。

class CroquetteDefaultPropertiesProvider extends TemplatePackagePropertyProvider {

    override def fillProperties(directory: PsiDirectory, props: Properties) {
        super.fillProperties(directory, props)
    }
}

1 个答案:

答案 0 :(得分:1)

您需要在Name.your-lang-extension.ft包下放置一些fileTemplates个文件,例如this,并声明<internalFileTemplate name="Name" />,例如this(此Name对应于Name中的Name.your-lang-extension.ft 在模板文件中,您可以使用一些变量,有一些预定义的变量,您可以使用自己的变量。语法为${MY_VAR} 然后你应该像this那样实现buildDialogaddKind的第三个参数是Name中的Name.your-lang-extension.ft,第一个是显示的名称。

然后,您应该创建一个扩展CreateFileFromTemplateAction的操作类,例如this,并使用Properties this创建一个FileTemplateManager.getInstance(project).defaultProperties实例并添加一些属性例如,this将填入变量,例如模板中的properties.add("MY_VAR", yourCodeToGetSomeInformation())${MY_VAR}将替换为yourCodeToGetSomeInformation()的返回值。

之后你应该像[{3}}那样实施createFileFromTemplate,关键部分是调用CreateFromTemplateDialog的{​​{1}},只需查看我的代码示例即可知道。

在实施动作类之后,您应该将其注册到create(),就像您现在正在做的那样。

顺便说一句,请删除plugin.xmlequals

的危险错误实施

您不需要hashCode