2019独角兽企业重金招聘Python工程师标准>>>

IntelliJ IDEA 是目前最好用的 JAVA 开发 IDE,它本身的功能已经非常强大了,但是每个人的需求不一样,有些需求 IDEA 本身无法满足,于是我们就需要自己开发插件来解决。工欲善其事,必先利其器,想要提高开发效率,我们可以借助 IDEA 提供的插件功能来满足我们的需求。如果没有我需要的功能怎么办?很简单,我们自己造一个!

插件能做什么?

IDEA 的插件几乎可以做任何事情,因为它把 IDE 本身的能力都封装好开放出来了。主要的插件功能包含以下四种:

  • 自定义语言支持:如果有 IDEA 暂时不支持的语言,你可以自己写一个插件来支持,例如 Go 语言原来的支持就是通过插件做的,后来单独做了一个 Goland。官方有自定义语言插件支持的教程。
  • 框架支持:例如Struts 2 的框架支持
  • 工具集成:可以给 IDEA 的自带功能进行增强,例如对 Git 的操作增加 CodeReview 的功能。参考Gerrit
  • 用户界面:自定义的插件改变用户界面。参考BackgroundImage

我为了减少重复代码的编写,写了一个代码生成的插件IDEA代码生成插件CodeMaker,支持自定义代码生成的模板。

Hello world 插件

依照惯例,我们从 Hello world 开始。

新建一个 Gradle 的插件工程

有些教程推荐用 IDEA 默认的插件工程来开始,但是我比较推荐用 Gradle 来管理整个插件工程,后面的依赖管理会很方便,否则都得靠手动管理。

点击新建工程,选择 Gradle

接下来填写项目属性

配置 Gradle,用默认配置就行

新建完工程之后,IDEA 会自动开始解析项目依赖,因为它要下载一个几百兆的 SDK 依赖包,所以会比较久,打开科学上网能快一点。

Gradle 依赖解析完成之后,项目结构如下图,其中 plugin.xml 是插件的配置,build.gradle 是项目依赖的配置(类比 pom.xml)。

下面就是默认生成的 plugin.xml

<idea-plugin><!--插件id--><id>com.xiaokai.test.demo</id><!--插件名称--><name>Demo</name><!--开发者信息--><vendor email="support@yourcompany.com" url="http://www.yourcompany.com">YourCompany</vendor><!--插件说明--><description><![CDATA[Enter short description for your plugin here.<br><em>most HTML tags may be used</em>]]></description><!-- please see http://www.jetbrains.org/intellij/sdk/docs/basics/getting_started/plugin_compatibility.htmlon how to target different products --><!-- uncomment to enable plugin in all products<depends>com.intellij.modules.lang</depends>--><!--依赖的其他插件能力--><extensions defaultExtensionNs="com.intellij"><!-- Add your extensions here --></extensions><!--插件动作--><actions><!-- Add your actions here --></actions>
</idea-plugin>

创建一个 Action

Action 是 IDEA 中对事件响应的处理器,它的 actionPerformed 就像是 JS 中的 onClick 方法。可以看出来,插件的开发本质上跟 web、Android 的开发没有什么不同,因为都是事件驱动的编程。

我们可以直接使用 IDEA 提供的 Action 生成器

点击 OK 之后会在 src 生成类文件:

package com.xiaokai.test;import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;public class HelloWorldAction extends AnAction {@Overridepublic void actionPerformed(AnActionEvent e) {// TODO: insert action logic here}
}

同时,动作的信息也会注册到 plugin.xml 中

    <!--插件动作--><actions><!-- Add your actions here --><action id="demo.hello.world" class="com.xiaokai.test.HelloWorldAction" text="HelloWorld"description="Say Hello World"><add-to-group group-id="GenerateGroup" anchor="last"/></action></actions>

弹出对话框

创建完 Action 之后我们就要开始往里面写逻辑了,既然是 Hello World 教学,那我们就来试一下最简单的弹出对话框。

    @Overridepublic void actionPerformed(AnActionEvent e) {//获取当前在操作的工程上下文Project project = e.getData(PlatformDataKeys.PROJECT);//获取当前操作的类文件PsiFile psiFile = e.getData(CommonDataKeys.PSI_FILE);//获取当前类文件的路径String classPath = psiFile.getVirtualFile().getPath();String title = "Hello World!";//显示对话框Messages.showMessageDialog(project, classPath, title, Messages.getInformationIcon());}

代码写完之后,打开 Gradle 的界面,点击 runIde 就会启动一个安装了插件的 IDEA,然后就可以进行测试。你还可以右键启动 Debug 模式,这样还能进行断点。

运行的效果如下图:

可以看到,我们右键打开 Generate 菜单之后,里面最后一项就是我们添加的 Action,

进阶的教程

如果想学习更多的原理和设计理念可以看IntelliJ Platform SDK的官方文档。不过老实说,它的文档写的挺差的,基本上就是简单讲了一下概念和原理,没有深入的分析。所以如果要深入研究还得靠自己。最靠谱的学习方式就是看别人写的插件,举个例子,你想知道怎么样实现自动生成代码,你就去找支持这个功能的插件,看他的源码是怎么写的。

我当时写CodeMaker的时候也是靠自己啃源码之后写出来的。下面我简单介绍一下我用过的一些 API,这些 API 基本都没有文档说明,全靠代码相传。

判断当前光标选择的元素是什么

        //获取当前事件触发时,光标所在的元素PsiElement psiElement = anActionEvent.getData(LangDataKeys.PSI_ELEMENT);//如果光标选择的不是类,弹出对话框提醒if (psiElement == null || !(psiElement instanceof PsiClass)) {Messages.showMessageDialog(project, "Please focus on a class", "Generate Failed", null);return;}

获取当前类文件的所有类对象

一个类文件中可能会有内部类,所以读取的时候返回的是一个列表

    public static List<PsiClass> getClasses(PsiElement element) {List<PsiClass> elements = Lists.newArrayList();List<PsiClass> classElements = PsiTreeUtil.getChildrenOfTypeAsList(element, PsiClass.class);elements.addAll(classElements);for (PsiClass classElement : classElements) {//这里用了递归的方式获取内部类elements.addAll(getClasses(classElement));}return elements;}

格式化代码

    public static void reformatJavaFile(PsiElement theElement) {CodeStyleManager codeStyleManager = CodeStyleManager.getInstance(theElement.getProject());try {codeStyleManager.reformat(theElement);} catch (Exception e) {LOGGER.error("reformat code failed", e);}}

使用粘贴板

        CopyPasteManager.getInstance().setContents(new SimpleTransferable(table.toString(), DataFlavor.allHtmlFlavor));

原文链接

转载于:https://my.oschina.net/u/1464083/blog/3014373

IDEA 插件开发入门教程相关推荐

  1. 【直播回顾】蚂蚁金服高级开发工程师萧恺:IDEA 插件开发入门教程

    主讲人:萧恺(蚂蚁金服-支付宝事业群-高级开发工程师) 本名:肖汉松 讲师介绍: 热爱阅读,喜欢挑战,热衷尝试新的技术,关注技术背后的原理. 关注领域:Java 服务端开发,分布式系统 关注语言:Ja ...

  2. 基于jquery插件开发入门教程

    鉴于最近要使用大量的jquery,所以总有一种捣鼓文字来抒发一下情绪的冲动.思前想后就来篇jquery插件开发入门教程吧,毕竟如果不想开发插件,那自己无论用别人的插件多牛逼,最多只是js的使用者,作为 ...

  3. virtualxposed使用教程_Xposed 插件开发入门教程(一)

    其实网上已经有很多 Xposed 插件开发的入门教程了,我写的这篇与其说是教程,不如说是参考,为了防止以后忘了开发步骤,这里就写篇博客记录一下. 要使用 Xposed 插件,首先要 root 手机并安 ...

  4. chrome插件开发入门教程

    点击上方蓝字"优派编程"选择"加为星标",第一时间关注原创干货 原文地址 http://wp.fang1688.cn/study/539.html 这次我在ch ...

  5. Atom插件开发入门教程(四)

    插件: 修饰文本 上一篇教程,我们已经开发了一个插件.下面我们来看看我们还能做什么.这篇文章会教你如何用一个简单的命令来替换选中的字符串内容.当你选中命令"cool" 时,下面的字 ...

  6. IDEA 插件开发入门教程 1

    IntelliJ IDEA 是目前最好用的 JAVA 开发 IDE,它本身的功能已经非常强大了,但是每个人的需求不一样,有些需求 IDEA 本身无法满足,于是我们就需要自己开发插件来解决.工欲善其事, ...

  7. IntelliJ IDEA插件开发入门教程(一)

    插件开发环境配置 IDEA分为社区版(Community Edition)和旗舰版(Ultimate Edition) 社区版:完全免费,代码开源,但是缺少一些旗舰版中的高级特性. 旗舰版:30天免费 ...

  8. Revit 2021插件开发入门教程

    在这个教程中我们将学习如何开发一个Revit插件,并利用此插件实现设计自动化.课程代码可以从github下载. 第一步是创建 C# Libray新项目,这就是我们的"DeleteDoors& ...

  9. onetab丢失崩溃怎么办?快试试我这个类似功能的插件吧,也可以当做插件开发入门教程

    本文成于2019年12月31日 本文改于2020年4月10日 github地址:https://github.com/scoful/cloudSkyMonster 文章目录 cloudSkyMonst ...

最新文章

  1. iframe怎么用_怎么样减少无效URL的爬行和索引
  2. Git错误:fatal: Not a git repository (or any of the parent directories)解决方法
  3. pythonurllib模块-Python urllib模块 网络资源访问安装下载
  4. Java 技术篇-linux系统下安装jdk、设置java环境变量实例演示
  5. 操作系统(二十八)死锁的概念
  6. 经典C语言程序100例之五四
  7. Resin 的 watchdog(看门狗)介绍
  8. Springboot-application.properties
  9. 自动化测试中Python与C/C++的混合使用
  10. Linux时间操作(time、gettimeofday)
  11. 黑群晖linux删除文件夹命令,不拆机直接修改黑群晖的SN和MAC
  12. autoit3转换php,autoit入门基础教程——字符串与变量转换.pdf
  13. python生成vcf通讯录文件
  14. 基于STM32单片机智能花盆控制系统设计(毕业设计资料)
  15. 【官方】Mysql中注释的规范写法(全部)
  16. 电脑微信网络正常,浏览器无法联网,显示“代理服务出现问题,或者地址有误”
  17. 企业级智能BI平台开源框架
  18. hyperf接入阿里云nacos配置中心
  19. Oracle普通索引和唯一索引
  20. vmware Workstation设置bios启动

热门文章

  1. 【C++grammar】访问控制与抽象类与纯虚函数
  2. leetcode 198. 打家劫舍 思考分析
  3. python 温度转换程序_Python程序将米转换为码
  4. 08-开运算和闭运算
  5. 递归-汉诺塔(代码、分析、汇编)
  6. ffmpeg 命令添加文字水印
  7. centos修改磁盘uuid_Centos更换损坏硬盘UUID改变导致系统不能正常启动处理
  8. 强制进程结束(内核函数)
  9. [Golang]Go语言学习资源集合
  10. Git的多人协作和分支处理测试