当初年少糊涂,那年夏天填志愿选业余,父母听其余前辈说抉择计算机专业好。从那以后,我的身上就有了计院深深的烙印。从寝室到机房,从机房到图书馆,C、C++、Java……只有是写点本人感兴趣的货色,一坐便是几个小时,但那时年老,起身拾掇,一路小跑会女神,仍旧轻轻松松。
当初工作了,我毫无意外地做着开发工作,写代码一忙就会遗记起来流动一下,常常等到忙完了就感觉腰和腿非常不难受。直到往年的体检报告下来之后,我才幡然醒悟:没有一个好身材,就不能好好工作,实现本人远(sheng)大(zhi)的(jia)梦(xin)想。
那开发到底如何防“沉迷”?以下是我在工作中常常见到的形式:
1. 定闹钟2. 定时喝水水杯
3. 定时唤醒手环
以上归根结底都是定时揭示,但到底有没有从源头(IDE)上来解决呢?譬如,让你的工作环境 (IDE)歇一会 ?
最近我在 IDEA 插件发现了一个乏味的我的项目 StopCoding 进行代码编写,思路非常的简略。明天,我就借助这个我的项目及 EOS 插件的相干开发教训,为大家介绍下 IDEA 插件开发的相干操作。
本文将从以下几个方面来进行 IDEA 插件开发及 StopCoding 的实现介绍:
- IntelliJ IDEA 与 IntelliJ Platform
- 开发环境搭建
- 开发的一个简略的插件
- StopCoding原理及源码解析
<1> intelliJDEA与intelliJ Platform
IntelliJ IDEA 简称 IDEA,是 Jetbrains 公司旗下的一款 JAVA 开发工具,反对 Java、Scala、Groovy 等语言的开发,同时具备反对目前支流的技术和框架,擅长于企业应用、挪动利用和 Web 利用的开发,提供了丰盛的性能,智能代码助手、代码主动提醒、重构、J2EE 反对、各类版本工具(git、svn等)、JUnit、CVS 整合、代码剖析、 翻新的 GUI 设计等。
IntelliJ Platform 是一个构建 IDE 的开源平台,基于它构建的 IDE 有 IntelliJ IDEA、WebStorm、DataGrip、以及 Android Studio 等等。IDEA 插件也是基于 IntelliJ Platform 开发的。
<2>开发环境搭建
官网开发文档 IntelliJ Platform SDK :
https://plugins.jetbrains.com...
开发工具应用 Intellij IDEA,下载地址:
https://www.jetbrains.com/idea/
IDEA 分为两个版本:
- 社区版(Community):完全免费,代码开源,然而短少一些旗舰版中的高级个性。
- 旗舰版(Ultimate):30 天收费,反对全副性能,代码不开源。
开发 IDEA 的插件举荐应用社区版,因为社区版是开源的,在开发插件的时候,能够调试源代码。
<3>开发一个简略的插件
官网文档领导给出了两种开发方式:
- Gradle
- DevKit
1.Gradle 形式新建工程
新建工程目录如下:
1 my_gradle_plugin 2├── build.gradle 3├── gradle 4│ └── wrapper 5│ ├── gradle-wrapper.jar 6│ └── gradle-wrapper.properties 7├── gradlew 8├── gradlew.bat 9├── settings.gradle10└── src11├── main12│ ├── java13│ └── resources14│ └── META-INF15│ └── plugin.xml16└── test17 ├── java18 └── resources
根目录 build.gradle 配置内容如下:
1plugins { 2 id 'java' 3 id 'org.jetbrains.intellij' version '0.6.5' 4} 5 6group 'com.your.company' 7version '1.0' 8sourceCompatibility = 1.8 910repositories {11 mavenCentral()12}13dependencies {14 testImplementation group: 'junit', name: 'junit', version: '4.12'15}1617// See https://github.com/JetBrains/gradle-intellij-plugin/18intellij {19 version '2020.1'20}21patchPluginXml {22 changeNotes """23 Add change notes here.<br/>24 <em>most HTML tags may be usedem>"""25}
Gradle 类型工程 Running 形式:
举荐应用 gradle 形式开发插件,gradle 形式对本地环境要求较低,不须要去配置简单的 sdk 等相干内容。
2.DevKit开发模式
启用 Plugin DevKit
Plugin DevKit 是 IntelliJ 的一个插件,它应用 IntelliJ IDEA 本人的构建零碎来为开发 IDEA 插件提供反对。开发 IDEA 插件之前须要装置并启用 Plugin DevKit 。
关上 IDEA,导航到 Settings | Plugins,若插件列表中没有 Plugin DevKit,点击 Install JetBrains plugin,搜寻并装置。
配置 IntelliJ Platform Plugin SDK
- 导航到 File | Project Structure,抉择对话框左侧栏 Platform Settings 下的 SDKs
- 点击 + 按钮,先抉择 JDK,指定 JDK 的门路;再创立 IntelliJ Platform Plugin SDK,指定 home path 为 IDEA 的装置门路,如图:
这里示例用官网 action 减少一个简略的 action 作为示例,原地址如下:
https://plugins.jetbrains.com...
1、定义action
定义一个 Java class,继承 AnAction 类,并重写 actionPerformed 办法, 如:
1 public class PopupDialogAction extends AnAction {2 @Override3 public void actionPerformed(@NotNull AnActionEvent event) {4// Using the event, create and show a dialog5 Project currentProject = event.getProject();6 StringBuffer dlgMsg = new StringBuffer(event.getPresentation().getText() + " Selected!");7 String dlgTitle = event.getPresentation().getDescription();8 // If an element is selected in the editor, add info about it.9 Navigatable nav = event.getData**(**CommonDataKeys.NAVIGATABLE);10 if (nav != null) {11 dlgMsg.append(String.format("nSelected Element: %s", nav.toString()));12 }13 Messages.showMessageDialog(currentProject, dlgMsg.toString(), dlgTitle, Messages.getInformationIcon());14 }15}
2、注册 Action
在 plugin.xml 文件的 元素内注册。
1 <action< span=""> id="org.intellij.sdk.action.PopupDialogAction" class="org.intellij.sdk.action.PopupDialogAction" 2 text="Action Basics Plugin: Pop Dialog Action" description="SDK action example" icon="SdkIcons.Sdk_default_icon"> 3 4 <override-< span="">text place="MainMenu" text="Pop Dialog Action"/> 5 6 <keyboard-shortcut< span=""> first-keystroke="control alt A" second-keystroke="C" keymap="$default"/> 7 8 <mouse-shortcut< span=""> keystroke="control button3 doubleClick" keymap="$default"/> 910 <add-< span="">to-group group-id="ToolsMenu" anchor="first"/>1112 </action>
下面示例会定义一个被增加到 IDEA tools 菜单的第一个地位(anchor=”first”)增加了”Pop Dialog Action”菜单,点击该菜单将弹出一个“Action Basics Plugin: Pop Dialog Action Selected!” item,如图:
点击该 “Pop Dialog Action” item,弹出一个提醒输出名字的对话框。
<4>StopCoding原理及源码解析
开源地址:
https://github.com/jogeen/Sto...
Step1. 而后在菜单栏中tools->StopCoding。
Step2. 设置适宜你的参数而后保留。
Step3. 高兴的Coding,再不必放心本人会“沉迷”了。工作工夫完结,就会弹出下框进行揭示。当然,这个框是关不掉的。只有你劳动了足够的工夫它才会主动敞开。
工程构造剖析:
1. 2├── image 3│ ├── step1.png 4│ ├── step2.png 5│ ├── step3.png 6│ └── step.gif 7├── LICENSE 8├── readme.md 9├── readme_ZH.md10├── resources11│ ├── img12│ │ └── stop.png13│ └── META-INF14│ ├── pluginIcon_dark.svg15│ ├── pluginIcon.svg16│ └── plugin.xml17├── src18│ └── icu19│ └── jogeen20│ └── stopcoding21│ ├── data22│ │ ├── DataCenter.java23│ │ └── SettingData.java24│ ├── service25│ │ └── TimerService.java26│ ├── StopCodingSettingAction.java27│ ├── task28│ │ ├── RestTask.java29│ │ └── WorkTask.java30│ └── ui31│ ├── SettingDialog.form32│ ├── SettingDialog.java33│ ├── TipsDialog.form34│ └── TipsDialog.java35└── StopCoding.iml
上图能够看到,工程构造非常的简略,基于devkit模式进行开发。
- data 包
SettingData,配置信息对应 model。DataCenter,作为运行时的数据中心,都是些动态的全局变量。
- service
TimerService 这个定时计算的外围代码。
- task
RestTask 劳动时的定时工作。WorkTask 工作时的定时工作。
- ui
SettingDialog 设置信息的对话框。TipsDialog 劳动时揭示的对话框。StopCodingSettingAction 启动入口的 action。
- plugin.xml
这是插件工程的外围配置文件,外面每一项的都增加了具体的正文,有疑难的小伙伴能够在公众号后盾留言,咱们一起探讨。
1<idea-plugin> 2 <!-- 插件惟一id,不能和其余插件我的项目反复,所以举荐应用com.xxx.xxx的格局 3 插件不同版本之间不能更改,若没有指定,则与插件名称雷同 --> 4 <id>icu.jogeen.StopCoding.id</id> 5 <!-- 插件名称,他人在官网插件库搜寻你的插件时应用的名称 --> 6 7 <name>StopCoding</name> 8 <!-- 插件版本号 --> 910 <version>1.2.1</version>11 <!-- 供应商主页和email(不能应用默认值,必须批改成本人的)-->1213 <vendor email="jogeen@qq.com" url="https://github.com/jogeen/StopCoding">jogeen</vendor>1415 <!-- 插件的形容 (不能应用默认值,必须批改成本人的。并且须要大于40个字符)-->1617 <description><![CDATA[18 <p>This is a work timer.It can set every working period to remind you that it's time to have a rest, drink some water and exercise your body.19 Only in this way can you really work healthily</p>20 <ol>21 <li>In the tools menu bar, open stopcoding.</li>22 <li>Set working hours and rest time, and save them.</li>23 <li>When the set time comes, there will be a pop-up box to remind you to rest, so that you can not operate idea temporarily.</li>24 </ol>25 <hr>26 <p>如果你也常常沉迷于写代码,忘了起身劳动喝水,那么试试这个插件吧</p>27 <ol>28 <li>在菜单栏的Tools中,关上StopCoding插件进行设置</li>29 <li>设置工作工夫和休息时间,并且保留</li>30 <li>当设置的工夫一到,就会有弹框揭示你劳动,让你临时不能操作idea</li>31 </ol>32 <p>我的项目地址:<a href="https://github.com/jogeen/StopCoding">https://github.com/jogeen/StopCoding</p>33 ]]></description>3435 <!-- 插件版本变更信息,反对HTML标签;36 将展现在 settings | Plugins 对话框和插件仓库的Web页面 -->37 <change-notes><![CDATA[38 <ul>39 <li>V1.2 add icon(Thanks for the icon provided by my good friend Hu Wei).</li>40 <li>V1.1 update Guide to use.</li>41 <li>V1.0 release.</li>42 </ul>43 ]]>44 </change-notes>4546 <!-- 插件兼容IDEAbuild 号(最低版本号)-->47 <idea-version since-build="173.0"/>48 <!-- 插件所依赖的其余插件的id -->49 <depends>com.intellij.modules.lang</depends>505152 <extensions defaultExtensionNs="com.intellij">53 <!-- 申明该插件对IDEA core或其余插件的扩大 -->5455 </extensions>5657 <!-- 编写插件动作 -->58 <actions>59 <action id="StopCoding_setting_id" class="icu.jogeen.stopcoding.StopCodingSettingAction" text="StopCoding"60 description="setting">61 <add-to-group group-id="ToolsMenu" anchor="first"/>62 <keyboard-shortcut keymap="$default" first-keystroke="ctrl S" second-keystroke="C"/>63 </action>64 </actions>6566</idea-plugin>
从 public.xml 能够看出,这个插件比较简单,只有一个 StopCoding_setting_id 配置项,入口类也是
icu.jogeen.stopcoding.StopCodingSettingAction
1 public class StopCodingSettingAction extends AnAction {23 @Override4 public void actionPerformed(AnActionEvent e) {5 SettingDialog settingDialog = new SettingDialog();6 settingDialog.setVisible(true);7 }8 }
源码中只是展现了SettingDialog,基于Swing画了一个可视化界面。
icu.jogeen.stopcoding.ui.SettingDialog
1//绑定确定按钮事件 2 buttonOK.addActionListener(new ActionListener() { 3 public void actionPerformed(ActionEvent e) { 4 onOK(); 5 } 6 }); 7 //绑定勾销按钮事件 8 buttonCancel.addActionListener(new ActionListener() { 9 public void actionPerformed(ActionEvent e) {10 onCancel();11 }12 });13 //绑定敞开按钮事件14 setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);15 addWindowListener(new WindowAdapter() {16 public void windowClosing(WindowEvent e) {17 onCancel();18 }19 });20 contentPane.registerKeyboardAction(new ActionListener() {21 public void actionPerformed(ActionEvent e) {22 onCancel();23 }24 }, KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);25 //绑定启用抉择按钮工夫26 openRbtn.addChangeListener(new ChangeListener() {27 @Override28 public void stateChanged(ChangeEvent e) {29 openRbtn.setText(openRbtn.isSelected() ? "Running" : "Stopped");30 }31 });
在 SettingDialog 中对事件进行了监听,其次要思路就是 schedule 去增加一个定时工作,和应用 cancel 去勾销工作进行定时器。而后弹出一个 dialog 阻止继续 coding。
<5>最初
对大多数程序员来说,生存没那么多诗和远方,大部分是加不完的班,写不完的代码和修不完的 bug。置信有了这些根本介绍,感兴趣的小伙伴去看看源码,并尝试本人写一个小插件就没什么太大问题了,要晓得程序员不止眼前的逻辑和代码,还应有衰弱的体格和精气神。最初,心愿这篇文章能帮到作为程序员的你,也心愿大家都能做最好的本人。
举荐浏览
- 技术领导之路:如何从开发人员转变为团队负责人
- 2020年9大顶级Java框架
欢送点击【京东科技】,理解开发者社区
更多精彩技术实际与独家干货解析
欢送关注【京东科技开发者】公众号