所以我想在我的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)
}
}
答案 0 :(得分:1)
您需要在Name.your-lang-extension.ft
包下放置一些fileTemplates
个文件,例如this,并声明<internalFileTemplate name="Name" />
,例如this(此Name
对应于Name
中的Name.your-lang-extension.ft
在模板文件中,您可以使用一些变量,有一些预定义的变量,您可以使用自己的变量。语法为${MY_VAR}
然后你应该像this那样实现buildDialog
,addKind
的第三个参数是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.xml
和equals
。
您不需要hashCode
。