带有 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一样实现buildDialog
,addKind
的第三个参数是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
,关键部分是调用CreateFromTemplateDialog
的create()
,看看我的代码示例你就知道了会知道的。
执行操作 class 后,您应该像现在一样将其注册到 plugin.xml
。
顺便说一句,请删除 equals
和 hashCode
.
的危险错误实现
你不需要createFromTemplateHandler
。
所以我想在我的 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一样实现buildDialog
,addKind
的第三个参数是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
,关键部分是调用CreateFromTemplateDialog
的create()
,看看我的代码示例你就知道了会知道的。
执行操作 class 后,您应该像现在一样将其注册到 plugin.xml
。
顺便说一句,请删除 equals
和 hashCode
.
你不需要createFromTemplateHandler
。