开发一个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.pngactions 标签目前是空的,它是存放 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
上传插件的.jar包,等待审核就行了。
拓展
对于上面这中快速生成API代码,IDEA还提供了另外一种方式:Live Templates
image.png这里IDEA已经定义好了一些模版,比如我们打出Toast然后回车,就会生成一段Toast代码
Toast.makeText(, "", Toast.LENGTH_SHORT).show();
Toast模版:
image.png我们也可以添加自己的模版,比如自定义一个log模版
image.png输入模版名就出来了,回车就自动填充我们的代码。
image.png思考
除了简单的插入一小段代码,好的插件能做的更多实现更复杂的功能。
-
比如还可以对选中的内容做操作,光标选中R.layout.activity_xxx ,把xml里的view 自动生成findViewById。
-
根据模版自动生成类,类似 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界面进行修改,如在编辑框里加一个背景图片等。