开发一个IDEA 插件帮你写代码吧

开发中尤其是依赖库aar的开发 ,常常要写很多Log或者Toast 来验证代码的执行状况。虽然代码不多,往往还是要手撸

LogUtil.d("TAG","");

ToastUtils.toast(this,"",Toast.LENGTH_SHORT);

类似于这样的原生或者封装的工具类一般都是固定的“模版”,还有比如Builder

    WTLogBuilder.create()
            .setTag("UploadManager#UploadEventListener")
            .setMsg(builder.toString())
            .setClass(UploadEventListener.class)
            .setMethod("log()")
            .log();

这样的代码,写好一个模版一键生成岂不快哉?

Android Studio 中有很多好用的插件比如GsonFormat你肯定用过,如何自己撸一个AS插件呢?

准备工作

1.下载IntelliJ IDEA

开发AS插件要用的IDE 是IntelliJ IDEA。AndroidStudio基于IntelliJ IDEA平台,因此,开发AndroidStudio插件其本质只是开发IDEA平台的插件。为什么不直接用AndroidStudio?主要是AndroidStudio是面向Android开发的,在针对IDEA插件的各种环境都没有,当然,也可以自己下载插件开发环境然后在AndroidStudio上去配置。如何配置?懒得讲了,因为懒。

IntelliJ IDEA下载地址:https://www.jetbrains.com/idea/

选择社区版IntelliJ IDEA Community Edition,因为Ultimate 要钱!且不开源。Version 选择和你的AandroidStudio 一样或者相近的版本,懂得都懂吧,不然可能会爆出来一堆兼容性问题把你变丑。

2.新建项目

File->new ->project->IntelliJ Platform Plugin

image.png

先别急next,你的Project SDK 可能还没有选,如果下拉啥也没有,那是你还没有下载SDK,这是开发IntelliJ Platform 插件所需要的SDK,一会得去先下载然后配一下。好了 next 直到创建完项目。

3.配置项目

项目打开 Project Structure 设置,点“+”选择Add IntelliJ Platform Plugin SDK,然后 apply 下载好Plugin SDK,回到项目就可以开始开发了。


image.png

开发插件

1.项目结构

image.gif
  • src 目录存放的是插件对应的Java源码
  • resources/META-INF/plugin.xml 是插件的配置文件

项目结构很简单,我们要做的第一件事就是在 resources 目录下的 plugin.xml 配置插件的 id 和名称:

image.png

actions 标签目前是空的,它是存放 action 的集合,而 action 用来描述插件的动作,具体说就是插件新建的菜单选项出现在哪个组里的什么位置、选择该选项后由哪个类执行具体操作、快捷键信息等等

2.创建Action

选中目录右键 -> New

image.png

创建一个Action

image.png

我们的Action会自动配置到plugin.xml里,这里我把插件显示位置选在Code 菜单下和右键弹窗里,设置它的快捷键:sheft+command+L

image.png

当用户点击时触发一个动作事件,IntelliJ则会回调AnAction类的actionPerformed函数。因此我们只需重写actionPerformed函数即可

public class AutoGenerateLogAction extends AnAction {

    @Override
    public void actionPerformed(AnActionEvent event) {
        //当前 project
        Project project = event.getData(PlatformDataKeys.PROJECT);

        // 获取当前编辑区对象
        Editor editor = event.getData(PlatformDataKeys.EDITOR);
        if (editor == null) {
            return;
        }

        //当前编辑的文件
        Document document = editor.getDocument();

    //开启一个事务执行文件修改操作
    WriteCommandAction.runWriteCommandAction(project,
                new Runnable() {
                    @Override
                    public void run() {
                        //获取光标位置
                        Caret caret = editor.getCaretModel().getCurrentCaret();
                        int offset = caret.getOffset();

                        String code = "   WTLogBuilder.create()\n" +
                                "                        .setTag()\n" +
                                "                        .setMsg()\n" +
                                "                        .setClass(.class)\n" +
                                "                        .setMethod()\n" +
                                "                        .log();";
                        //在光标处插入一段代码
                        document.insertString(offset, code);
                    }
                });
    }
}

关键类解释

1.PlatformDataKeys

它包含了一组常用的DataKey变量。DataKey是IntelliJ IDEA的数据传递机制,它用于在不同的组件之间传递数据。


image.png

CommonDataKeys类中一些常用的DataKey变量及其含义:

PROJECT:当前项目对象。

MODULE:当前模块对象。

EDITOR:当前编辑器对象。

PSI_FILE:当前编辑器中的PsiFile对象。

VIRTUAL_FILE:当前编辑器中的VirtualFile对象。

DOCUMENT:当前编辑器中的Document对象。

SELECTION_START_LINE:当前编辑器中,选中文本的第一行的行号。

SELECTION_END_LINE:当前编辑器中,选中文本的最后一行的行号。

CLASS_UNDER_CARET:当前编辑器中光标所在的类对象。

METHOD_UNDER_CARET:当前编辑器中光标所在的方法对象。

通过AnActionEvent的getData方法,可以方便地获取当前项目、模块、编辑器等对象。

2.PsiFile

PsiFile表示代码文件,包含了代码文件中的所有元素信息,例如类、方法、变量等。它可以帮助我们获取代码文件中的所有元素信息,并进行相应的操作。例如,我们可以使用PsiFile对象来查找代码文件中的所有类、方法、变量等,并对它们进行修改、删除等操作。

3.PsiElement

PsiElement是表示代码元素,它包含了代码元素的名称、类型、修饰符等。我们通过它获取代码元素的各种信息,并进行相应的操作。

4.WriteCommandAction:

它用于在UI线程中执行一组需要对文档进行修改操作,WriteCommandAction会自动启动一个事务,如果执行成功,所有的修改操作将会被提交;如果执行失败,所有的修改操作将会被回滚。WriteCommandAction可以确保文档修改操作的线程安全性,并且可以避免因为修改操作失败而导致的数据不一致问题。

3.调试

运行一下,直接点run 按钮,会重新打开一个IDEA窗口,选择一个项目打开,右键或者快捷键(sheft+comm+L)


image.gif

点击我们的插件,生成了一段模版代码


image.png

插件发布

Build -> Prepare Plugin Module ‘XXX’ For Deplyment


image.png

打开 AS,在设置插件页面选择本地安装插件:

image.png

发布到市场
登录官网: https://plugins.jetbrains.com/plugin/add#intellij

image.png

上传插件的.jar包,等待审核就行了。

拓展

对于上面这中快速生成API代码,IDEA还提供了另外一种方式:Live Templates

image.png

这里IDEA已经定义好了一些模版,比如我们打出Toast然后回车,就会生成一段Toast代码

Toast.makeText(, "", Toast.LENGTH_SHORT).show();

Toast模版:

image.png

我们也可以添加自己的模版,比如自定义一个log模版

image.png

输入模版名就出来了,回车就自动填充我们的代码。

image.png

思考

除了简单的插入一小段代码,好的插件能做的更多实现更复杂的功能。

  1. 比如还可以对选中的内容做操作,光标选中R.layout.activity_xxx ,把xml里的view 自动生成findViewById。

  2. 根据模版自动生成类,类似 new Activity,或者Adater / Holder 类等 。

IntelliJ平台插件有很多种类,通常主要分为如下几类:

  • 自定义编程语言的支持(Custom language support):包括语法高亮、文件类型识别、代码格式化、代码查看和自动补全等等
  • 框架集成(Framework integration):其实就是类似基于IntelliJ开发一个IDE出来,比如AndroidStudio 将Android SDK集成进IntelliJ。其他的插件如Java EE中的Spring、Struts等framework集成到IntelliJ。使用户在IntelliJ上面使用特定的框架更方便。
  • 工具集成(Tool integration):对IntelliJ定制一些个性化或者是实用的工具。
  • 附加UI(User interface add-ons):对标准的UI界面进行修改,如在编辑框里加一个背景图片等。

参考

1.AndroidStudio插件开发(Hello World篇)

你可能感兴趣的:(开发一个IDEA 插件帮你写代码吧)