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

BOD*_*AND 1 plugins scala intellij-idea intellij-plugin

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

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

<internalFileTemplate name="Croquette File" />
Run Code Online (Sandbox Code Playgroud)

我需要

<createFromTemplateHandler implementation="...CroquetteCreateFromTemplateHandler" />
Run Code Online (Sandbox Code Playgroud)

使用文件创建操作

<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>
Run Code Online (Sandbox Code Playgroud)

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
    }
}
Run Code Online (Sandbox Code Playgroud)

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

class CroquetteDefaultPropertiesProvider extends TemplatePackagePropertyProvider {

    override def fillProperties(directory: PsiDirectory, props: Properties) {
        super.fillProperties(directory, props)
    }
}
Run Code Online (Sandbox Code Playgroud)

ice*_*000 7

你需要把一些Name.your-lang-extension.ft文件放在fileTemplatespackage下,像这样,并<internalFileTemplate name="Name" />这样声明(这Name对应于Namein Name.your-lang-extension.ft)。
在模板文件中,您可能会使用一些变量,也有一些预定义的,您可以使用自己的。语法是${MY_VAR}.
那么你应该buildDialog这样实现,第三个参数addKindNamein Name.your-lang-extension.ft,第一个是显示的名称。

然后你应该CreateFileFromTemplateAction这样创建一个扩展的动作类,并Properties使用FileTemplateManager.getInstance(project).defaultProperties这样创建一个实例并添加一些像这样的属性,这些属性将填充到变量中,就像你可以的那样,properties.add("MY_VAR", yourCodeToGetSomeInformation())并且${MY_VAR}在你的模板中将被替换为返回值yourCodeToGetSomeInformation().

之后你应该createFileFromTemplate这样实现,关键部分是对CreateFromTemplateDialog's的调用create(),看看我的代码示例就知道了。

实现动作类后,您应该plugin.xml像现在所做的那样将其注册。

顺便说一句,请删除您对equals和 的危险不正确的实现hashCode

你不需要一个createFromTemplateHandler.