科技

IDEA 外掛開發入門教程

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

com.xiaokai.test.demo

Demo

YourCompany

Enter short description for your plugin here.

most HTML tags may be used

]]>

建立一個 Action

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

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

點選 OK 之後會在 src 生成類檔案:

package com.xiaokai.test;

import com.intellij.openapi.actionSystem.AnAction;

import com.intellij.openapi.actionSystem.AnActionEvent;

public class HelloWorldAction extends AnAction {

@Override

public void actionPerformed(AnActionEvent e) {

// TODO: insert action logic here

}

}

同時,動作的資訊也會註冊到 plugin.xml 中

description="Say Hello World">

彈出對話方塊

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

@Override

public 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 模式,這樣還能進行斷點。

執行的效果如下圖:

可以看到,我們右鍵開啟 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 getClasses(PsiElement element) {

List elements = Lists.newArrayList();

List classElements = PsiTreeUtil.getChildrenOfTypeAsList(element, PsiClass.class);

elements.addAll(classElements);

for (PsiClass classElement : classElements)

return elements;

}

格式化程式碼

public static void reformatJavaFile(PsiElement theElement) {

CodeStyleManager codeStyleManager = CodeStyleManager.getInstance(theElement.getProject());

try catch (Exception e) {

LOGGER.error("reformat code failed", e);

}

}

使用貼上板

CopyPasteManager.getInstance()

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

更多

更多的技巧可以參考我的專案CodeMaker,以及其他的開源外掛。

作者:風馬蕭蕭

Reference:科技日報

看更多!請加入我們的粉絲團

轉載請附文章網址

不可錯過的話題