IntelliJ Platform Plugin Templateを使って、「エディタのコンテキストメニューからダイアログを表示する」だけのJetBrains系IDEプラグインを作ってみた

JetBrains系IDEを使って日常的にコードを書いていますが、ふとJetBrains系IDEプラグインを作ってみたくなりました。

とはいえ、JetBrains系IDEプラグインの作り方がよく分からなかったので調べてみたところ、 IntelliJ Platform Plugin Template というリポジトリを使うと簡単に作成できそうだと分かりました。
https://github.com/JetBrains/intellij-platform-plugin-template

そこで、IntelliJ Platform Plugin Template を使って、「コンテキストメニューからダイアログを表示する」だけのHello world的なJetBrains系IDEプラグインを作ってみたことから、メモを残します。

 
目次

 

環境

  • Windows11
    • WSL2上ではなく、Windows11上で開発します
  • IntelliJ IDEA 2023.3.4 Ultimate Edition

なお、ローカルではJava/Kotlinを使った開発をしていないことから、Javaまわりは何もインストールしていない状態でした。

 

IntelliJ Platform Plugin Templateを元にした環境構築

まずは、READMEのGetting startedの内容から始めます。
https://github.com/JetBrains/intellij-platform-plugin-template?tab=readme-ov-file#getting-started

最初にリポジトリUse this template ボタンをクリックし、プラグイン名を hello_jetbrains_plugin とするなど、必要な事項を入力して自分のリポジトリへとcloneしました。

できあがったリポジトリは以下です。
https://github.com/thinkAmi-sandbox/hello_jetbrains_plugin

 
続いて、 IntelliJ Platform Plugin Template のREADMEに従い、 Get from VCS 機能でソースコードをローカルに clone & 開きます。

今までこの機能を使ったことがなかったのですが、簡単にcloneとセットアップができました。

 
引き続きREADMEに従い、WindowsJavaSDKをインストールします。

バージョンとベンダーを選べますが、ひとまず

  • Java17
  • ベンダーは JetBrains Runtime version 17.0.9
    • 深い意味はなく、とりあえずJetBrainsが提供しているものにしてみました

を選んでおきました。

 
この時点でプラグインを起動できるため、 Run Plugin を実行してみます。

すると、プラグインがインストールされた状態でIntelliJ IDEAが起動しました。

 

コンテキストメニューからダイアログを開く」機能を追加する

IntelliJ Platform Plugin TemplateのREADMEにはプラグインの作り方は記載されていなかったので、別のドキュメントを探すことにしました。

まず、 IntelliJ Platform SDK のドキュメントを見に行きましたが、量に圧倒されてしまいました。
IntelliJ Platform SDK | IntelliJ Platform Plugin SDK

 
そこで、まずは簡単なプラグインを作るところから始めようということで、チュートリアル的に書かれている以下のブログを読みました。

 
上記のブログを読んだところ、「エディタコンテキストメニューからダイアログを表示する」プラグインを作るのが最初の一歩として良さそうに感じましたので、作っていきます。

 
まずは、公式SDKドキュメントに

The action implementation determines the contexts in which an action is available, and its functionality when selected in the UI.

 
https://plugins.jetbrains.com/docs/intellij/basic-action-system.html

とあるような、アクションと呼ばれる機能を作成してみます。

そこで、 src/main/kotlin/com/github/thinkami/hellojetbrainsplugin/actions/HelloAction.kt ファイルを作成し、 AnAction を継承したActionのクラスを実装します。

ダイアログの表示は Messages.showMessageDialog を使うことで実現できます。

package com.github.thinkami.hellojetbrainsplugin.actions

import com.intellij.openapi.actionSystem.AnAction
import com.intellij.openapi.actionSystem.AnActionEvent
import com.intellij.openapi.ui.Messages

class HelloAction: AnAction() {
    override fun actionPerformed(e: AnActionEvent) {
        Messages.showMessageDialog(buildString {
            append("ハロー")
        }, "ワールド", null)
    }
}

 
続いて、

Registration determines where an action appears in the IDE UI. Once implemented and registered, an action receives callbacks from the IntelliJ Platform in response to user gestures.

 
https://plugins.jetbrains.com/docs/intellij/basic-action-system.html

のように、アクションを呼び出す方法を定義します。

今回は「エディタのコンテキストメニューから上記のActionを起動する」設定を定義します。

そこで、 src/main/resources/META-INF/plugin.xml を開き、末尾にActionの呼び出しを追加します。

<idea-plugin>
    ...
    </applicationListeners>

    <actions>
        <action id="com.github.thinkami.hellojetbrainsplugin.actions.HelloAction"
                class="com.github.thinkami.hellojetbrainsplugin.actions.HelloAction"
                text="Hello Action"
                description="hello world action">
            <add-to-group group-id="EditorPopupMenu" anchor="first" />
        </action>
    </actions>
</idea-plugin>

 

動作確認

先ほどと同様、 Run Plugin を実行し、IntelliJ IDEAを起動します。

今回の機能はエディタでコンテキストメニューを開く必要があるため、適当なKotlinプロジェクトを探してみます。

すると、 Kotlin Programming Tutorial for Beginners と書かれているリポジトリがありました。
https://github.com/smartherd/KotlinTutorial

今回はこれを使うことにして、 Get from VCS 機能にてローカルにclone・プロジェクトを開きます。

 
適当なkotlinのファイルを開き、エディタ上で右クリックしてコンテキストメニューを表示したところ、 Hello Action というメニューがありました。

 
このメニューをクリックしたところ、Hello world的なダイアログが表示されました。

 
以上より、今回やりたかったことは実現できました。

 

ソースコード

Githubにあげました。
https://github.com/thinkAmi-sandbox/hello_jetbrains_plugin

今回のプルリクはこちら。
https://github.com/thinkAmi-sandbox/hello_jetbrains_plugin/pull/9

 

Github Actionsの様子

ちなみに、プルリクを作ったところ、IntelliJ Platform Plugin Template に設定されていたようで、Github ActionsによるCIが自動実行されました。

 
最終的にはこんな感じになりました。