idea 欢迎屏幕最近的项目开始组 扩展

本文最后更新于:2023-05-31 20:58 星期三

idea 欢迎界面项目列表右键打开终端

效果、仓库

插件安装包

效果

插件说明

很简单的一小功能,仅仅是增加一个打开终端的功能而已,可在获取项目路径上走了很多坑,查阅了很多资料。在idea2023.1版本之前,至少2022.4获取Project对象仅仅需要RecentProjectsWelcomeScreenActionBase类或 AnActionEvent类的getData方法加上几个字段(CommonDataKeys, PlatformDataKeys, LangDataKeys类常量)即可获取。在2023版本只能获取到null

1
2
3
 public @Nullable <T> T getData(@NotNull DataKey<T> key) {
return getDataContext().getData(key);
}

查阅了官方文档、Google、百度等信息,均无法解决获取Project对象的存储路径信息。在2023.1版本扩展组WelcomeScreenRecentProjectActionGroup的RecentProjectsWelcomeScreenActionBase等项目的代码均用kotlin重写,也边学边用kotlin进行扩展,最终因技术有限也未能找到获取Project相关信息的方法。

突然想到kotlin和Java是可以互相调用的,于是有了如下的代码。相当的简陋,仅仅满足自己的需求。今后会不会完善并发布到插件平台待定。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
//            // 参考: 复制路径的Class
// Class<?> copyProjectPath = Class.forName ("com.intellij.openapi.wm.impl.welcomeScreen.projectActions.CopyProjectPathAction");
// Object object = copyProjectPath.getDeclaredConstructor ().newInstance ();
// System.out.println (object.getClass ().getName ());
// //获取 父类
// Class<?> superclass = copyProjectPath.getSuperclass ();
// //获取 父类:内部类
// Class<?>[] declaredClasses = superclass.getDeclaredClasses ();
// for (Class<?> declaredClass : declaredClasses) {
// System.out.println ("父类---内部类:" + declaredClass.getName ());
// }

//获取可以获取 project 的内部类
Class<?> RecentProjectsWelcomeScreenActionBase$Companion = Class.forName ("com.intellij.openapi.wm.impl.welcomeScreen.projectActions.RecentProjectsWelcomeScreenActionBase$Companion");
//构造器
Constructor<?> CompanionConstructor = RecentProjectsWelcomeScreenActionBase$Companion.getDeclaredConstructor ();
//修改访问权限 private==》public
CompanionConstructor.setAccessible (true);
//new
Object companion = CompanionConstructor.newInstance ();

// //遍历内部类方法
// Method[] companionMethods = RecentProjectsWelcomeScreenActionBase$Companion.getDeclaredMethods ();
// // 内部类 方法|类型
// for (Method method : companionMethods) {
// String typeClassName = "";
// Class<?>[] parameterTypes = method.getParameterTypes ();
// for (Class<?> parameterType : parameterTypes) {
// typeClassName += parameterType.getName ();
// }
// System.out.println ("获取内部类--- 方法名|类型:" + method.getName () + " | " + ("".equals (typeClassName) ? "无参" : typeClassName));
// }

//获取可以获取 project 的内部类--- 具体方法
Method getSelectedItem$intellijPlatformIdeImpl = RecentProjectsWelcomeScreenActionBase$Companion.getMethod ("getSelectedItem$intellij_platform_ide_impl", AnActionEvent.class);

// 获取 RecentProjectItem (koltin 对象),继续用反射获取想用的参数
Object invoke = getSelectedItem$intellijPlatformIdeImpl.invoke (companion, e);
// 获取项目本地路径方法
Method getProjectPath = invoke.getClass ().getMethod ("getProjectPath");
// 获取路径
String projectPath = String.valueOf (getProjectPath.invoke (invoke));
// System.out.println ("路径:" + projectPath);

//<editor-fold desc="执行Mac命令">
ProcessBuilder executeCommand = new ProcessBuilder ("open", "-a", "/Applications/iTerm.app", projectPath);
executeCommand.start ();
//</editor-fold>
1
2
3
4
5
6
7
com.intellij.openapi.wm.impl.welcomeScreen.projectActions.CopyProjectPathAction
父类---内部类:com.intellij.openapi.wm.impl.welcomeScreen.projectActions.RecentProjectsWelcomeScreenActionBase$Companion
获取内部类--- 方法名|类型:getRECENT_PROJECT_TREE_KEY$intellij_platform_ide_impl | 无参
获取内部类--- 方法名|类型:getTree | com.intellij.openapi.actionSystem.AnActionEvent
获取内部类--- 方法名|类型:getSelectedItem$intellij_platform_ide_impl | com.intellij.openapi.actionSystem.AnActionEvent
获取内部类--- 方法名|类型:getRECENT_PROJECT_SELECTED_ITEM_KEY$intellij_platform_ide_impl | 无参
路径:/Users/******/Desktop/Temp/未命名文件夹

插件项目结构

使用idea自带Plugin DevKit 创建项目,默认Gradle 不是Groovy有些可惜。

plugin.xml 、build.gradle 文件比较重要。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
├── README.md
├── build.gradle.kts
├── gradle
│   └── wrapper
│   ├── gradle-wrapper.jar
│   └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── gradlew.bat
├── settings.gradle.kts
└── src
└── main
├── java
├── kotlin
└── resources
└── META-INF
├── plugin.xml #插件配置文件
└── pluginIcon.svg #插件图标

增加扩展点

新增扩展点
添加锚点

idea 欢迎屏幕最近的项目开始组 扩展
https://blog.dekun.wang/blog/a428dd75.html
作者
Wang Dekun
发布于
2023-04-25 19:57 星期二
更新于
2023-06-01 22:41 星期四
许可协议