2024最新IDEA插件开发+发布全流程 SelectCamelWords[选中驼峰单词](idea源代码)

2024最新IDEA插件开发(发布)-SelectCamelWords[选中驼峰单词](idea源代码)

参考文档

视频教程地址

背景介绍

  • 痛点:在idea开发过程中,希望按需驼峰选中文本。
  • 现在默认是一整个单词选中,只有在设置–>智能按键 中开启了使用"CamelHumps单词"时能够驼峰选中。但是这种情况比较粗暴,直接全局开启了。但是在日常开发中,其实选中大部分是整个单词一起选中。只有少部分情况是按照驼峰选中。

image.png

  • 所以就需要一块插件,能够快捷开关驼峰选中的能力,仅在需要的时候开启。

安装Plugin DevKit插件

  • Idea 2023.3 以下版本可以不用安装当前插件。idea自带。2023.3版本及之后的版本没有当前查询,需要自己安装。

image.png

  • 插件商店搜索Plugin DevKit用于安装插件,安装完成之后建议先重启一下,不然可能开发工具可能出不来。

image.png

开启IDEA内部模式(使用UI检查器定位代码)

  • 主菜单栏–>帮助(Help)–>编辑自定义属性

image.png

新建插件项目

  • 新建项目选择Idea插件(如果没有Plugin DevKit插件,这里就没有当前选项)。

image.png

image.png

修改Gradle相关配置

取消gradle构建

  • 先取消默认的gradle构建。先修改一些配置在重新构建。

修改依赖远程仓库地址

  • 修改build.gradle.kts中的repositories,注释中央仓库(mavenCentral)。配置阿里云地址。
repositories {
    //    mavenCentral()
    maven {
        url = uri("https://maven.aliyun.com/repository/public")
    }
}
  • 如果文件名不是kts结尾,而是gradle结尾,配置可能有些区别。

修改使用本地Idea调试

intellij {
    localPath.set("D:\\Program Files\\JetBrains\\IntelliJ IDEA 2024.1.2")
    //    version.set("2023.2.6")
    //    type.set("IC") // Target IDE Platform

    plugins.set(listOf(/* Plugin Dependencies */))
}

image.png

重新加载Gradle变更

  • 点击Gradle图标重新加载变更。

image.png

  • 等待构建完成,初次可能比较慢,需要下载依赖等。构建完成之后,文件也就有高亮显示了。

image.png

其他build.gradle相关配置说明

plugin.xml解读

image.png

  • 构建完成之后,它会报错,是因为不能使用默认的模版字符。我们改掉就可以了。

image.png

防止报错

  • kotlin目录名修改为java。选中kotlin目录,按shift+f6修改目录名为java。不修改后面可能会报错。

image.png

创建Action

  • idea中的action概念可以理解为idea中的任意一个动作,点击了某个按钮,就会执行它绑定的Action类的代码。
  • 使用Plugin DevKit 创建一个Action。

image.png

  • 填写actionId,类名,功能名称,功能描述,添加到目标位置。

image.png

  • 创建成功之后就会生成一个Action类和在plugin中注册一个action,表说明他的位置。

image.png

运行插件

  • 点击gradle运行idea插件,它会重新启动一个idea环境,来运行idea插件。

image.png

  • 第一次运行可能较慢,需要等待一会儿。运行成功之后,在工具栏中显示了我们的插件Action。

image.png

  • 点击插件Action,后台也打印了相应的结果。

image.png

找不到你的插件注册的Action,并且控制台报错ClassNotFoundException?

  • 需要将上面说的kotlin目录修改为java。

控制台中文乱码,报错?

  • 修改build.gradle.kts,解决编译中文报错和控制台中文乱码问题。
tasks {
    // Set the JVM compatibility versions
    withType<JavaCompile> {
        sourceCompatibility = "17"
        targetCompatibility = "17"
        // 解决编译时中文报错
        options.encoding = "UTF-8"
    }

    // 添加以下内容,解决运行时控制台中文乱码
    withType<JavaExec> {
        jvmArgs = listOf("-Dfile.encoding=UTF-8", "-Dsun.stdout.encoding=UTF-8", "-Dsun.stderr.encoding=UTF-8")
    }
    ...
}

image.png

定位Action插入位置

  • 我是需要将Action插入到主菜单栏中的Tools菜单,要如何定位呢。这就只要使用我们之前说的内部工具,ui检查器了。
  • 开启内部模式之后,按ctrl+alt+鼠标左键点击ui,就能显示当前ui的详细信息。找到他的Group Id然后创建action时搜索选择就好了。

image.png

定位Idea相关代码

  • 在前面提到,idea设置中的智能按键有提供全局的驼峰选中能力,开启之后的就能够实现驼峰选中了。
  • 我们插件的逻辑也很简单,就是在编辑器中能够快捷开启这个开关。
  • 那我们要如何实现快捷开关呢,其实也很简单,我们只需要去看idea是怎么实现的就好了。

使用ui检查器定位智能按键逻辑

  • 在设置中使用ui检查器定位智能按键的配置类。

image.png

  • 打开idea源代码,搜索类EditorSmartKeysConfigurable

image.png

  • 然后搜索关键字camel,定位到配置,可以看到当前配置项有一个获取配置的方法,和更新配置的方法。然后查看这个editorSettings的来源。可以看到editorSettings的数据源是EditorSettingsExternalizable.getInstance()

image.png

  • 那这样就可以在我的项目中使用当前类的方法去设置快捷开关了。

编写插件逻辑(驼峰选中快捷开关)

  • 在我们的Action中获取到刚刚的编辑器设置,然后对配置项CamelWords的状态取反就可以了。
public class SelectCamelWordsAction extends AnAction {

    @Override
    public void actionPerformed(AnActionEvent e) {
        // 获取到编辑器设置
        EditorSettingsExternalizable editorSettingsExternalizable = EditorSettingsExternalizable.getInstance();
        // 对之前的状态取反
        editorSettingsExternalizable.setCamelWords(!editorSettingsExternalizable.isCamelWords());
    }
}
  • 运行插件,通过ToolMenu中的SelectCamelWords就能够快捷开启关闭驼峰选中的功能。
  • 但是这还是很麻烦啊,不能够快捷启动。接下来就要使用监听器来监听按键实现对应的快捷启动。

使用监听器监听键盘按键

<applicationListeners>
  <listener class="com.maple.plugindemo.MyKeyListener" topic="com.intellij.openapi.application.ApplicationActivationListener"/>
</applicationListeners>
  • 添加我们的自定义分发器
public class MyKeyListener 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 {
        // 分发器逻辑
    }
}
  • 在自定义的事件分发器中监听shift+ctrl+win按下,开启驼峰选中。win键抬起,关闭驼峰选中。
private static class MyKeyEventDispatcher implements KeyEventDispatcher {
    private boolean shiftPressed = false;
    private boolean ctrlPressed = false;
    private boolean winPressed = false;

    private final EditorSettingsExternalizable editorSettingsExternalizable = EditorSettingsExternalizable.getInstance();

    @Override
    public boolean dispatchKeyEvent(KeyEvent e) {
        int keyCode = e.getKeyCode();
        int id = e.getID();

        if (id == KeyEvent.KEY_PRESSED) {
            switch (keyCode) {
                case KeyEvent.VK_SHIFT:
                    shiftPressed = true;
                    break;
                case KeyEvent.VK_CONTROL:
                    ctrlPressed = true;
                    break;
                case KeyEvent.VK_WINDOWS:
                    winPressed = true;
                    break;
            }

            if (shiftPressed && ctrlPressed && winPressed) {
                // 开启驼峰选中
                System.out.println("Shift + Ctrl + Win 按下!");
                editorSettingsExternalizable.setCamelWords(true);
            }
        } else if (id == KeyEvent.KEY_RELEASED) {
            switch (keyCode) {
                case KeyEvent.VK_WINDOWS:
                    if (shiftPressed && ctrlPressed) {
                        // 关闭驼峰选中
                        System.out.println("Win 键抬起!");
                        editorSettingsExternalizable.setCamelWords(false);
                    }
                    winPressed = false;
                    break;
                case KeyEvent.VK_SHIFT:
                    shiftPressed = false;
                    break;
                case KeyEvent.VK_CONTROL:
                    ctrlPressed = false;
                    break;
            }
        }
        return false; // 继续分发事件
    }
}
  • 至此,插件逻辑就已经大功告成了。由于我没有mac,不清楚mac的快捷键,就没有适配mac快捷键。大家也可以去我的仓库提交pr。

打包插件

  • 通过gradle的task打包插件。构建jar包,最终会输出到build–>libs下

image.png

本地安装验证

  • 打开插件仓库,选择本地安装,找到打包之后的jar

image.png

  • 安装成功,确认,然后测试插件

image.png

发布插件

image.png

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

image.png

  • 上传成功,等待审核。

image.png

兼容不同的idea版本

patchPluginXml {
    // 最低版本
    sinceBuild.set("232")
    // 最高版本
    untilBuild.set("242.*")
}
<idea-version since-build="232" until-build="242.*"/>
  • 要做到多版本兼容,就是要将最低版本设置的尽可能的小,但是同时需要你设置的版本有你插件当前使用的api。例如applicationListeners就在193.0之后发布,我的最低版本就只能设置193.0。最大版本不设置。

image.png

  • 发布前jetbrains会校验当前插件的兼容性,我这边就是校验通过,显示可以使用的版本。

image.png

后记

  • 插件比较简单,主要是解决开发中的痛点,然后监听按键按下和释放的逻辑是直接让ai写的,可能有一些小bug。
  • 然后mac端我不太清楚选中的快捷键是什么,也就没有做兼容。
  • 感兴趣的话,可以点个在github 点个star。欢迎大家把项目拉下来,然后提交pr。
  • 10
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
idea插件开发中的代码分析是指对插件代码进行静态分析和动态分析,以了解代码的结构、功能和性能等方面的信息。 在idea插件开发中,可以使用一些工具和技术来进行代码分析。其中,静态分析可以通过IDEA提供的代码检查功能、Lint工具、代码审查等方式进行。这些工具可以帮助开发者找出潜在的代码问题、优化代码结构和性能。 另外,动态分析可以使用调试工具来实时跟踪代码的执行过程,了解代码在运行时的行为和状态。通过设置断点、监视变量值、查看函数调用栈等操作,开发者可以深入分析代码的执行流程,检测潜在的问题和性能瓶颈。 对于idea插件开发中的代码分析,可以按照以下步骤进行: 1. 使用IDEA提供的代码检查功能和Lint工具,识别和修复代码中的潜在问题,例如未使用的变量、未处理的异常等。这可以帮助提高代码的质量和可读性。 2. 使用调试工具来跟踪代码的执行流程,了解代码的运行情况。通过设置断点,可以在特定位置停止代码的执行,观察变量的值和函数的调用情况,以便发现问题和进行性能优化。 3. 使用一些性能分析工具来检测代码的性能瓶颈,例如内存泄漏、CPU占用过高等。这些工具可以帮助开发者找到影响插件性能的问题,并进行相应的优化措施。 总结起来,idea插件开发中的代码分析是一个关键的环节,通过静态分析和动态分析可以帮助开发者找出代码中的问题和潜在的性能瓶颈,从而提高插件的质量和性能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [IDEA插件开发之环境搭建过程图文详解](https://download.csdn.net/download/weixin_38740201/12725614)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [【idea插件开发】从0入门idea插件开发idea插件开发教程,如何开发idea插件](https://blog.csdn.net/smile_795/article/details/125470136)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值