🤖 自定义IDEA插件 → 划词翻译替换(下)

6,213 阅读7分钟

本文正在参加「金石计划」

在上节 《自定义IDEA插件 → 划词翻译替换(上)》 中,杰哥先是踩了个 JDK版本问题的大坑,借鉴网上教程 写了个简单Demo跑起来,最后 借助ChatGPT快速实现了划词翻译替换功能

写完就迫不及待想发这个插件给亲朋好友分 (zhuang)享(bi),但翻译用到的APPID和KEY都是写死我自己的。所以不太好Share,所以本节就来为这个插件开发一个 简单的设置页,让插件用户可以填写自己的翻译APPID和KEY。当然,顺带也讲下 插件的打包及发布

话不多说,直接开冲~


0x1、编写设置页UI

同样,直接问ChatGPT:

非常简单明了,直接CV这个 applicationConfigurable 标签的代码到 plugin.xml中:

直接报错,em...又开始瞎编了是吧 (也可能是版本问题),并没有找到这两个引用,configurableClass明显是指向设置Class的。试了下属性,implementation 可以,但是已经废弃,点开具体的类 ConfigurableEP,发现可以用 instance 代替:

新建一个 CpStringFormatConfig 类继承 com.intellij.openapi.options.Configurable 类:

createComponent() 这个方法会生成设置面板的UI,这里直接Copy了ChatGPT提供的代码示例,接着配置下plugin.xml:

执行runIde运行一波:

nice,在Settings页面可以看到我们的插件设置页了,接着完善下这个设置页,这里就 不手敲+脑补UI 了,毕竟awt的API我们也不熟,直接使用 Swing Designer 拖拉控件,自动生成:

定义表单UI为 → PluginSettingUI

左侧会生成两个文件 → .form文件及对应的.java文件

点击from文件开始界面设计:

从右侧拖拽组件到画板,然后按需调整组件属性就不用介绍了吧,这里杰哥简单拖拉出页面~

打开对应的java文件,可以看到 field name对应的就是控件实例,顺带写一个返回根Panel的方法:

回到我们的设置类 CpStringFormatConfig,实例化一个PluginSettingUI实例,然后重写 createComponent(),调用 getContentPanel() 返回布局:

运行看看效果:

nice!这里本来加了一个清空和保存的按钮,不过后面想想有些呆,直接在点击Apply或者OK时保存就完事了~


0x2、设置参数的读写

然后,我们需要一个东西来保存 设置页的配置参数,方法有很多,这里直接用最简单的方式 → 内置的 com.intellij.ide.util.PropertiesComponent,通过键值对的方式保存配置信息。接着就是读写参数的流程:

  • 打开设置页,读取参数,有的话自动填充
  • 点击Apply,保存参数

组件类 PluginSettingUI 加点代码,暴露读写appId和key的方法:

然后回到 CpStringFormatConfig 改下代码:

接着运行验证,可以发现设置的参数已经保存成功了。接着就是在需要用到翻译的Action读写appid和key了,直接改 TranslateUtil

编译运行后,尝试不填写appid和key,直接转换,弹窗如愿出现:

接着输入自己的appid和key,点击apply,如果这两个参数无误的话,插件就能正常工作啦~

接着就可以跟亲朋好友share啦~


0x3、插件打包

双击Gradle面板的 buildPlugin Task即可开始打包:

注意 plugin.xml 黄框部分的信息要完善下哦,不然会打包失败!!!

打包后会在根目录生成build文件夹,打包后的插件就在 \build\distributions 目录下,无依赖的插件是JAR包有依赖的插件是ZIP包

然后就可以在其它IDE里安装这个插件,比如我搞到我的AS里,依次:FileSettingsPlugins点小齿轮选择Install Plugin from Disk → 选中插件包:

然而,报错了:

我擦,到这一步你跟我说 写了大半天的插件 不能放到新的IDEA上???

裤子都TM脱了,放弃是不可能放弃的,然后看到了这篇文章 《IDEA 2021及以上版本Lombok插件无法安装的问题》,简单概括下解决流程:

  • 解压软件直接打开插件Zip包 → Jar包 (不是解压!!!)
  • 进入META-INF文件夹下,打开plugin.xml文件;
  • 找到:<idea-version> 标签,把 since-builduntil-build 改成自己的IDE版本。

比如我生成的插件包:

我的AS对应的IDEA版本:

改成:

<idea-version since-build="211" until-build="211.*"/>

然后保存,压缩软件一般会弹窗:

是,然后再次安装,TM就可以了:

当然,这是治标不治本的方法,我不可能每次打包完都自己手动改一遍吧?然后又发现了这篇文章:IntelliJ Plugin - 插件发布多版本兼容性,它给出的解决方法如下:

① plugin.xml 中 直接指定插件支持的最低和最高版本

<idea-plugin>
    <idea-version since-build="211" until-build="213.*" />
</idea-plugin>

build.gradleintellij dsl里将 updateSinceUntilBuild设置为false

intellij {
    version 'xx.x.x'
    updateSinceUntilBuild = false
}

再次编译会报错:

The CpStringFormat (id=cn.coderpig.CpStringFormat, path=~\IdeaProjects\CpStringFormat\build\idea-sandbox\plugins\CpStringFormat, version=1.0-SNAPSHOT) plugin is incompatible (reason: since build 211.0 > IC-202.8194.7, target build range is 211 to 213.*)

但是插件包却正常生成了,打开它的plugin.xml文件,可以看到设置生效了,而且插件包也能正常安装~

安装后打开Setting找到我们的插件,输入下百度翻译的appID和key,就能开心玩耍啦~


0x4、发布市场

打开 Marketplace,需要注册一个 Jetbrains账号,也可以用第三方账号授权登录 (如Google、Github等)。登陆完点击右上角的 Upload plugin 提交插件:

依次是:选择插件包选择License源码URL(因为我选的开源协议)标签

然后点击Upload即可上传至 Marketplace,然后会跳转插件详情页,可以在这里完善一些插件细节,图片描述啥的:

然后就是等系统审核了,一般在两个工作日内完成,审核完就可以在Marketplace中搜索到插件下载使用啦。

另外,Gradle还支持 直接将本地的插件发布到提交到插件存储库中,前提是手动提交过一次,因为需要 Token,审核通过后,在这里生成Token即可。

因为我的插件还没审核通过,没法演示,具体流程可以参考这篇文章:《Idea插件开发(二)——插件的创建打包及发布》,应该相差无几~


0x5、小结

本节先在原有插件的基础上添加了一个 设置页让用户可以填写自己的百度翻译appId和Key,接着执行 buildPlugin 打包插件,在安装到自己的AS时 遇到插件兼容的问题,通过调整配置,最终成功安装,并发布到 Marketplace 上。

开发这个插件的过程真的是一波N折啊,不过所幸还是搞出来了,当然现在还很简陋,但是 可订制啊!!!读者有什么字符串格式化的需求可以在评论区提,动手能力强的甚至可以自己上手改代码~

直接给出仓库地址:CpStringFormat,懒得折腾得的直接下插件包:CpStringFormat-0.0.1-SNAPSHOT.zip

最后安利一个不错的仓库:judasn/IntelliJ-IDEA-Tutorial,玩转IDEA插件必备啊,就酱~