IDEA 插件開發入門教程

2019獨角獸企業重金招聘Python工程師標準>>> hot3.png

IntelliJ IDEA 是目前最好用的 JAVA 開發 IDE,它本身的功能已經非常強大了,但是每個人的需求不一樣,有些需求 IDEA 本身無法滿足,于是我們就需要自己開發插件來解決。工欲善其事,必先利其器,想要提高開發效率,我們可以借助 IDEA 提供的插件功能來滿足我們的需求。如果沒有我需要的功能怎么辦?很簡單,我們自己造一個!

插件能做什么?

IDEA 的插件幾乎可以做任何事情,因為它把 IDE 本身的能力都封裝好開放出來了。主要的插件功能包含以下四種:

  • 自定義語言支持:如果有 IDEA 暫時不支持的語言,你可以自己寫一個插件來支持,例如 Go 語言原來的支持就是通過插件做的,后來單獨做了一個 Goland。官方有自定義語言插件支持的教程。
  • 框架支持:例如Struts 2?的框架支持
  • 工具集成:可以給 IDEA 的自帶功能進行增強,例如對 Git 的操作增加 CodeReview 的功能。參考Gerrit
  • 用戶界面:自定義的插件改變用戶界面。參考BackgroundImage

我為了減少重復代碼的編寫,寫了一個代碼生成的插件IDEA代碼生成插件CodeMaker,支持自定義代碼生成的模板。

Hello world 插件

依照慣例,我們從 Hello world 開始。

新建一個 Gradle 的插件工程

有些教程推薦用 IDEA 默認的插件工程來開始,但是我比較推薦用 Gradle 來管理整個插件工程,后面的依賴管理會很方便,否則都得靠手動管理。

點擊新建工程,選擇 Gradle

接下來填寫項目屬性

配置 Gradle,用默認配置就行

新建完工程之后,IDEA 會自動開始解析項目依賴,因為它要下載一個幾百兆的 SDK 依賴包,所以會比較久,打開科學上網能快一點。

Gradle 依賴解析完成之后,項目結構如下圖,其中 plugin.xml 是插件的配置,build.gradle 是項目依賴的配置(類比 pom.xml)。

下面就是默認生成的 plugin.xml

<idea-plugin><!--插件id--><id>com.xiaokai.test.demo</id><!--插件名稱--><name>Demo</name><!--開發者信息--><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><!-- 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

Action 是 IDEA 中對事件響應的處理器,它的 actionPerformed 就像是 JS 中的 onClick 方法。可以看出來,插件的開發本質上跟 web、Android 的開發沒有什么不同,因為都是事件驅動的編程。

我們可以直接使用 IDEA 提供的 Action 生成器
-w873

-w915

點擊 OK 之后會在 src 生成類文件:

package com.xiaokai.test;import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;public class HelloWorldAction extends AnAction {@Overridepublic void actionPerformed(AnActionEvent e) {// TODO: insert action logic here}
}

同時,動作的信息也會注冊到 plugin.xml 中

    <!--插件動作--><actions><!-- Add your actions here --><action id="demo.hello.world" class="com.xiaokai.test.HelloWorldAction" text="HelloWorld"description="Say Hello World"><add-to-group group-id="GenerateGroup" anchor="last"/></action></actions>

彈出對話框

創建完 Action 之后我們就要開始往里面寫邏輯了,既然是 Hello World 教學,那我們就來試一下最簡單的彈出對話框。

    @Overridepublic void actionPerformed(AnActionEvent e) {//獲取當前在操作的工程上下文Project project = e.getData(PlatformDataKeys.PROJECT);//獲取當前操作的類文件PsiFile psiFile = e.getData(CommonDataKeys.PSI_FILE);//獲取當前類文件的路徑String classPath = psiFile.getVirtualFile().getPath();String title = "Hello World!";//顯示對話框Messages.showMessageDialog(project, classPath, title, Messages.getInformationIcon());}

代碼寫完之后,打開 Gradle 的界面,點擊 runIde 就會啟動一個安裝了插件的 IDEA,然后就可以進行測試。你還可以右鍵啟動 Debug 模式,這樣還能進行斷點。
-w1066

運行的效果如下圖:
pu
可以看到,我們右鍵打開 Generate 菜單之后,里面最后一項就是我們添加的 Action,

進階的教程

如果想學習更多的原理和設計理念可以看IntelliJ Platform SDK的官方文檔。不過老實說,它的文檔寫的挺差的,基本上就是簡單講了一下概念和原理,沒有深入的分析。所以如果要深入研究還得靠自己。最靠譜的學習方式就是看別人寫的插件,舉個例子,你想知道怎么樣實現自動生成代碼,你就去找支持這個功能的插件,看他的源碼是怎么寫的。

我當時寫CodeMaker的時候也是靠自己啃源碼之后寫出來的。下面我簡單介紹一下我用過的一些 API,這些 API 基本都沒有文檔說明,全靠代碼相傳。

判斷當前光標選擇的元素是什么

        //獲取當前事件觸發時,光標所在的元素PsiElement psiElement = anActionEvent.getData(LangDataKeys.PSI_ELEMENT);//如果光標選擇的不是類,彈出對話框提醒if (psiElement == null || !(psiElement instanceof PsiClass)) {Messages.showMessageDialog(project, "Please focus on a class", "Generate Failed", null);return;}

獲取當前類文件的所有類對象

一個類文件中可能會有內部類,所以讀取的時候返回的是一個列表

    public static List<PsiClass> getClasses(PsiElement element) {List<PsiClass> elements = Lists.newArrayList();List<PsiClass> classElements = PsiTreeUtil.getChildrenOfTypeAsList(element, PsiClass.class);elements.addAll(classElements);for (PsiClass classElement : classElements) {//這里用了遞歸的方式獲取內部類elements.addAll(getClasses(classElement));}return elements;}

格式化代碼

    public static void reformatJavaFile(PsiElement theElement) {CodeStyleManager codeStyleManager = CodeStyleManager.getInstance(theElement.getProject());try {codeStyleManager.reformat(theElement);} catch (Exception e) {LOGGER.error("reformat code failed", e);}}

使用粘貼板

        CopyPasteManager.getInstance().setContents(new SimpleTransferable(table.toString(), DataFlavor.allHtmlFlavor));

原文鏈接

轉載于:https://my.oschina.net/u/1464083/blog/3014373

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/388187.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/388187.shtml
英文地址,請注明出處:http://en.pswp.cn/news/388187.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

安卓代碼還是xml繪制頁面_我們應該繪制實際還是預測,預測還是實際還是無關緊要?

安卓代碼還是xml繪制頁面Plotting the actual and predicted data is frequently used for visualizing and analyzing how the actual data correlate with those predicted by the model. Ideally, this should correspond to a slope of 1 and an intercept of 0. However, …

Mecanim動畫系統

本期教程和大家分享Mecanim動畫系統的重定向特性&#xff0c;Mecanim動畫系統是Unity3D推出的全新的動畫系統&#xff0c;具有重定向、可融合等諸多新特性&#xff0c;通過和美工人員的緊密合作&#xff0c;可以幫助程序設計人員快速地設計出角色動畫。一起跟著人氣博主秦元培學…

【嵌入式硬件Esp32】Ubuntu 1804下ESP32交叉編譯環境搭建

一、ESP32概述EPS32是樂鑫最新推出的集成2.4GWi-Fi和藍牙雙模的單芯片方案&#xff0c;采用臺積電(TSMC)超低功耗的40nm工藝&#xff0c;擁有最佳的功耗性能、射頻性能、穩定性、通用性和可靠性&#xff0c;適用于多種應用和不同的功耗要求。 ESP32搭載低功耗的Xtensa LX6 32bi…

你認為已經過時的C語言,是如何影響500萬程序員的?...

看招聘職位要c語言的占比真不多了&#xff0c;是否c語言真得落伍了&#xff1f; 看一下許多招聘平臺有關于找純粹的c語言開發的占比確實沒有很多&#xff0c;都被Java&#xff0c;php&#xff0c;python等等語言刷屏。這對于入門正在學習c語言的小白真他媽就是驚天霹靂&#xf…

換熱站起停條件

循環泵 自動條件&#xff1a; 一、循環泵啟動條件 兩臺泵/三臺泵&#xff1a; 1&#xff09;本循環泵在遠程狀態 2&#xff09;本循環泵自動狀態 3&#xff09;本循環泵沒有故障 4&#xff09;二次網的回水壓力&#xff08;測量值&#xff09;>設定值 5&#xff09;…

云尚制片管理系統_電影制片廠的未來

云尚制片管理系統Data visualization is a key step of any data science project. During the process of exploratory data analysis, visualizing data allows us to locate outliers and identify distribution, helping us to control for possible biases in our data ea…

JAVA單向鏈表實現

JAVA單向鏈表實現 單向鏈表 鏈表和數組一樣是一種最常用的線性數據結構&#xff0c;兩者各有優缺點。數組我們知道是在內存上的一塊連續的空間構成&#xff0c;所以其元素訪問可以通過下標進行&#xff0c;隨機訪問速度很快&#xff0c;但數組也有其缺點&#xff0c;由于數組的…

軟件公司管理基本原則

商業人格&#xff1a;獨立履行責任 獨立堅持原則兩大要素&#xff1a;1)靠原則做事&#xff0c;原則高于一切。2)靠結果做交換&#xff0c;我要什么我清楚兩個標準&#xff1a; 1)我不是孩子&#xff0c;我不需要照顧2)承認邏輯&#xff0c;我履行我的責任社會人心態: 1)用社會…

201771010102 常惠琢《面向對象程序設計(java)》第八周學習總結

1、實驗目的與要求 (1) 掌握接口定義方法&#xff1b; (2) 掌握實現接口類的定義要求&#xff1b; (3) 掌握實現了接口類的使用要求&#xff1b; (4) 掌握程序回調設計模式&#xff1b; (5) 掌握Comparator接口用法&#xff1b; (6) 掌握對象淺層拷貝與深層拷貝方法&#xff1b…

新版 Android 已支持 FIDO2 標準,免密登錄應用或網站

谷歌剛剛宣布了與 FIDO 聯盟達成的最新合作&#xff0c;為 Android 用戶帶來了無需密碼、即可登錄網站或應用的便捷選項。 這項服務基于 FIDO2 標準實現&#xff0c;任何運行 Android 7.0 及后續版本的設備&#xff0c;都可以在升級最新版 Google Play 服務后&#xff0c;通過指…

t-sne原理解釋_T-SNE解釋-數學與直覺

t-sne原理解釋The method of t-distributed Stochastic Neighbor Embedding (t-SNE) is a method for dimensionality reduction, used mainly for visualization of data in 2D and 3D maps. This method can find non-linear connections in the data and therefore it is hi…

oracle操作

imp kfqrlcs/kfqrlcshx fileC:\kfqrlcs.dmp fully //創建臨時表空間 create temporary tablespace kfqrlcs_temp tempfile C:\oracledata\kfqrlcs_temp.dbf size 32m autoextend on next 32m maxsize 8048m extent management local; //tempfile參數必須有 //創建數據表…

strust2自定義攔截器

1.創建一個攔截器類&#xff0c;繼承MethodFilterInterceptor類&#xff0c;實現doIntercept方法 package com.yqg.bos.web.interceptor;import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor; import com.y…

Android Studio如何減小APK體積

最近在用AndroidStudio開發一個小計算器&#xff0c;代碼加起來還不到200行。但是遇到一個問題&#xff0c;導出的APK文件大小竟然達到了1034K。這不科學&#xff0c;于是就自己動手精簡APK。下面我們大家一起學習怎么縮小一個APK的大小&#xff0c;以hello world為例。 新建工…

js合并同類數組里面的對象_通過同類群組保留估算客戶生命周期價值

js合并同類數組里面的對象This is Part I of the two-part series dedicated to estimating customer lifetime value. In this post, I will describe how to estimate LTV, on a conceptual level, in order to explain what we’re going to be doing in Part II with the P…

C#解析HTML

第一種方法&#xff1a;用正則表達式來分析 [csharp] view plaincopy 轉自網上的一個實例&#xff1a;所有的href都抽取出來&#xff1a; using System; using System.Net; using System.Text; using System.Text.RegularExpressions; namespace HttpGet { c…

幫助開發人員學習

在瀏覽器中使用真實環境學習新技術 https://www.katacoda.com/ 轉載于:https://www.cnblogs.com/zuxing/p/9829143.html

【轉】SASS用法指南

SASS用法指南 阮一峰的&#xff0c;偏sass用法教程sass入門 偏實戰的基礎用法

com編程創建快捷方式中文_如何以編程方式為博客創建wordcloud?

com編程創建快捷方式中文Recently, I was in need of an image for our blog and wanted it to have some wow effect or at least a better fit than anything typical we’ve been using. Pondering over ideas for a while, word cloud flashed in my mind. &#x1f4a1;Us…

ETL技術入門之ETL初認識

ETL技術入門之ETL初認識 分類&#xff1a; etl2014-07-10 23:11 3021人閱讀 評論(2) 收藏 舉報數據倉庫商業價值etlbi目錄(?)[-] ETL是什么先說下背景知識下面給下ETL的詳細解釋定義現在來看下kettle的transformation文件一個最簡單的E過程例子windows環境 上圖左邊的是打開表…