IDEA插件开发:如何在实时模板替换框执行自定义操作并获取内容?
实现IDEA实时模板替换框的文本获取与变量名识别
核心思路
借助IDEA插件开发API中的TemplateState、TemplateVariable类,结合TemplateEditingListener监听模板编辑事件,即可获取替换框的输入文本和对应模板变量名。
具体实现步骤
1. 获取当前模板的编辑状态(TemplateState)
先获取当前激活的编辑器实例,再通过TemplateManager拿到模板编辑状态对象,从该对象中提取所有模板变量信息:
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.project.Project; import com.intellij.codeInsight.template.TemplateManager; import com.intellij.codeInsight.template.TemplateState; import com.intellij.codeInsight.template.TemplateVariable; import com.intellij.openapi.actionSystem.CommonDataKeys; // 在插件逻辑中(比如Action类的actionPerformed方法内) Project project = ...; // 获取当前项目实例 Editor editor = CommonDataKeys.EDITOR.getData(e.getDataContext()); // e为AnActionEvent if (editor == null) return; TemplateState templateState = TemplateManager.getInstance(project).getTemplateState(editor); if (templateState == null) return; // 当前无模板编辑状态
2. 获取替换框对应的模板变量名与输入文本
通过TemplateState可遍历所有模板变量,或直接获取当前焦点的变量:
// 遍历所有模板变量 for (TemplateVariable variable : templateState.getVariables()) { String varName = variable.getName(); // 对应模板中$value$的"value"部分 String inputText = variable.getValue(); // 替换框当前输入的文本 // 执行自定义处理逻辑 } // 获取当前焦点所在的替换框变量 TemplateVariable currentVar = templateState.getCurrentVariable(); if (currentVar != null) { String currentVarName = currentVar.getName(); String currentInput = currentVar.getValue(); }
3. 监听输入完成/变量变化事件
若需在用户输入完成或变量内容变化时触发处理,注册TemplateEditingListener:
TemplateManager.getInstance(project).addTemplateEditingListener(new TemplateEditingListener() { @Override public void variableChanged(@NotNull TemplateState state, @NotNull TemplateVariable variable) { // 变量内容修改时触发 String varName = variable.getName(); String updatedText = variable.getValue(); // 处理更新后的文本 } @Override public void templateFinished(@NotNull TemplateState state, boolean broken) { // 模板编辑完成(用户按回车/退出替换框)时触发 for (TemplateVariable variable : state.getVariables()) { String finalVarName = variable.getName(); String finalText = variable.getValue(); // 处理最终输入文本 } } }, editor);
注意事项
- 仅在模板激活状态下调用上述代码有效,否则
TemplateState会返回null。 - 注册的监听器建议在模板编辑结束后移除,避免内存泄漏。
内容的提问来源于stack exchange,提问作者tia
相关产品推荐
相关产品推荐

