自己動手,豐衣足食:從零開始寫個 IDEA 外掛,要啥功能就做啥

gyhycx發表於2020-09-25

寫Java程式碼的時候,經常會涉及到重複性的操作,這個時候就會想要是有這樣一個外掛就好了,如果是大家都會遇到的場景,IDE或許已經提供了,再不然也有可能有人編寫了相關的外掛。

要是這個操作是你們的編碼環境特有的,那就只能自己寫工具了。所以這裡來學學如何編寫IDEA外掛,讓自己的程式設計環境更加強大,更好的進行裝x。

開發環境

開發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來執行外掛:

自己動手,豐衣足食:從零開始寫個 IDEA 外掛,要啥功能就做啥

 

除非你在Mac上使用官方JDK,否則你需要手動新增 /lib/tools.jar到classpath中。關注微信公眾號:匠心零度,在後臺回覆:idea,可以獲取我整最新 IDEA 教程,都是乾貨。

配置IntelliJ Platform SDK

開啟 File|ProjectStructure新建一個 IntelliJPlatformSDK:

自己動手,豐衣足食:從零開始寫個 IDEA 外掛,要啥功能就做啥

 

Java SDK選擇我們剛剛建立的 IDEA jdk:

自己動手,豐衣足食:從零開始寫個 IDEA 外掛,要啥功能就做啥

 

然後我們可以把下載的IDEA社群版原始碼新增到原始碼路徑中,這樣在除錯時,就可以除錯IDEA自身的程式碼了:

自己動手,豐衣足食:從零開始寫個 IDEA 外掛,要啥功能就做啥

 

自己動手,豐衣足食:從零開始寫個 IDEA 外掛,要啥功能就做啥

 

第一個外掛

我們來編寫一個最簡單的外掛來學習編寫一個外掛的完整步驟。

新建工程

選擇 IntellJPlatformPlugin,然後Project SDK指定剛剛新建的plugin sdk:

自己動手,豐衣足食:從零開始寫個 IDEA 外掛,要啥功能就做啥

 

新建的外掛專案:

自己動手,豐衣足食:從零開始寫個 IDEA 外掛,要啥功能就做啥

 

外掛根目錄下有兩個目錄 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.html       on 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字串的下劃線表示這個字母作為快捷鍵。這個選單顯示的效果如下:

自己動手,豐衣足食:從零開始寫個 IDEA 外掛,要啥功能就做啥

 

除了手動新建Action,IDEA還提供了快速新建的方法,在程式碼目錄上點選新建,可以看到Action:

自己動手,豐衣足食:從零開始寫個 IDEA 外掛,要啥功能就做啥

 

可以在這個皮膚中填寫你要新建的Action資訊,IDEA會幫你新建類,還有在plugin.xml中幫你註冊:

自己動手,豐衣足食:從零開始寫個 IDEA 外掛,要啥功能就做啥

 

執行外掛

執行外掛特別簡單,和執行普通Java程式碼一樣,點選執行或者除錯的按鈕,就會啟動一個新的IDEA例項,這個例項中外掛是生效的。

點選Text Boxes就可以看到外掛的效果了。

相關文章