IDEA插件开发实战

1. 背景

插件体系是IDEA的精髓,插件市场里拥有无数开发者提交的插件,这让IDEA拥有了成长的能力。下面我通过一个例子,介绍插件创建、调试和发布的完整过程。

2. 开发步骤

2.1 创建工程

官方推荐2种方式来创建插件工程,一种是基于Github的模板代码,一种是基于Gradle手动配置。我推荐使用Github模板的方式,插件工程clone下来就可以直接执行,对新人比较友好。

2.2.1 模板代码

  1. 打开模板的Github地址:https://github.com/JetBrains/intellij-platform-plugin-template。

  2. 点击“Use this template”,将项目fork到自己的仓库里,或者直接下载模板代码。 

2.2.2 Gradle方式

在new project的时候,选择Gradle->IntelliJ Platform Plugin

2.2 开发插件

IDEA里有一个Intention action(代码推测)功能,快捷键是shift+enter。我们尝试新增一种代码推测,在输入类名后,通过推测自动生成new语句。例如,输入“User”,生成“User user = new User();”。

2.2.1 编写代码(Kotlin)

要新增Intention action功能,就要实现IntentionAction接口,实际代码里是用PsiElementBaseIntentionAction这个抽象类,它已经继承了IntentionAction。功能代码如下,IntentionAction接口里的核心方法是isAvailable()和invoke()方法。isAvailable()是在敲下shift+enter时,判断当前action是否满足执行条件;invoke()是选择aciton后,需要执行的逻辑。

class NewObjectGenerator : PsiElementBaseIntentionAction() {

    override fun isAvailable(project: Project, editor: Editor, element: PsiElement): Boolean {
        // 格式User
        return element is PsiIdentifier && element.parent is PsiJavaCodeReferenceElement
    }

    @Throws(IncorrectOperationException::class)
    override fun invoke(project: Project, editor: Editor, element: PsiElement) {
        val typeName = element.text
        // 变量名第一个字母改成小写
        val varName = typeName.replaceRange(0, 1, ""+typeName.get(0).toLowerCase())

        val containingFile = element.containingFile
        val psiDocumentManager = PsiDocumentManager.getInstance(project)
        val document = psiDocumentManager.getDocument(containingFile)
        val statement = " $varName = new ${typeName}();"
        val offset = element.endOffset
        // 在当前元素的后面,插入文本
        document!!.insertString(offset, statement)
    }

    override fun getFamilyName(): @IntentionFamilyName String {
        return "new对象"
    }

    override fun getText(): @IntentionFamilyName String {
        // 提示的名称
        return "new对象"
    }
}

2.2.2 注册Aciton

resource/META-INF/plugin.xml是插件的配置文件,将自定义的action类注册到配置文件里去。

<extensions defaultExtensionNs="com.intellij">
    <intentionAction>
        <className>com.github.commongenerator.actions.NewObjectGenerator</className>
    </intentionAction>
</extensions>

2.2.3 启动插件

执行:gradle->intellij->runide

会在沙箱里启动ide实例,这个实例能访问到最新的插件代码,也可以通过Debug模式启动。

2.2.4 测试插件

在User类名上,通过shift+enter触发Intention action,弹出了“new对象”提示。

2.3 发布插件(插件市场)

2.3.1 手工发布

先在插件市场创建插件,需要上传jar包。在执行过runide后,会在build/libs下生成jar包。

如果是正式的版本,就插件就会进入审核状态。

2.3.2 自动发布

通过publishPlugin脚本,可以在idea上直接发布插件到市场。build.gradle.kts里配置了publishPlugin相关的参数,配置里提示我们需要在系统环境变量里提供PUBLISH_TOKEN。

申请PUBLISH_TOKEN

PUBLISH_TOKEN通过插件超市的个人页面上申请。

设置PUBLISH_TOKEN

我用的是zsh,所以在~/.zshrc文件里添加了环境变量

export PUBLISH_TOKEN="perm:xxxxx"

发布插件

执行publishPlugin脚本

3. 总结

至此,插件的开发和发布流程就结束了。可以看出,jetbrain通过模板代码、发布脚本等方式,大大简化了插件的开发成本,让普通开发者也可以快速的开发出插件。IDEA作为我们最重要的开发工具,每个开发者都应该体验一下插件开发的乐趣。

4. 相关文献

IntelliJ Platform SDK官方文档:https://plugins.jetbrains.com/docs/intellij/getting-started.html

IntelliJ Platform SDK中文文档:IntelliJ Platform SDK / IntelliJ Platform SDK DevGuide

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李昂的数字之旅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值