开发IntellijIdea插件
介绍
在过去几年中,JetBrains的IntelliJ很快成为Java开发人员的顶级IDE。使IntelliJ对Java开发人员如此有吸引力的一个特性是使用插件扩展和创建新功能的能力。在本教程中,我们将介绍如何编写IntelliJ插件来演示扩展IDE的几种方法。
虽然本文主要关注IntelliJ插件,但所有JetBrainsIDE都共享公共代码。因此,这里使用的许多技术可以应用于JetBrain的其他IDE,如PyCharm、RubyMine等。插件功能
Intellij插件按照功能可分四类:自定义语言:针对不同语言,能够编写、解释和编译框架:支持第三方框架,如Spring工具:与外部工具(如Gradle)集成用户界面附加组件:新菜单项、工具窗口和按钮等创建一个插件项目
使用PluginDevKit(https:www。jetbrains。orgintellijsdkdocsbasicsgettingstartedusingdevkit。html)来创建工程,DevKit提供了自定义SDK类型和一组用于在IDE中构建插件的操作创建工程
在Intellij的菜单栏,选择FileNewProject,在NewProject框里选择IntelliJPLatformPlugin
NewProject
在projectSDK选项框选择合适的IntellijSDK,然后下一步,填上projectname,完成,就创建好一个Intellijplugin工程了。实现一个自定义的Plugin
创建自定义Action
如果需要了解更多action相关的东西,请访问官方文档https:www。jetbrains。orgintellijsdkdocsbasicsactionsystem。html
创建自定义的action,需要继承抽象类AnAction,并且需要重写方法AnAction。update()和AnAction。actionPerformed():update()方法里面实现开启和禁用事件逻辑actionPerformed()方法里面实现我们需要做的具体业务逻辑packagecom。test。plugin;importcom。intellij。ide。BrowserUtil;importcom。intellij。lang。Language;importcom。intellij。openapi。actionSystem。AnAction;importcom。intellij。openapi。actionSystem。AnActionEvent;importcom。intellij。openapi。actionSystem。CommonDataKeys;importcom。intellij。openapi。editor。Editor;importcom。intellij。openapi。project。Project;importcom。intellij。psi。PsiFile;importjava。io。UnsupportedEncodingException;importjava。net。URLEncoder;publicclassSearchBaiduActionextendsAnAction{Onlymakethisactionvisiblewhentextisselected。pTheupdatemethodbelowisonlycalledperiodicallysoneedtobecarefultocheckforselectedtexthttps:jetbrains。orgintellijsdkdocsbasicsactionsystem。htmloverridingtheanactionupdatemethodparameOverridepublicvoidupdate(AnActionEvente){GetrequireddatakeysfinalProjectprojecte。getProject();finalEditoreditore。getData(CommonDataKeys。EDITOR);Setvisibilityonlyincaseofexistingprojectandeditorandifaselectionexistse。getPresentation()。setEnabledAndVisible(project!nulleditor!nulleditor。getSelectionModel()。hasSelection());}OverridepublicvoidactionPerformed(AnActionEvente){finalStringselectedCodegetSelectedCode(e);finalStringlanguageTaggetLanguageTag(e);StringurlgetUrl(languageTag,selectedCode);if(url!null){BrowserUtil。browse(url);}}privateStringgetSelectedCode(AnActionEvente){finalEditoreditore。getRequiredData(CommonDataKeys。EDITOR);returneditor。getSelectionModel()。getSelectedText();}privateStringgetLanguageTag(AnActionEvente){StringlanguageTag;PsiFilefilee。getData(CommonDataKeys。PSIFILE);if(file!null){Languagelangfile。getLanguage();languageTaglang!null?lang。getDisplayName()。toLowerCase():null;}returnlanguageTag;}privateStringgetUrl(StringlanguageTag,StringselectedCode){try{StringBuildersbnewStringBuilder(https:www。baidu。coms?wd);if(languageTag!null){sb。append(URLEncoder。encode(languageTag,UTF8));}sb。append(URLEncoder。encode(selectedCode,UTF8));returnsb。toString();}catch(UnsupportedEncodingExceptionunsupportedEncodingException){unsupportedEncodingException。printStackTrace();returnnull;}}}
如果action被禁用了,那么actionPerformed方法不会被执行
actionPerformed()方法OverridepublicvoidactionPerformed(AnActionEvente){finalStringselectedCodegetSelectedCode(e);finalStringlanguageTaggetLanguageTag(e);StringurlgetUrl(languageTag,selectedCode);if(url!null){BrowserUtil。browse(url);}}
在该方法中,我们通过getSelectedCode()方法拿到用户选择的文本,通过刚发getLanguageTag()获取当前文本语言,比如java,js,go等。然后通过getURL()方法组装url,最后通过BrowserUtil。browse(url)打开浏览器,并访问给的url。在我们demo里面,我们将用选择的文本在baidu里面进行搜索。
获取Editor中选择的文本
你需要使用SelectionModel对象获取选择的文本privateStringgetSelectedCode(AnActionEvente){finalEditoreditore。getRequiredData(CommonDataKeys。EDITOR);returneditor。getSelectionModel()。getSelectedText();}
获取当前文件的语言
从event中通过CommonDataKeys。PSIFILEkey获取到PsiFile对象,然后再从PsiFile中获取到Language。privateStringgetLanguageTag(AnActionEvente){StringlanguageTag;PsiFilefilee。getData(CommonDataKeys。PSIFILE);if(file!null){Languagelangfile。getLanguage();languageTaglang!null?lang。getDisplayName()。toLowerCase():null;}returnlanguageTag;}注册事件
有两种方式可以注册我们自定义的事件:1。plugin。xml中配置,2。代码中注册
在plugin。xml文件中注册事件:actionactionactions
更多事件注册信息请查看官方文档https:plugins。jetbrains。comdocsintellijbasicactionsystem。html?fromjetbrains。orgregisteringactionsinpluginxml运行插件
在Idea中运行或者debug插件是非常简单的一件事
配置
运行
结果
大一软件新生该买什么性价比高的笔记本?这个要根据自己的实际情况来选择的,可以用鲁大师来进行测试对比选择性价比高的就行若是学习编程,电脑的内存不能低于8G,而大多数不配备独显的笔记本电脑,价钱虽然较低,但其因在……
腾讯牵头首个区块链数字藏品国际标准立项读创深圳商报记者陈姝记者近日获悉,《基于区块链的数字藏品服务技术框架》国际标准项目成功获得立项。据了解,该项目由腾讯牵头,联合蚂蚁集团、信通院、北京邮电大学、之江实验室等……
如果iPhone6s停留在系统不升级,可以一直用下去吗?iPhone6s是能够升级到iOS13的最早苹果机型,上一代的iPhone6就只能升级到iOS12。不过有些网友觉得iOS版本越升级越卡,所以一直停留在早期的iOS版本。……
LinuxPolkit本地权限提升漏洞(CVE4034)修复近日,Qualys研究团队公开披露了在Polkit的pkexec中发现的一个权限提升漏洞,也被称为PwnKit。该漏洞是由于pkexec无法正确处理调用参数,从而将环境变量作为……
索尼备货6000mAh新机,最高18G1TB存储,堆料豪华如果说,要选一部拍照最强的手机,你会选什么?索尼作为影像行业的大佬,卖相机和电视已经不能满足了,索尼Xperia1系列是索尼开发的一个手机产品线,因为超强的相机配置被人们……
这样的高级脸你爱了吗?元PLUS定位更高,加持刀片电池比亚迪经过多年的沉淀积累,在新能源领域已经颇有建树,拥有成熟的造车技术,旗下新能源车型综合实力出众。而元PLUS是品牌为消费者带来的一款全新纯电动SUV,新车基于品牌e平台3。……
在完全断电的情况下,用水泡电脑主板,再完全晾干,有什么影响?没有什么影响的,太脏的主板我都会这样处理,有些故障因此而不治而愈。但水洗之前一定要将CPU和可插拔的集成块拔出来,要不然,这些原件的插座很难晾干的,凉不干后果非常严重。论最脏的……
go语言数组数组是一个由固定长度的特定类型元素组成的序列,一个数组可以由零个或多个元素组成。数组是值类型定义数组:1。var数组变量名〔元素数量〕Type2。vara〔5〕int定义五个整……
分享一个SQLite性能优化实例最早接触iOS开发了解到的第一个缓存数据库就是SQLite,后面一直也以SQLite作为中坚力量使用,以前没有接触到比较大量数据的读写,所以在性能优化方面关注不多,这次对一个特……
EZON宜准R6专业级运动手表EZON宜准R6专业级运动手表夏季快结束了,贴秋膘的金九银十马上就要来了,不知道大家的身材管理怎么样了,反正我是失效了,不止是我,还有我老婆,两个吃货在一起难免是这样的结……
操作系统国产化才有中国网络安全化微软公司近日宣布,从明年6月15日起,旗下IE浏览器将基本淘汰。互联网活化石将告别历史舞台,在舆论场引发了普遍关注。有人追忆初识互联网的青葱岁月;有人解读互联网产品的发展规律;……
细读阿里受侵害女员工的控诉发文,有几点疑问侵犯门事件让阿里继月饼门和蒋凡小三门事件后,再一次冲上舆论的风口浪尖,阿里的企业文化以及价值观受到了更猛烈的抨击。是什么样的事情让阿里董事局主席张勇感到震惊、气愤、羞愧?……