集成环境拓展开发
约 4260 字大约 14 分钟
2025-09-07
1.平台概念
IntelliJ Platform, IntelliJ 平台 是 JetBrains 开发的一款 OSS, Open Source Software, 开源软件 平台,用于构建 IDE 和能够感知编程语言的开发者工具。IntelliJ IDEA、Android Studio、CUBA Studio、Cursive 等众多工具都在使用它。 它基于 Java 构建,提供了一种跨平台方式来为任何语言构建工具,无论语言是否以 JVM 为目标。 它在 Apache 2.0 许可证下提供,允许您创建免税版的商业和非商业产品,包括成熟的 IDE 和插件。
IntelliJ Platform 与 IntelliJ IDEA Community Edition 有许多重叠的部分,后者是 IntelliJ IDEA 的免费开源版本。两个项目的源代码均 托管在 GitHub 上。核心组件包括虚拟文件系统、文本编辑器、UI 框架、调试器和测试运行程序。平台还提供 API,用于构建对自定义语言和框架的支持,包括语法高亮显示、导航、代码补全、检查、意图、重构、调试器、测试运行程序、工具窗口、操作等,以及通用的词法分析器和解析器(可以快速理解为 IntelliJ IDEA Community Edition 是基于 IntelliJ Platform 上开发出来的实例产品)。
JetBrains 托管了一个插件 Marketplace,其中的任何插件都可以发布并安装到基于该平台构建的 IDE 中。开发者文档 中提供了与 IntelliJ 平台 有关的更多信息。
重要
补充:关于框架和平台的差别。
- Framework 框架
- 定义:一套代码库,帮你解决某一类问题,提供固定的调用方式
- 特点:
- 你写代码时 依赖框架(框架调用你的钩子,反转控制)
- 框架本身不一定能独立运行,它只是“帮你写应用”
- 示例:
Spring Framework、Qt Framework - 类比:像 房子的钢筋混凝土结构,你得在上面加东西(墙、门、窗)才能变成一个可用的建筑
- Platform 平台
- 定义:一个运行环境 + 框架集合,别人可以在它上面 运行应用、扩展功能
- 特点:
- 有自己的生命周期,可以单独运行
- 提供“二次开发接口”,允许别人扩展它
- 除了框架,还包含工具链、生态、市场
- 示例:
Android Platform、.NET Platform、IntelliJ Platform - 类比:像 一座已经建好的小区,不仅有房子骨架,还有道路、水电、商铺。你可以往里开店、装修、扩展
2.插件调研
本着“不要重复制作轮子”的开发理念,我们需要先通过 AI、搜索引擎、JetBrains Marketplace 来寻找是否有和自己想要开发的插件类似的插件,如果没有我们就可以开始进行下一步了。
3.资料收集
这里有一些重要的资料是需要您过目的:
4.快速开发
快速开发一款插件,并且发布他是让人获取动力的最快渠道,我们首先来快速开发一个可以使用的插件,后期再把我们的想法添加进去。这里提供两个文档供您参考:
4.1.所需技术
| 技能/概念 | 作用 |
|---|---|
Java/Kotlin/JVM | 编写插件核心逻辑 |
Gradle/Maven | 构建、依赖、发布 |
Swing | 构建 UI 界面 |
Java 并发 | 后台任务处理,保持 IDE 响应 |
IntelliJ 使用经验 | 理解插件挂载点和用户体验 |
4.2.明确类型
最常见的插件类型包括:
- Custom language support 自定义语言支持:自定义语言支持为处理特定编程语言提供基本功能,插件也可以增强现有的(捆绑的)自定义语言,例如通过提供额外的检查、意图或任何其他功能。
- Framework integration 框架集成:框架集成包括针对特定框架的改进代码洞察功能,以及直接从
IDE使用框架特定功能的选择。有时它还包括针对自定义语法或DSL的语言支持元素。 - Tool integration 工具集成:工具集成使得可以直接在
IDE中操作第三方工具和组件,无需切换上下文。 - User interface add-ons 用户界面插件:这一类插件会对
IDE的标准用户界面应用各种更改。一些新添加的组件是交互式的,提供新功能,而另一些则仅限于视觉修改。 - Themes 主题:主题为设计师提供了自定义内置
IDE界面元素外观的能力。
4.3.环境准备
需要查询自己 IDE 的环境版本,本文主要的开发环境是在 IDEA 中,这里以收费版的 IDEA 进行演示,版本号如下。
IntelliJ IDEA 2025.2.1 (Ultimate Edition)
Build #IU-252.25557.131, built on August 28, 2025
Source revision: ee1e6cb62e111
授权给 Stanley Boyle
订阅有效期至 2026年8月4日。
For educational use only.
Runtime version: 21.0.8+9-b1038.68 amd64 (JCEF 122.1.9)
VM: OpenJDK 64-Bit Server VM by JetBrains s.r.o.
Toolkit: sun.awt.X11.XToolkit
Linux 6.8.0-79-generic
Ubuntu 22.04.5 LTS; glibc: 2.35
GC: G1 Young Generation, G1 Concurrent GC, G1 Old Generation
Memory: 1960M
Cores: 16
Registry:
ide.experimental.ui=true
Non-Bundled Plugins:
JavaScriptDebugger (252.25557.178)
com.intellij.notebooks.core (252.25557.135)
com.github.wanniwa.EditorJumper (1.4.0)
cn.haojiyou.CodeGlance3 (2.1.1-2021.1.3)
com.github.izhangzhihao.intellijgooglesearch (0.0.2)
com.github.xepozz.gitattributes (2025.0.60)
Subversion (252.25557.175)
com.lilittlecat.plugin.intellij-pangu (1.2.3)
ru.adelf.idea.dotenv (252.23892.201)
com.github.catppuccin.jetbrains (3.4.2)
org.toml.lang (252.25557.135)
IdeaTwitter (1.0.2)
com.tfx.sudoku (1.07)
com.intellij.drools (252.23892.360)
com.leyongleshi.idea.plugin.pasteimageintomarkdown (1.6.3)
com.intellij.properties (252.25557.135)
com.intellij.velocity (252.25557.135)
Key Promoter X (2024.2.2)
ink.organics.pojo2json (2.1.2)
Code Iris (2.5.0-beta)
com.github.kisstkondoros.codemetrics (1.0.4)
gudqs7.github.io.getter-setter-postfix (1.1.6)
SequenceDiagram (4.0.5)
AceJump (3.8.22)
IdeaVIM (2.27.2)
org.jetbrains.IdeaVim-EasyMotion (1.16)
GrepConsole (13.3.0-IJ2023.3)
intellij.jupyter (252.25557.135)
com.bruce.intellijplugin.generatesetter (2.8.4)
vanstudio.sequence.java (4.0.5)
com.github.catppuccin.jetbrains_icons (1.12.0)
com.apifox.uploader (2.0.14-243)
JavaScript (252.25557.178)
com.alibabacloud.intellij.cosy (2.5.16)
com.nnthink.aixcoder (5.3.1-2024)
com.intellij.react (252.25557.178)
org.jetbrains.plugins.vue (252.25557.175)
zielu.gittoolbox (600.1.10+243)
io.github.godfather1103.alibaba.p3c (2.2-2024.3-2.1.1-ext-6)
org.jetbrains.security.package-checker (252.25557.135)
com.baomidou.plugin.idea.mybatisx (1.6.3)
cn.yiiguxing.plugin.translate (3.7.3)
Kotlin: 252.25557.131-IJ
Current Desktop: ubuntu:GNOME这里还需要根据 IDEA 的版本以及 官方文档 指引来安装两个插件:
4.4.新建项目
由于我需要支持较新版本的 IDEA 插件,应此这里我选择 jdk21 来创建插件项目,同时拉取项目依赖(这里的 jdk 其实有问题的...后面解决)。



重要
补充:如果需要更换依赖拉取的源,则可以考虑修改 build.gradle.kts 中的 repositories,注释中央仓库 mavenCentral,配置为阿里云地址。
repositories {
// mavenCentral()
maven {
url = uri("https://maven.aliyun.com/repository/public")
}
}然后我们需要先开始简单研究一下这个项目的主要目录结构。
~/git/edtechhub/work-diff-dev$ tree
.
├── src # 插件源代码
│ └── main
│ ├── kotlin
│ │ └── cn
│ │ └── com
│ │ └── edtechhub
│ │ └── workdiffdev
│ │ └── workdiffdev
│ └── resources
│ └── META-INF
│ ├── pluginIcon.svg
│ └── plugin.xml
├── gradle # Gradle 包装器
│ └── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── build # 最终的编译文件, 无需变动
│ └── tmp
│ └── generateManifest
├── build.gradle.kts # Gradle Kotlin DSL 构建脚本, 管理插件依赖、IDE 版本、Gradle 任务等
├── gradlew # Linux/macOS 下的 Gradle 启动脚本
├── gradlew.bat # Windows 下的 Gradle 启动脚本
├── gradle.properties # 项目级 Gradle 配置, 可以写插件版本、IDE 版本等
├── settings.gradle.kts # 项目设置文件, 一般声明项目名和多模块结构
└── work-diff-dev.iml # IntelliJ IDEA 项目文件, IDE 用来管理模块和依赖的
15 directories, 10 files4.5.修改配置
然后我们就需要做一些修改。
// Gradle 配置文件: https://plugins.jetbrains.com/docs/intellij/tools-gradle-intellij-plugin.html#ide-configuration
plugins {
id("java")
id("org.jetbrains.kotlin.jvm") version "2.1.0"
id("org.jetbrains.intellij.platform") version "2.7.1"
}
group = "cn.com.edtechhub.workdiffdev"
version = "1.0-SNAPSHOT"
repositories {
mavenCentral()
intellijPlatform {
defaultRepositories()
}
}
// Configure IntelliJ Platform Gradle Plugin
// Read more: https://plugins.jetbrains.com/docs/intellij/tools-intellij-platform-gradle-plugin.html
dependencies {
intellijPlatform {
create("IC", "2025.1.4.1")
testFramework(org.jetbrains.intellij.platform.gradle.TestFrameworkType.Platform)
// Add necessary plugin dependencies for compilation here, example:
// bundledPlugin("com.intellij.java")
}
}
intellijPlatform {
pluginConfiguration {
ideaVersion {
sinceBuild = "251"
}
changeNotes = """
Initial version
""".trimIndent()
}
}
tasks {
// Set the JVM compatibility versions
withType<JavaCompile> {
sourceCompatibility = "21"
targetCompatibility = "21"
}
}
kotlin {
compilerOptions {
jvmTarget.set(org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_21)
}
}<!-- Plugin 配置文件: https://plugins.jetbrains.com/docs/intellij/plugin-configuration-file.html#useful-resources -->
<!-- Plugin Configuration File. Read more: https://plugins.jetbrains.com/docs/intellij/plugin-configuration-file.html -->
<idea-plugin>
<!-- 插件唯一 ID -->
<!-- Plugin unique ID -->
<id>cn.com.edtechhub.workdiffdev.work-diff-dev</id>
<!-- 插件名称(大驼峰) -->
<!-- Public plugin name should be written in Title Case.
Guidelines: https://plugins.jetbrains.com/docs/marketplace/best-practices-for-listing.html#plugin-name -->
<name>Work-Diff-Dev</name>
<!-- 插件下载页面和作者相关信息 -->
<!-- A displayed Vendor name or Organization ID displayed on the Plugins Page. -->
<vendor email="llimou3434@gmail.com" url="https://github.com/limou3434/work-diff-dev">work-diff-dev</vendor>
<!-- 插件功能描述, 支持 HTML, 最好打大于 40 个字符 -->
<!-- Description of the plugin displayed on the Plugin Page and IDE Plugin Manager.
Guidelines: https://plugins.jetbrains.com/docs/marketplace/best-practices-for-listing.html#plugin-description -->
<description><![CDATA[
这是一个插件,用于辅助开发,如:
1. xxxxxxxxxxxxxxxxxxxxxxx
2. xxxxxxxxxxxxxxxxxxxxxxx
3. xxxxxxxxxxxxxxxxxxxxxxx
4. xxxxxxxxxxxxxxxxxxxxxxx
5. xxxxxxxxxxxxxxxxxxxxxxx
6. xxxxxxxxxxxxxxxxxxxxxxx
7. xxxxxxxxxxxxxxxxxxxxxxx
8. xxxxxxxxxxxxxxxxxxxxxxx
9. xxxxxxxxxxxxxxxxxxxxxxx
]]></description>
<!-- 插件相关平台, 插件依赖性质, 不过一般不需要使用 -->
<!-- Product and plugin compatibility requirements.
Read more: https://plugins.jetbrains.com/docs/intellij/plugin-compatibility.html -->
<depends>com.intellij.modules.platform</depends>
<!-- 插件拓展点 -->
<!-- Extension points defined by the plugin.
Read more: https://plugins.jetbrains.com/docs/intellij/plugin-extension-points.html -->
<extensions defaultExtensionNs="com.intellij">
</extensions>
</idea-plugin>而且,这里还建议把默认的 src/main/kotlin/ 重命名为 src/main/java/,以防止一些奇怪的报错。然后可以重启下项目,重启后编译运行一下。


4.6.添加活动
IDEA 中的 action 概念可以理解为任意一个动作,比如点击了某个按钮,就会执行它绑定的 Action 类的代码。使用 Plugin DevKit 就可以快速创建一个 Action,需要填写 actionId,类名,功能名称,功能描述,添加到目标位置。不过如果我们不修改为支持 IntelliJ Platform 的 sdk 将会出现各种问题(比如无法通过插件来自动建立 Action),原因是这个 sdk 是特别提供的。另外安装 IDEA 的时候就会自动携带,例如我使用 Toolbox 安装的 IDEA 就会有路径 /home/ljp/.local/share/JetBrains/Toolbox/apps/intellij-idea-ultimate。
重要
补充:插件开发不能直接污染你正在用的 IDEA,所以 DevKit 会自动创建一个“沙盒环境”。默认路径就是 ~/.cache/JetBrains/IntelliJIdea2025.2/plugins-sandbox/。以后你运行/调试插件时,它会启动一个 新的 IDEA 实例,并且只在这个沙盒里加载你的插件,不会影响你主力用的 IDEA。
重要
补充:当你把 IntelliJ IDEA 的安装目录作为 Plugin SDK 配置进来时,IDEA 其实做了两件事:
- 把
IntelliJ的API库(在lib/里)挂进SDK - 绑定
IDEA自带的JBR, JetBrains Runtime作为JDK
这个 JBR 就会在 SDK 视图里显示成一个 “内部 Java 平台 (Internal Java Platform)”。 它和你系统里单独安装的 OpenJDK | Oracle JDK 没区别,只是 JetBrains 官方维护的版本,针对 IDEA 做了一些优化。类似的选择一个 Java 版本就可以,这里我还是选择 21 的版本。


...不过我的版本可能太新了,就算是这么做也无法显示新建 Action,只能先自己手动建立试试看了。
<!-- src/main/resources/META-INF/plugin.xml: 插件配置文件 -->
<!-- Plugin Configuration File. Read more: https://plugins.jetbrains.com/docs/intellij/plugin-configuration-file.html -->
<idea-plugin>
<!-- 插件唯一 ID -->
<!-- Plugin unique ID -->
<id>cn.com.edtechhub.workdiffdev.work-diff-dev</id>
<!-- 插件名称(大驼峰) -->
<!-- Public plugin name should be written in Title Case.
Guidelines: https://plugins.jetbrains.com/docs/marketplace/best-practices-for-listing.html#plugin-name -->
<name>Work-Diff-Dev</name>
<!-- 插件下载页面和作者相关信息 -->
<!-- A displayed Vendor name or Organization ID displayed on the Plugins Page. -->
<vendor email="llimou3434@gmail.com" url="https://github.com/limou3434/work-diff-dev">work-diff-dev</vendor>
<!-- 插件功能描述, 支持 HTML, 最好打大于 40 个字符 -->
<!-- Description of the plugin displayed on the Plugin Page and IDE Plugin Manager.
Guidelines: https://plugins.jetbrains.com/docs/marketplace/best-practices-for-listing.html#plugin-description -->
<description><![CDATA[
这是一个插件,用于辅助开发,如:
1. xxxxxxxxxxxxxxxxxxxxxxx
2. xxxxxxxxxxxxxxxxxxxxxxx
3. xxxxxxxxxxxxxxxxxxxxxxx
4. xxxxxxxxxxxxxxxxxxxxxxx
5. xxxxxxxxxxxxxxxxxxxxxxx
6. xxxxxxxxxxxxxxxxxxxxxxx
7. xxxxxxxxxxxxxxxxxxxxxxx
8. xxxxxxxxxxxxxxxxxxxxxxx
9. xxxxxxxxxxxxxxxxxxxxxxx
]]></description>
<!-- 插件相关平台, 插件依赖性质, 不过一般不需要使用 -->
<!-- Product and plugin compatibility requirements.
Read more: https://plugins.jetbrains.com/docs/intellij/plugin-compatibility.html -->
<depends>com.intellij.modules.platform</depends>
<!-- 插件拓展点 -->
<!-- Extension points defined by the plugin.
Read more: https://plugins.jetbrains.com/docs/intellij/plugin-extension-points.html -->
<extensions defaultExtensionNs="com.intellij">
</extensions>
<!-- 插件 Actions -->
<actions>
<action id="TestAction"
class="cn.com.edtechhub.workdiffdev.TestAction"
text="Test Action"
description="A test action"
>
<add-to-group group-id="ToolsMenu" anchor="first"/>
</action>
</actions>
</idea-plugin>// src/main/java/cn/com/edtechhub/workdiffdev/TestAction.java: 插件 Action 类
package cn.com.edtechhub.workdiffdev;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
import org.jetbrains.annotations.NotNull;
public class TestAction extends AnAction {
@Override
public void actionPerformed(@NotNull AnActionEvent e) {
System.out.println("TestAction");
}
}然后直接使用 Gradle 运行,就会自动创建一个 IDEA 沙盒实例,然后尝试点击,虽然有些报错,但是确实是成功了,有打印出插件的输出。


重要
补充:可以稍微解决一下一些 error。
避免出现
Caused by: java.lang.Throwable: JreHiDpiUtil is first initialized here的渲染问题。# gradle.properties # Opt-out flag for bundling Kotlin standard library -> https://jb.gg/intellij-platform-kotlin-stdlib kotlin.stdlib.default.dependency=false # Enable Gradle Configuration Cache -> https://docs.gradle.org/current/userguide/configuration_cache.html org.gradle.configuration-cache=true # Enable Gradle Build Cache -> https://docs.gradle.org/current/userguide/build_cache.html org.gradle.caching=true # not Caused by: java.lang.Throwable: JreHiDpiUtil is first initialized here org.gradle.java.home=/home/ljp/.jdks/jbr-21.0.8解决中文乱码的问题。
// build.gradle.kts plugins { id("java") id("org.jetbrains.kotlin.jvm") version "2.1.0" id("org.jetbrains.intellij.platform") version "2.7.1" } group = "cn.com.edtechhub.workdiffdev" version = "1.0-SNAPSHOT" repositories { mavenCentral() intellijPlatform { defaultRepositories() } } // Configure IntelliJ Platform Gradle Plugin // Read more: https://plugins.jetbrains.com/docs/intellij/tools-intellij-platform-gradle-plugin.html dependencies { intellijPlatform { create("IC", "2025.1.4.1") testFramework(org.jetbrains.intellij.platform.gradle.TestFrameworkType.Platform) // Add necessary plugin dependencies for compilation here, example: // bundledPlugin("com.intellij.java") } } intellijPlatform { pluginConfiguration { ideaVersion { sinceBuild = "251" } changeNotes = """ Initial version """.trimIndent() } } tasks { // Set the JVM compatibility versions withType<JavaCompile> { sourceCompatibility = "21" targetCompatibility = "21" options.encoding = "UTF-8" // 解决编译时中文报错 } // 解决运行时控制台中文乱码 withType<JavaExec> { jvmArgs = listOf("-Dfile.encoding=UTF-8", "-Dsun.stdout.encoding=UTF-8", "-Dsun.stderr.encoding=UTF-8") } } kotlin { compilerOptions { jvmTarget.set(org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_21) } }使用
git config --global --add safe.directory /标记Git安全目录以避免警告。
4.7.定位位置
需要将 Action 插入到主菜单栏中的 Tools 菜单,但是要如何定位呢,我是如何知道使用什么 group-id 的呢?这就只要使用我们之前说的内部工具,UI 检查器了。开启内部模式之后,按 [ctrl+alt+鼠标左键] 点击 UI,就能显示当前 UI 的详细信息。找到他的 Group Id 然后创建 Action 时搜索选择就好了(没插件就只能手动写了)。

重要
补充:不过我的版本是默认把 UI 定位打开的,如果您没有可以手动打开。

# custom IntelliJ IDEA properties (expand/override 'bin/idea.properties')
idea.is.internal=true4.8.快捷启动
asdasdasdasd点击有些时候还是不方便,最好来点快捷键。
<!-- src/main/resources/META-INF/plugin.xml: 插件配置文件 -->
<!-- Plugin Configuration File. Read more: https://plugins.jetbrains.com/docs/intellij/plugin-configuration-file.html -->
<idea-plugin>
<!-- 插件唯一 ID -->
<!-- Plugin unique ID -->
<id>cn.com.edtechhub.workdiffdev.work-diff-dev</id>
<!-- 插件名称(大驼峰) -->
<!-- Public plugin name should be written in Title Case.
Guidelines: https://plugins.jetbrains.com/docs/marketplace/best-practices-for-listing.html#plugin-name -->
<name>Work-Diff-Dev</name>
<!-- 插件下载页面和作者相关信息 -->
<!-- A displayed Vendor name or Organization ID displayed on the Plugins Page. -->
<vendor email="llimou3434@gmail.com" url="https://github.com/limou3434/work-diff-dev">work-diff-dev</vendor>
<!-- 插件功能描述, 支持 HTML, 最好打大于 40 个字符 -->
<!-- Description of the plugin displayed on the Plugin Page and IDE Plugin Manager.
Guidelines: https://plugins.jetbrains.com/docs/marketplace/best-practices-for-listing.html#plugin-description -->
<description><![CDATA[
这是一个插件,用于辅助开发,如:
1. xxxxxxxxxxxxxxxxxxxxxxx
2. xxxxxxxxxxxxxxxxxxxxxxx
3. xxxxxxxxxxxxxxxxxxxxxxx
4. xxxxxxxxxxxxxxxxxxxxxxx
5. xxxxxxxxxxxxxxxxxxxxxxx
6. xxxxxxxxxxxxxxxxxxxxxxx
7. xxxxxxxxxxxxxxxxxxxxxxx
8. xxxxxxxxxxxxxxxxxxxxxxx
9. xxxxxxxxxxxxxxxxxxxxxxx
]]></description>
<!-- 插件相关平台, 插件依赖性质, 不过一般不需要使用 -->
<!-- Product and plugin compatibility requirements.
Read more: https://plugins.jetbrains.com/docs/intellij/plugin-compatibility.html -->
<depends>com.intellij.modules.platform</depends>
<!-- 插件拓展点 -->
<!-- Extension points defined by the plugin.
Read more: https://plugins.jetbrains.com/docs/intellij/plugin-extension-points.html -->
<extensions defaultExtensionNs="com.intellij">
</extensions>
<!-- 插件 Actions -->
<actions>
<action id="TestAction"
class="cn.com.edtechhub.workdiffdev.TestAction"
text="Test Action"
description="A test action"
>
<!-- 添加的位置 -->
<add-to-group group-id="ToolsMenu" anchor="first"/> <!-- group-id 是从 UI 选择器中得出的 -->
</action>
</actions>
<!-- 插件监听器 -->
<applicationListeners>
<listener class="cn.com.edtechhub.workdiffdev.TestListener" topic="com.intellij.openapi.application.ApplicationActivationListener"/>
</applicationListeners>
</idea-plugin>// src/main/java/cn/com/edtechhub/workdiffdev/TestListener.java: 监听器
package cn.com.edtechhub.workdiffdev;
import com.intellij.openapi.application.ApplicationActivationListener;
import com.intellij.openapi.wm.IdeFrame;
import org.jetbrains.annotations.NotNull;
import java.awt.*;
import java.awt.event.KeyEvent;
public class TestListener implements ApplicationActivationListener {
private final KeyEventDispatcher dispatcher = new MyKeyEventDispatcher();
@Override
public void applicationActivated(@NotNull IdeFrame ideFrame) {
KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(dispatcher);
}
@Override
public void applicationDeactivated(@NotNull IdeFrame ideFrame) {
KeyboardFocusManager.getCurrentKeyboardFocusManager().removeKeyEventDispatcher(dispatcher);
}
private static class MyKeyEventDispatcher implements KeyEventDispatcher {
private boolean altPressed = false;
private boolean shiftPressed = false;
@Override
public boolean dispatchKeyEvent(KeyEvent e) {
switch (e.getID()) {
case KeyEvent.KEY_PRESSED -> {
if (e.getKeyCode() == KeyEvent.VK_ALT) altPressed = true;
if (e.getKeyCode() == KeyEvent.VK_SHIFT) shiftPressed = true;
// 检查组合键 Alt+Shift+H
if (altPressed && shiftPressed && e.getKeyCode() == KeyEvent.VK_H) {
System.out.println("Alt+Shift+H 被触发了!");
return true; // 阻止事件继续传递
}
}
case KeyEvent.KEY_RELEASED -> {
if (e.getKeyCode() == KeyEvent.VK_CONTROL) altPressed = false;
if (e.getKeyCode() == KeyEvent.VK_SHIFT) shiftPressed = false;
}
}
return false;
}
}
}4.9.打包插件
通过 Gradle 的 task 打包插件来构建 jar 包,最终会输出到 build/libs 下。


5.本地安装
可以使用本地的 IDEA 来进行本地安装进行试验。



6.业务逻辑
不过由于我们还没有写出非常好的插件来,应此暂时还不太容易发布给别人使用,因此我将带您完成一个完整的插件开发。这里梳理一下我的插件需求:
- 我需要一款插件支持对比代码,优化开发
- 用户可以选中一段代码区域,启用插件后将代码复制到弹窗中工作区的两个编辑区,左侧只读,右侧修改
- 插件为弹窗工作区提供两个按钮“应用到左侧”和“保存到原文”
- “应用到左侧”可以把用户在右边编辑好的代码复制到左侧
- “保存到原文”可以把用户在左侧中只读的代码保存到原文
- 保存后修改的代码可以替换掉用户
7.版本兼容
待补充...
8.发布插件
进入
Jetbrains插件开发平台:https://plugins.jetbrains.com/developers/intellij-platform点击登录,或者注册账号

- 点击
Upload Plugin上传插件,上传插件jar包,填写相关信息,点击upload Plugin

- 上传成功,等待审核

9.拓展加强
这里还有很多值的探究的要点,待补充...