使用IDEA(社区版)开发IDEA Action插件
一、环境准备:
1. IDEA确保已安装好插件Plugin DevKit
2. 新建Plugin插件工程,选择SDK为安装IDEA包下的SDK,如果找不到就定位到IDEA安装包下找
3. 起好工程名,直接finish,如下我创建了plugindemo插件工程
二、开发第一个弹窗Action示例
1. 在src下右键创建一个TestMenu Action,填写配置信息,其中class name就是插件Action类名,Name就是插件功能菜单显示名称,Groups中要选择插件功能属于哪,如右键中就是EditorPopupMenu,还可以在Keyboard Shortcuts中设置快捷键,注意不要和其他快捷键冲突
创建完后得到plugin.xml中的action如下
<actions> <action id="plugin-testmenu" class="TestMenu" text="Test_Menu" description="测试"> <add-to-group group-id="EditorPopupMenu" anchor="first"/> </action> </actions>
2. 在TestMenu类的actionPerformed方法中添加代码JOptionPane.showMessageDialog(null, "Hello World");
3. debug模式启动plugin,此后IDEA会启动一个沙箱进程,开启的沙箱IDEA中,右键就可以看到自己的插件了(注意,有可能沙箱进程慢,插件菜单要等一段时间才可点击)。如果沙箱进程没有打开过项目,可以自己通过File打开一个,可以选择在当前窗口打开,需要手动在沙箱中安装插件,当然要先进行插件生成
4. 点击插件按钮TestMenu,如果有断点可以看到进入断点,直接运行看到弹窗
5. 修改下plugin.xml中的idea-plugin节点下name,该name用于插件名称显示
6. build下编译成jar包就可以安装了,如果依赖了其他jar包,会编译成zip包,同样可以安装。
重启后效果
三、创建一个Action组,并将多个action放到组里
1. 再创建一个Action类,这次不用选择组
2. 修改plugin.xml中actions节点如下,group中的text就是插件组菜单的名称
<actions> <group id="hjpActionGroup" text="hjpActions" popup="true"> <add-to-group group-id="EditorPopupMenu" anchor="first"/> </group> <action id="plugin-testmenu" class="TestMenu" text="Test_Menu" description="测试"> <add-to-group group-id="hjpActionGroup"/> </action> <action id="plugin-testmenu2" class="TestMenu2" text="Test_Menu2" description="测试"> <add-to-group group-id="hjpActionGroup"/> </action> </actions>
3. 沙箱运行,效果如下
四、通过PsiFile操作Java代码文件
注意plugin.xml需要加入依赖
<depends>com.intellij.modules.java</depends>
1. 获取PsiJava
PsiFile psiFile = e.getData(LangDataKeys.PSI_FILE); if (psiFile instanceof PsiJavaFile) { PsiJavaFile psiJavaFile = (PsiJavaFile) psiFile;
2. 获取PsiClass
PsiClass[] classes = psiJavaFile.getClasses();
PsiClass psiClass = (PsiClass) classes[0];
3. 获取当前PsiClass的父类
PsiClass superClass = psiClass.getSuperClass();
4. 获取PsiField
PsiField[] fields = psiClass.getFields();
5. 获取字段类型的类名
String fieldType = field.getType().getPresentableText();
6. 获取字段注解内容
PsiAnnotation[] annotations = field.getAnnotations(); for (PsiAnnotation annotation : annotations) { final PsiJavaCodeReferenceElement nameReferenceElement = annotation.getNameReferenceElement(); if (nameReferenceElement != null) { final String referenceName = nameReferenceElement.getReferenceName(); //注解完整内容,自行处理 } }
7. 获取字段注释内容,docComment.getText()获取到完整内容,可自行处理
PsiDocComment docComment = field.getDocComment();