自己动手,丰衣足食:从零开始写个 IDEA 插件,要啥功能就做啥!
点击上方蓝色“程序猿DD”,选择“设为星标”
回复“资源”获取独家整理的学习资料!
作者 | 木杉的博客
来源 | http://imushan.com
写Java代码的时候,经常会涉及到重复性的操作,这个时候就会想要是有这样一个插件就好了,如果是大家都会遇到的场景,IDE或许已经提供了,再不然也有可能有人编写了相关的插件。
要是这个操作是你们的编码环境特有的,那就只能自己写工具了。所以这里来学学如何编写IDEA插件,让自己的编程环境更加强大,更好的进行装逼。
开发环境
开发IDEA插件有以下这些依赖:
IntelliJ IDEA Community Edition
IntelliJ IDEA Community Edition 源码
Plugin DevKit 插件
IntelliJ Platform SDK
安装IntelliJ IDEA Community Edition
你可能已经安装了Ultimate版本,但是你还是需要安装[IDEA][]的社区版本。因为商业版是闭源的,所以在调试时无法调试核心代码。
下载IntelliJ IDEA Community Edition源码
社区版的安装包里是不包含源码的,所以我们需要手动从github上clone一份:
git clone --depth 1 git://git.jetbrains.org/idea/community.git idea
关于从源码运行IDEA的方法参考 Check Out And Build Community Edition:
http://www.jetbrains.org/intellij/sdk/docs/basics/checkout_and_build_community.html
添加IDEA jdk
虽然不知道原因,但是根据Check Out And Build Community Edition:
http://www.jetbrains.org/intellij/sdk/docs/basics/checkout_and_build_community.html
我们需要建立一个 IDEA jdk
来运行插件:
除非你在Mac上使用官方JDK,否则你需要手动添加 /lib/tools.jar
到classpath中。关注微信公众号:匠心零度,在后台回复:idea,可以获取我整最新 IDEA 教程,都是干货。
配置IntelliJ Platform SDK
打开 File|ProjectStructure
新建一个 IntelliJPlatformSDK
:
Java SDK选择我们刚刚建立的 IDEA jdk
:
然后我们可以把下载的IDEA社区版源码添加到源码路径中,这样在调试时,就可以调试IDEA自身的代码了:
第一个插件
我们来编写一个最简单的插件来学习编写一个插件的完整步骤。
新建工程
选择 IntellJPlatformPlugin
,然后Project SDK指定刚刚新建的plugin sdk:
新建的插件项目:
插件根目录下有两个目录 src
和 resources
。src
是插件代码目录, resource
是插件资源目录,其中 META-INF/plugin.xml
是插件的描述文件,就像Java web项目的 web.xml
一样。
plugin.xml默认的内容如下:
<idea-plugin> <id>com.your.company.unique.plugin.id</id> <name>Plugin display name here</name> <version>1.0</version> <vendor email="support@yourcompany.com" url="http://www.yourcompany.com">YourCompany</vendor> <description><!\[CDATA\[Enter short description for your plugin here.<br> <em>most HTML tags may be used</em> \]\]></description> <change-notes><!\[CDATA\[Add change notes here.<br> <em>most HTML tags may be used</em> \]\]></change-notes> <!\-\- please see http://www.jetbrains.org/intellij/sdk/docs/basics/getting\_started/build\_number_ranges.html for description --><idea-version since-build="145.0"/> <!\-\- please see http://www.jetbrains.org/intellij/sdk/docs/basics/getting\_started/plugin\_compatibility.htmlon how to target different products --><!\-\- uncomment to enable plugin in all products<depends>com.intellij.modules.lang</depends> --><extensions defaultExtensionNs="com.intellij"> <!\-\- Add your extensions here --></extensions> <actions> <!\-\- Add your actions here --></actions>
</idea-plugin>
新建一个Action
插件扩展IDEA最常见的方式就是在菜单栏或者工具栏中添加菜单项,用户通过点击菜单项来触发插件功能。IDEA提供了 AnAction
类,这个类有一个虚方法 actionPerformed
,这个方法会在每次菜单被点击时调用。
新建一个自定义的Action有两个步骤:
1、 继承 AnAction
类,在 actionPerformed
方法中实现插件逻辑 2、 注册action,有两种方式,通过代码注册和通过 plugin.xml
注册
我们先写一个简单的Action类:
publicclass TextBoxes extends AnAction { // 如果通过Java代码来注册,这个构造函数会被调用,传给父类的字符串会被作为菜单项的名称// 如果你通过plugin.xml来注册,可以忽略这个构造函数public TextBoxes() { // 设置菜单项名称super("Text _Boxes"); // 还可以设置菜单项名称,描述,图标// super("Text _Boxes","Item description",IconLoader.getIcon("/Mypackage/icon.png"));} public void actionPerformed(AnActionEvent event) { Project project = event.getData(PlatformDataKeys.PROJECT); String txt= Messages.showInputDialog(project, "What is your name?", "Input your name", Messages.getQuestionIcon()); Messages.showMessageDialog(project, "Hello, " \+ txt + "!\\n I am glad to see you.", "Information", Messages.getInformationIcon()); }
}
然后我们在 plugin.xml
中注册这个Action:
<actions> <group id="MyPlugin.SampleMenu" text="_Sample Menu" description="Sample menu"> <add-to-group group-id="MainMenu" anchor="last" /> <action id="Myplugin.Textboxes"class="Mypackage.TextBoxes" text="Text _Boxes" description="A test menu item" /> </group>
</actions>
这里我们新建了一个菜单组,其中text字符串的下划线表示这个字母作为快捷键。这个菜单显示的效果如下:
除了手动新建Action,IDEA还提供了快速新建的方法,在代码目录上点击新建,可以看到Action:
可以在这个面板中填写你要新建的Action信息,IDEA会帮你新建类,还有在plugin.xml中帮你注册:
运行插件
运行插件特别简单,和运行普通Java代码一样,点击运行或者调试的按钮,就会启动一个新的IDEA实例,这个实例中插件是生效的。
点击Text Boxes就可以看到插件的效果了。
往期推荐
Spring Boot 2.x基础教程:JdbcTemplate的多数据源配置
面试:你知道Java中的回调机制吗?
两种写法的效果一样,那么到底哪一种更好呢?
StackOverflow 上面最流行的 7 个 Java 问题!
MySQL百万级、千万级数据多表关联SQL语句调优
以为是行废代码,原来有这作用!
欢迎加入我的知识星球,聊聊技术、说说职场、扯扯社会。
头发很多的中年程序员DD在这里期待你的到来!
加入方式:长按下方二维码噢
最近更新:
【技术圈】关于Consul作为注册中心的四种形态演变
【技术圈】配置中心除了存储应用配置之外,适合做其他配置的存储吗?
【社会人】老实工作没有其他收入,为什么还要补缴个税?
【社会人】除了年终汇算清缴之外,今年的另一件大事:LPR
【聊职场】过来人说说银行科技怎么样?值得进去吗?
我的星球是否适合你?
点击阅读原文看看我们都在聊啥
自己动手,丰衣足食:从零开始写个 IDEA 插件,要啥功能就做啥!相关推荐
- 动手自己写一个 xcode 插件(Xcode Source Editor Extensions)附源码
2019独角兽企业重金招聘Python工程师标准>>> 动手自己写一个 xcode插件 (暂时需要注释功能,所以简单的写一个注释插件) -----Xcode Source Edit ...
- 【Java EE】从零开始写项目【总结】
从零开发项目概述 最近这一直在复习数据结构和算法,也就是前面发出去的排序算法八大基础排序总结,Java实现单向链表,栈和队列就是这么简单,十道简单算法题等等- 被虐得不要不要的,即使是非常简单有时候绕 ...
- 从零开始编写一个vue插件
title: 从零开始编写一个vue插件 toc: true date: 2018-12-17 10:54:29 categories: Web tags: vue mathjax 写毕设的时候需要一 ...
- 从零开始写项目第七篇【搭建Linux环境】
tags: 从零开发项目, title: 从零开始写项目第七篇[搭建Linux环境] 使用SSH连接Linux环境 经过十多天的时间,我的网站备案终于完成了...接下来我就收到了阿里云的邮件.它让我在 ...
- 从零开始开发 VS Code 插件之 Translator Helper
本文目录 Translator Helper 介绍 开发概述 创建第一个VS Code Extension 需求分析 操作文本 调用Google Translation API 实现核心功能 配置命令 ...
- 从0开始编写dapper核心功能、压榨性能、自己动手丰衣足食
我偶然听说sqlsugar的性能比dapper强.对此我表示怀疑(由于我一直使用的dapper存在偏见吧),于是自己测试了sqlsugar.freesql.dapper发现他们的给我的结果是 sqls ...
- xlnt踩坑记2_自己动手丰衣足食
可以参考鄙人上一篇博客 xlnt踩坑记1 然后就这样我爆肝一下午之后终于搞到了xlnt库,他的dll和lib 我开始认识到了--当我开始搞一些比较偏的Project的时候,真的就要靠 自己动手丰衣足食 ...
- 从零开始写一个抖音App——Apt代码生成技术、gradle插件开发与protocol协议
1.讨论--总结前两周评论中有意义的讨论并给予我的解答 2.mvps代码生成原理--将上周的 mvps 架构的代码生成原理进行解析 3.开发一款gradle插件--从 mvps 的代码引出 gradl ...
- 骚操作 !IDEA 防止写代码沉迷插件 !
点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 原文地址:juejin.cn/post/6914083 ...
最新文章
- 《Cell》新发现!“第二大脑”的反击
- 汉芯一号、木兰语言再到天赐 OS,国产基础软件十年泣血,梦想何圆?
- Haha!Sniffer Pro终于可以用啦~
- Mybatis查询可能为null
- 用DriverStudio开发USB驱动程序
- python对文件夹内文件去重
- 2013年5月7日---JS中的正则
- 连接真机开发安卓(Android)移动app MUI框架 添加购物车等——混合式开发(四)
- 用户行为变迁 行业垂直深耕——疫情下的2020年移动互联网报告
- maven的系统变量设置
- go 正则表达式分组匹配_Go语言正则表达式用法实例小结【查找、匹配、替换等】...
- SAP License:FI中的表连接与应用
- CENTOS7 修改 网卡名称为eth0的配置方法
- 20165237 2017-2018-2 《Java程序设计》第8周学习总结
- Atitit Cookie安全法 目录 1. cookie分为 会话cookie 和 持久cookie ,	1 1.1. 安全措施	1 1.2. 3. cookie的同源策略	2 1.3. 安全类库
- 疫情在家办公,向日葵突然卡死,无法远程电脑的解决办法(局域网远程强制重启windows)
- Linux文件与目录常用操作
- 人工智能粒子群优化和群智能
- kubernetes挂载glusterfs遇到的问题
- 什么是短视频电商,短视频电商的商业模式标题】
热门文章
- 服务发现存储仓库 etcd 使用简介
- pyInstaller 参数简介
- linux ubuntu gcc编译 fatal error: bits/libc-header-start.h 错误解决
- 在 Windows 上像 Linux 一样使用命令
- KVM 实现机制---(很經典)
- C C coding rule Using Directives Must Be Placed Within
- mongo java client_mongodb java客户端的使用,即MongoClient
- 北京科技大学C语言程序设计,北京科技大学《C语言》第1章.ppt
- 微型计算机应用重点,微型计算机原理以及的应用考试重点.doc
- 手动生成token_手动设计简单的Token验证