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)
你需要把一些Name.your-lang-extension.ft文件放在fileTemplatespackage下,像这样,并<internalFileTemplate name="Name" />像这样声明(这Name对应于Namein Name.your-lang-extension.ft)。
在模板文件中,您可能会使用一些变量,也有一些预定义的,您可以使用自己的。语法是${MY_VAR}.
那么你应该buildDialog像这样实现,第三个参数addKind是Namein 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.
| 归档时间: |
|
| 查看次数: |
698 次 |
| 最近记录: |