带有 IntelliJ 插件的文件模板扩展

File Template extension with IntelliJ plugin

所以我想在我的 IntelliJ IDEA 插件中创建一个文件模板,我设法从其他一些插件中挖掘出来,但模板总是想成为一个 java 文件,我无法更改扩展名它是 .cqt 而不是 .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 但不确定是什么,或者即使这个猜测是否正确,因为我找不到任何关于如何创建文件模板的文档插件。

class CroquetteDefaultPropertiesProvider extends TemplatePackagePropertyProvider {

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

你需要在fileTemplates包下放一些Name.your-lang-extension.ft文件,比如this, and declare <internalFileTemplate name="Name" />, like this(这个Name对应[=10=中的Name ]).
在模板文件中,您可以使用一些变量,有一些预定义的变量,您可以使用自己的变量。语法是 ${MY_VAR}.
那么你应该像this一样实现buildDialogaddKind的第三个参数是Name.your-lang-extension.ft中的Name,第一个是显示的名称。

然后你应该创建一个动作 class 扩展 CreateFileFromTemplateAction,比如 this, and create a Properties instance by using FileTemplateManager.getInstance(project).defaultProperties like this and add some properties like this 它将被填充到变量中,就像你可以 properties.add("MY_VAR", yourCodeToGetSomeInformation()) 和 [=16] =] 将替换为 yourCodeToGetSomeInformation() 的 return 值。

之后你应该像this一样实现createFileFromTemplate,关键部分是调用CreateFromTemplateDialogcreate(),看看我的代码示例你就知道了会知道的。

执行操作 class 后,您应该像现在一样将其注册到 plugin.xml

顺便说一句,请删除 equalshashCode.

的危险错误实现

你不需要createFromTemplateHandler