IntelliJ IDEA插件开发:如何修改文件模板扩展名为.cqt
解决IntelliJ IDEA插件自定义文件模板扩展名问题
你已经找对了核心配置方向,生成的文件始终是.java扩展名,大概率是模板处理器(CreateFromTemplateHandler)没正确接管扩展名逻辑,或者plugin.xml的配置缺了关键关联项。我给你梳理下完整的修复步骤:
1. 完善CroquetteCreateFromTemplateHandler的核心实现
这是控制扩展名的关键,你需要重写getExtension方法强制返回.cqt,同时确保文件名生成逻辑正确:
public class CroquetteCreateFromTemplateHandler extends CreateFromTemplateHandler { @Override protected String getExtension() { // 直接指定自定义扩展名,覆盖默认的.java return "cqt"; } @Override public boolean handlesTemplate(Template template) { // 匹配你在plugin.xml里定义的模板名称 return "Croquette File".equals(template.getName()); } @Override public void createFromTemplate(@NotNull Project project, @NotNull PsiDirectory directory, @NotNull String fileName, @NotNull Template template, @NotNull String templateText, @NotNull Map<String, Object> props, @Nullable PsiElement anchor) throws IncorrectOperationException { // 兜底处理:确保用户输入的文件名自动补上.cqt后缀 String finalFileName = fileName.endsWith(".cqt") ? fileName : fileName + ".cqt"; super.createFromTemplate(project, directory, finalFileName, template, templateText, props, anchor); } }
2. 补全plugin.xml的完整配置
你已经添加了internalFileTemplate和createFromTemplateHandler,但还要补全文件创建动作的绑定,以及扩展名和自定义文件类型的关联:
<idea-plugin> <!-- 1. 注册内部文件模板 --> <internalFileTemplate name="Croquette File" /> <!-- 2. 注册模板处理器,关联到你的实现类 --> <createFromTemplateHandler implementation="com.yourplugin.package.CroquetteCreateFromTemplateHandler" /> <!-- 3. 注册右键菜单创建文件的Action(可选,但提升用户体验) --> <action id="Croquette.CreateCustomFile" class="com.yourplugin.package.action.CreateCroquetteFileAction" text="Croquette File" description="Create a new Croquette file"> <add-to-group group-id="NewGroup" anchor="after" relative-to-action="NewJavaClass" /> </action> <!-- 4. 关联.cqt扩展名到自定义文件类型(如果需要语法高亮等特性) --> <fileType implementation="com.yourplugin.package.CroquetteFileType" name="Croquette File" extension="cqt" /> </idea-plugin>
3. (可选)注册自定义文件类型
如果你希望.cqt文件被IDE识别为专属类型(比如语法高亮、图标),需要定义CroquetteFileType:
public class CroquetteFileType extends LanguageFileType { public static final CroquetteFileType INSTANCE = new CroquetteFileType(); private CroquetteFileType() { super(CroquetteLanguage.INSTANCE); } @NotNull @Override public String getName() { return "Croquette File"; } @NotNull @Override public String getDescription() { return "Custom Croquette file type"; } @NotNull @Override public String getDefaultExtension() { return "cqt"; } @Nullable @Override public Icon getIcon() { // 返回你的自定义文件图标,比如Icons.CROQUETTE_ICON return null; } }
4. 检查模板内容的占位符
确保你的内部模板文件(通常放在resources/fileTemplates/internal/Croquette File)没有硬编码.java相关内容,比如:
#if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end public class ${NAME} { // Croquette file content here }
这里的${NAME}会被处理器替换为用户输入的文件名,再加上我们指定的.cqt后缀。
最后提醒:修改完代码和配置后,一定要重新构建插件并重启IDEA,IDE缓存可能会导致配置不即时生效。
内容的提问来源于stack exchange,提问作者bodand




