美文网首页
开发一个IDEA 插件帮你写代码吧

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

作者: 鹧鸪晏 | 来源:发表于2023-04-09 16:01 被阅读0次

    开发中尤其是依赖库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 插件帮你写代码吧

          本文链接:https://www.haomeiwen.com/subject/tkmbddtx.html