Intellij IDEA插件开发(一)快速入门

概述

作为开发者,一定听说过JetBrains的大名,此公司简直堪称IDE界的Adobe,针对不同编程语言有一系列不同的IDE产品,如葫芦兄弟般神通广大。

JetBrains的当家花旦当属Intellij IDEA,它的旗舰版本支持你会写的不会写的N多种语言,更重要的是它自身就是一个SDK,提供了众多插件接口供开发者使用,通过插件,让以面向对象方式操纵代码变为可能。下面分享一些在JetBrains系列IDE上编写插件的方法。

IDE的插件化支持

一件喜闻乐见的事情是JetBrains出产的IDE都使用Java编写,写过Swing程序的同学可能对那个丑陋不堪的GUI久久不能忘怀,再看看IDEA,完全就是整容成功的经典案例。面向对象的思想贯穿在使用IDEA开发程序的整个流程中,一个项目在IDEA中被抽象为Project和Module,每个源代码或资源文件被抽象为各种PSI对象,在使用Gradle构建的项目中,构建的过程被抽象成不同的Task……同样的,我们的插件也是一个对象,它是一个独立的Java程序,挂载在IDE上不同的入口处,通过用户的特定操作(快捷键、菜单项点击等)被激活,然后根据当前的上下文环境执行相应的逻辑。

创建插件工程

Talk is cheap,下面将会通过一个简单的例子来介绍插件开发中的各个流程。

打开IDEA,选择Create New Project,项目类型选择Intellij Platform Plugin,Project SDK选择IDEA的安装目录,在此强烈推荐先安装一个社区版本的IDEA,因为旗舰版本是闭源的,代码经过混淆,后面需要跟踪源代码的时候反编译出来的方法和参数名称可能是混淆后的无意义名称,带来不必要的麻烦,如果没有安装社区办,也可以从GitHub上clone到社区版最新的代码。创建工程的时候可以选择Groovy、Scala和SQL的支持,从而在项目中使用Groovy、Scala语言或者操作数据库。

创建好项目之后,默认会在编辑器中打开plugin.xml,和你见过的其他配置文件一样,这个文件在插件安装时会提供给IDEA插件的各种信息,包括名称、插件信息、作者信息、挂载点、入口类、注册的代码模板和文件类型支持等。先不管别的,找到actions标签,在其中注册我们的插件,像这样:

<action class="com.moxun.example.Plugin" id="moxun.plugin" text="Plugin Guide" description="A simple IDEA plugin." icon="/icons/icon.png">  
<add-to-group group-id="MainToolBar" anchor="last"/>
</action>

解释一下各个参数的意思,class字段定义插件的入口类,id字段是插件在IDE内一个独有的id,text为当鼠标指到插件入口时浮出的文字提示,description为当鼠标指到插件入口时在状态栏上出现的提示,icon定义插件的图标。add-to-group标签中group-id指定要挂载插件的group,anchor字段指定插件在该group中的位置。可以在IDE中搜索“PlatformActions.xml”查看作为当前SDK的IDE中提供了哪些group。

编写插件入口类

在上文中我们已经在plugin.xml中指定了插件入口类为com.moxun.example.Plugin,在相应路径下创建Plugin.java,让该类继承com.intellij.openapi.actionSystem.AnAction类并实现类中的抽象方法actionPerformed,通过方法参数anActionEvent即可获得IDE的上下文对象。下面我们将在此方法中加入逻辑实现点击插件图标后弹出一个Dialog。

IDEA已经为我们包装好了若干组件,在此处,使用Messages类就可实现多种Dialog的展示,在SDK中,大部分类的实例化都需要传入一个IDE上下文对象Project,该对象可在插件入口处通过anActionEvent.getProject()获得。

actionPerformed中添加代码如下:

@Overridepublic void actionPerformed(AnActionEvent anActionEvent) { 
Project project = anActionEvent.getProject();    
String s = Messages.showInputDialog(project, "What's your name?", "Hello", Messages.getQuestionIcon()); 
Messages.showMessageDialog(project, "Hello " + s + "!", "Welcome", Messages.getInformationIcon());
}

运行插件,IDE会对其进行构建并启动一个新的已经安装了该插件的IDE实例,点击插件图标后会弹出Dialog


在输入框中填入信息后点击OK


插件逻辑已经正确执行。

至此已经成功入门了Intellij Platform的插件开发,在下一篇文章中将介绍如何以面向对象的方式操作工程和工程中的代码,Bye~

  1. 我看了你这四篇文章,我必须为你点赞。这种文章太好了,在国内几乎没有。祝你好人一生平安