我的第一个IDEA插件

496 阅读3分钟

本篇将讲解如何创建一个新的IntelliJ IDEA插件项目,并创建我们的第一个Action。
官方文档:创建一个插件项目

准备工作

New Project

通过项目创建向导选择IDE PLugin项目
Type:插件类型,Plugin一般表示本插件需要完成一些IDE功能上的自定义,而Theme表示完成一些UI页面上的自定义,这里我们选择Plugin。

image.png

项目配置详解

点击create之后默认的项目结构长这样:

image.png

build.gradle/build.gradle.kts

用过gradle的小伙伴应该很熟悉这个文件,我们需要在这个文件中配置我们插件项目的一些参数

intelliJ

intellij {
    version.set("2022.2.4")
    type.set("IC") // Target IDE Platform

    plugins.set(listOf(/* Plugin Dependencies */))
}
  • version
    插件的目标ide的发布版本,详见版本发布记录

  • type
    插件的目标ide的平台
    type对照表

    typeIDE
    AIAndroid Studio
    CLClion
    IUIDEA Ultimate、WebStorm、RubyMine、DataGrip
    ICIDEA Community
    GOGoLand
    PSPHP Storm
    PYPyCharm
  • plugins
    插件所依赖的官方插件或者在插件商店里面的插件集合,值为依赖插件的ID,详见官方文档:插件依赖

其中,version使用版本全称时type可省略,如:AI-202.7660.26.42.7322048表示Android Studio 202.7660发行版本
每次gradle sync的时候会检查本地是否有目标ide的实例,没有就从远程下载,可以通过以下设置自己本地已安装的ide实例:

intellij { 
    // 本地安装路径的根目录
    localPath.set("/usr/local/android-studio")
}

Tips:verisonlocalPath只能二选一\color{red}{Tips: verison和localPath只能二选一}

plugins

plugins {
    id("java")
    id("org.jetbrains.kotlin.jvm") version "1.7.20"
    id("org.jetbrains.intellij") version "1.13.1"
}

Plugins闭包配置项目所使用的gradle插件

  • java
    Java支持。Java版本与目标Ide版本绑定,2020.3至少需要Java112022.2之后至少需要Java17
  • org.jetbrains.kotlin.jvm
    Kotlin支持。同样与目标Ide版本绑定,项目Kotlin stdlib不能超过目标ide捆绑的Kotlin版本,点我查看Kotlin版本对应规则
  • org.jetbrains.intellij
    本项目的核心插件,负责插件项目的依赖引入、调试支持、插件打包、插件发布等功能

patchPluginXml

patchPluginXml {
    // 插件支持的最小版本
    sinceBuild.set("222")
    // 插件支持的最大版本
    untilBuild.set("232.*")
}

plugin.xml

此文件是插件所有功能实现类的注册文件,插件的绝大部分功能都是以拓展所依赖的插件或者IDE提供的拓展点的方式完成自己自定义的功能。

拓展点详解戳我

plugins.xml基本配置:

<idea-plugin>
    <!--插件的ID,具有唯一性,不能和插件商店已有的id重复 -->
    <id>com.example.plugin-demo</id>
    <!--插件的名称 -->
    <name>Plugin-demo</name>

    <!-- A displayed Vendor name or Organization ID displayed on the Plugins Page. -->
    <vendor email="support@yourcompany.com" url="https://www.yourcompany.com">YourCompany</vendor>

    <!-- Description of the plugin displayed on the Plugin Page and IDE Plugin Manager.
         Simple HTML elements (text formatting, paragraphs, and lists) can be added inside of <![CDATA[ ]]> tag.
         Guidelines: https://plugins.jetbrains.com/docs/marketplace/plugin-overview-page.html#plugin-description -->
    <description><![CDATA[
    Enter short description for your plugin here.<br>
    <em>most HTML tags may be used</em>
  ]]></description>

    <!-- Product and plugin compatibility requirements.
         Read more: https://plugins.jetbrains.com/docs/intellij/plugin-compatibility.html -->
    <depends>com.intellij.modules.platform</depends>

    <!--本插件实现了的拓展点 -->
    <extensions defaultExtensionNs="com.intellij">

    </extensions>
</idea-plugin>

我的第一个Action

Action

Action官方指南

插件可以向IDE中添加工具栏(toolbar)、菜单(menu),也可以向已有的工具栏和菜单栏中添加Action。

创建Action

所有的Action都继承自AnAction类,并实现它的actionPerformed(AnActionEvent e)方法:

class MyAction :AnAction(){
    override fun actionPerformed(event: AnActionEvent) {
    }
}

注册Action

Action创建好后需要在plugin.xml中注册,可点击IDE的快速修复拉起Action注册向导:

image.png

image.png

参数说明

  • Action ID:任意字符串,必须保持唯一性\color{red}{必须保持唯一性}
  • Class Name:Action实现类的全限定名
  • Name:名称
  • Description:
  • Add to Group:此Action需要添加到哪个Action Group
  • Keyboard Shotcuts:绑定快捷键

点击OK后会在plugin.xml中生成如下代码

<idea-plugin>
    <actions>
        <action id="com.example.plugindemo.MyAction" class="com.example.plugindemo.MyAction" text="MyAction"
                description="My first action">
            <add-to-group group-id="FileMenu" anchor="first"/>
            <keyboard-shortcut keymap="$default" first-keystroke="ctrl L"/>
        </action>
    </actions>
</idea-plugin>

测试Action

运行gradle任务runIde

./gradlew runIde --stacktrace

我们在File菜单中就可以看到我们新加的Action

image.png

至此我们的第一个插件就运行成功了,即便我们点击MyAction没有任何反应。更多有关Action的内容请点击:

Action详解