IntelliJ IDEAのプラグイン開発

ScalaでIntelliJのプラグインを作ろうと思ったのでメモついでに。

参考

http://confluence.jetbrains.net/display/IDEADEV/PluginDevelopment
http://www.jetbrains.com/idea/training/demos/google_search.html
下のLive Demoと同じものを作るところまでやってみます。

環境設定

IntelliJのJDKScalaライブラリの設定、Scalaプラグインのインストールは済んでいるとします。

IntelliJ IDEA Community Editionをインストール

次の設定に使うもので、開発はUltimate Editionでするとしてもこちらも入れる必要がありそうです。*1
今回はちょっと試してみたかったのでIntelliJ IDEA 11(Nika)のEAP(記事時点でbuild110.187)をここから取ってきてインストール。
ソースも一緒にダウンロードするか、リポジトリから取ってきます。

git clone git://github.com/JetBrains/intellij-community.git
git checkout idea/110.187
IntelliJ IDEA Plugin SDKの設定

開発に使うIntelliJを起動します。自分はNika Ultimateを別にインストールして使いましたが、先にインストールしたものでもいいはずです。
File > Project Structure > Platform Settings > SDKs から「+」ボタンで「IntelliJ IDEA Plugin SDK」を追加。
f:id:kxbmap:20111031024057p:image
SDKのホームを求められるのでCommunity Editionのパスを指定します。次にJDKも選択。
追加されたSDKのSourcepathにダウンロードしたソースのディレクトリを追加します。
f:id:kxbmap:20111031024058p:image:w480

新規プロジェクト作成

File > New Project... からCreate project from scrachを選びます。
Plugin Moduleを選択、プロジェクト名などを入力します。
f:id:kxbmap:20111031030508p:image:w480
Nextを押していき、最後に先程設定したSDKを選択、Finishを押してプロジェクトを作成します。
f:id:kxbmap:20111031031342p:image:w480

プロジェクト設定

Scalaで開発できるように設定します。いらなければ飛ばしてOK。
File > Project Structure > Project Settings > Modules からScala Facet*2 *3とDependenciesにscala-libraryを追加*4します。
f:id:kxbmap:20111031032444p:image:w240:left
f:id:kxbmap:20111031032445p:image:w240

これで準備完了です。

プラグイン作成

最初に貼ったデモ内で作成しているプラグインを作ります。エディタのカーソル位置にある単語をブラウザ起動してGoogle検索するものです。

META-INF/plugin.xml

プロジェクト作成時にplugin.xmlというファイルが生成されています。プラグインの情報などはこのファイルに書いていくようです。
f:id:kxbmap:20111031034206p:image:w480
各要素を設定していきます。プラグインの名前、説明、バージョン、ベンダーと。
idea-versionはsince-buildやuntil-build属性にプラグインの動作するIntelliJのビルド番号を指定します。互換性についてはよく調べてないですが*5、とりあえずsince-buildにSDKに利用しているIntelliJのビルド番号を入れておきます。

新規アクションを作成

src以下にパッケージを作成し、NewからActionを選びます。
f:id:kxbmap:20111031040525p:image
新規アクションの設定ウィンドウが開くので諸々入力します。
Toolsメニューの最後に「Search in Google」という表示で追加されるように設定。ショートカットもここで設定します。
f:id:kxbmap:20111031040526p:image:w480
パッケージ内にAnActionというクラスを継承したJavaクラスが作成され、plugin.xmlのactionsにactionが追加されています。
f:id:kxbmap:20111031041531p:image:w240:left
f:id:kxbmap:20111031041532p:image:w240

Scala!

生成されたJavaクラスを開いた状態で Cmd+Shift+G を押します。
f:id:kxbmap:20111031042155p:image:w480
Scalaクラスに変換されました。元のJavaクラスも残ってるので消しちゃいましょう。
デモのコードと同じものをScalaで書きます。

実行

実行設定

Run > Edit Configurations を開き、「+」ボタンから Plugin を選んで追加します。
が、今のバージョンのNikaがちょっとバグってる模様。追加された実行設定のVM Optionsに内部の設定ファイルのxmlがそのまま出ちゃってるっぽい。
f:id:kxbmap:20111031050244p:image:w480
ちょっと別にIntelliJインストールして確認。以下のような感じで設定しておけばよさそうです。

-Xms128m
-Xmx512m
-XX:MaxPermSize=250m
-XX:ReservedCodeCacheSize=64m
-ea
Run!

緑三角の実行ボタンかShift+F10を押すと、起動中のものとは別にIntelliJが起動します。
f:id:kxbmap:20111031051450p:image:w480
プラグインマネージャーを開くと作成したプラグインがインストールされていることが確認できます。
f:id:kxbmap:20111031051805p:image:w480
Toolsメニューを開くと下の方に追加したアクションが表示されてます。まだエディタを開いていないので非アクティブです。
f:id:kxbmap:20111031052112p:image
適当なプロジェクトを開いて設定したショートカットを押すとカーソル位置の単語がググられました!
f:id:kxbmap:20111031054510p:image:w480

*1:Community Editionじゃないとcore codeのデバッグが出来ないみたいなことが書いてある

*2:Scala Facetの設定はいつの間にか充実してるなー。内部FSCやらCompiler Pluginの設定やら

*3:ところで facet ってどういう意味です?

*4:最初DependenciesのAddボタンがどこに行ったのか分からなかったですが、リストの下にまとめられてます

*5:IntelliJ IDEA 10向けのプラグインはNikaではちゃんと動かないようです。ScalaプラグインのNightly buildも10向けと11向けで別になってます