idea plugin开发

· 2 min read

工作日每天早上我们都会进行CodeReview,大致的流程是一群人看着一块屏幕,分别打开每个项目,看每次的commit,发现有问题的代码,就记录下来行号,文件名,所在项目,问题点等,但记录的过程却是很浪费时间的,也容易错。每次因为要记录,其实也造成了CodeReview的效率低。关于改良CodeReview的的效率,我们也是经过了一系列的努力的。

一开始,是一个人操作IDE浏览代码,一个人去记录,但是记录的人因为要跟上速度,就不免出现记录不完整,比如代码所谓位置及问题点 后来,我们使用IDE的bookmark,进行打标记,但是这种的问题是不支持跨项目,每个项目的都是独立的,另外也无法导出。我们的产出一般是记录在Confluence上。

如上,每次的记录跟进的很差,并且浪费时间。于是,我想,何不开发个Bookmark的增强版呢,吐槽那些不支持的功能,我来!

可行性

假如要做,那么就要考虑可行性,梳理下当前我所需要的功能点

  1. 记录目标行号,项目名称,文件路径
  2. 应用级【多项目】共享
  3. 重启IDE也要起作用,与2点接近,实际上就是持久化存储
  4. 设定系统剪切板
  5. 快捷键绑定支持

SDK及第三方资料调研

查看了官方资料及相对成熟的插件项目,对于文件系统,系统剪贴板,持久化存储,快捷键绑定等都有支持,断定可以做。

这里吐槽国内的博客文章的2个特点,1是疯狂转发原创缺失,转发就得了,大哥能贴下原来的链接吗,并且图片也搞下啊,有些排版都乱了,2是内容干货少,其实好的文章不见得字数多,但捡重点,讲明白。哎,吾辈继续努力吧。

初始化环境

IDEA对于插件开发支持是相当不错的,没办法,自家平台嘛,点击new project

点击next,完成

项目结构

初始化项目,基本没什么东西,我这里就贴下我的项目结构了。

├── README.md
├── bookmarker4idea.iml
├── out
├── resources
│   └── META-INF
│       └── plugin.xml // 配置文件
└── src  //源代码
    ├── cn
    │   └── alanhe
    │       ├── BookMarkX.java
    │       ├── BookMarkXPersistentStateComponent.java
    │       ├── BookmarkXItemState.java
    │       └── CopyBookMarkX.java
    ├── icon
    │   └── bookmarker.png // 图标等静态资源
    └── test // 测试

plugin.xml

其实开发主要就两部分,Java和xml,我们定义菜单,图标,事件和持久化存储都需要在这里进行配置 这里贴出我的插件部分配置

<idea-plugin>
    <id>cn.alanhe.plugin.bookmarkx4idea</id>
    <name>bookmarkx4idea</name>
    <version>1.0</version>
    <vendor email="i@alanhe.me" url="https://github.com/alanhe421/bookmarkex4idea">personal</vendor>

    <!-- please see http://www.jetbrains.org/intellij/sdk/docs/basics/getting_started/build_number_ranges.html for description -->
    <idea-version since-build="173.0"/>

    <!-- please see http://www.jetbrains.org/intellij/sdk/docs/basics/getting_started/plugin_compatibility.html
         on how to target different products -->
    <!--     uncomment to enable plugin in all products-->
    <depends>com.intellij.modules.lang</depends>

    <extensions defaultExtensionNs="com.intellij">
        <applicationService serviceImplementation="cn.alanhe.BookMarkXPersistentStateComponent"/>
    </extensions>

    <actions>
        <!-- Add your actions here -->
        <action id="bookmark" class="cn.alanhe.BookMarkX" text="toggle BookMarkx" description="bookmark">
            <add-to-group group-id="Bookmarks"/>
            <keyboard-shortcut keymap="$default" first-keystroke="ctrl alt B"/>
        </action>
        <action id="ExportBookMark" class="cn.alanhe.CopyBookMarkX" text="Copy BookMark to Clipboard"
                icon="/icon/bookmarker.png"
                description="Copy BookMark to Clipboard">
            <add-to-group group-id="EditorPopupMenu" anchor="first"/>
        </action>
    </actions>
</idea-plugin>

相关文档