IntelliJでプラグインを作りたいなと思うものがあったのですが、Scala開発用のものだし、JetBrainsからScalaでプラグインを開発するためのsbt-idea-pluginというsbtプラグインも提供されているようなので折角なのでScalaでIntelliJプラグインを作る方法を調べてみました。
上記のsbtプラグインのREADMEに書かれているのですが、GitHub上でこのsbtプラグインを使用したサンプルプロジェクトのテンプレートが公開されています。
このテンプレートリポジトリからリポジトリを作成し、cloneしてきてIntelliJで開くとプラグインの開発を行うことができます。
が、このテンプレートリポジトリはあまりメンテされていないようで、sbtやIntelliJのバージョンなど色々古かったのでアップグレードするためのプルリクエストを出してみました。以降はこの修正を取り込んだものとして話を進めます。
プラグインの動作を確認するには sbt runIDE
を実行します。すると以下のようにサンプルプラグインがインストールされたIntelliJが起動します。
このサンプルプラグインはToolsメニューに「Action Basics Plugin: Pop Dialog Action」というメニューアイテムを追加しており、クリックすると以下のようなダイアログが表示されます。
プラグインの配布用アーカイブを作成するには sbt packageArtifactZip
を実行します。するとtargetディレクトリにMyAwesomeFramework-0.0.1-SNAPSHOT.zipというファイルが作成されますので、プラグインマネージャで「Install Plugin from Disk」を選択し、このファイルを選択することでプラグインをインストールできます。
sbt-idea-pluginはこの他にも作成したプラグインをJetBrainsのプラグインレジストリにpublishするためのタスクなど様々なタスクを提供しています。
プロジェクトの構造ですが、src/main/resources/META-INFにplugin.xmlというファイルがあり、このファイルでプラグインの拡張ポイントに対して拡張を宣言し、指定したクラスを実装していくという感じのようです。
<idea-plugin> <id>me.and.co.my.awesome.framework</id> <name>My Awesome Framework</name> <version>0.0.1-SNAPSHOT</version> <vendor>Me and Co</vendor> <description>A new plugin for IntelliJ platform written in Scala and built with SBT</description> <idea-version since-build="203.0"/> <depends>com.intellij.modules.platform</depends> <depends>com.intellij.properties</depends> <resource-bundle>messages.SamplePluginBundle</resource-bundle> <actions> <action id="org.jetbrains.scala.samples.actions.PopupDialogAction" class="org.jetbrains.scala.samples.actions.PopupDialogAction"> <add-to-group group-id="ToolsMenu" anchor="first"/> </action> </actions> <applicationListeners> <listener class="org.jetbrains.scala.samples.listeners.FileOpenedListener" topic="com.intellij.openapi.fileEditor.FileEditorManagerListener"/> </applicationListeners> <extensions defaultExtensionNs="com.intellij"> <notificationGroup displayType="BALLOON" id="My Plugin Notification" /> <toolWindow factoryClass="org.jetbrains.scala.samples.ui.MyToolWindowFactory" id="MyToolWindow" anchor="bottom"/> <completion.contributor implementationClass="org.jetbrains.scala.samples.completion.SimpleCompletionContributor" language="Properties"/> </extensions> </idea-plugin>
ScalaでのIntelliJプラグインの開発については英語でもあまり情報がありませんが、IntelliJのScalaプラグインが参考になります。