Sublime Text 2 で Play2 Scala しよう

このエントリーをはてなブックマークに追加
  

みなさんこんばんわ@ikeike443です。

Playframeworkしてますか? Scalaしてますか? 僕らは最近してますよ!

つい先日、不肖私はじめ日本Playframeworkユーザー会主催で勉強会をやりました。Play盛り上がってるね!
勉強会の模様は、私の個人ブログにいずれ書くので(遅れていてすみません。。)、しばらくお待ちください。下記のブログが一番まとまっているのでご参考に!

http://d.hatena.ne.jp/absj31/20120714/1342401472


ところで、僕はプログラミングには大体IntelliJ IDEAかEclipseみたいなIDEを使うことが多いのですが、今回、Sublime Text 2 というエディタに乗り換えようと試みているので、その過程で設定したことなんかについて書こうかなと思います。

なんで乗り換えようとしてるの? 

良い質問ですね。IDEAのScala Pluginがとても重くて段々耐えられなくなったからですよ。Scalaって今のところまだまだIDEの恩恵を受けにくいなと思ってます。呼出階層は綺麗に出ないですし、コード補完も上手く効かない場合がちょこちょこあります。
これは時間が解決するとは思ってますが、とりあえず当面はこの感じであれば、いっそ軽いエディタに乗り換えたほうが生産性上がるよねッ、と思った次第です。

加えて、Playframeworkは自動コンパイル機能を持っていて、ブラウザをリロードすればコンパイルエラーには気づけるし、IDEに頑張ってもらわなくても大丈夫かなーと思えたのも大きいです。
Playframeworkのコアメンバーたちも、Guillaumeはじめ、IDEを使わずにTextMateやSublime Text 2を使ってることが多い、ってのも乗り換えを決めた理由の一つになります。


ってことで、Sublime Text 2 で Play2 Scala するために僕なりに設定したことをいかにまとめておきます。何かの参考になれば。


Sublime Text 2 をインストール


下記からダウンロードしましょう。特に難しいことはないと思います。
http://www.sublimetext.com/2

次に、Package Controllというパッケージ管理機能を入れて、適当に好きなプラグインを入れましょう。
下記のブログを見ながらやればいいと思います。DevBuildsを入れろって書いてありますが、無理にDevBuildsを入れなくてもいいと思います。
http://publicdraft.studiomohawk.com/research/2012/04/14/01-02-sublimetext2/

僕はVimキーバインドが好きなので下記を参考に設定しました。
http://blog.agektmr.com/2012/05/sublime-text-2.html


Playframework2用のスニペットを入れる

次にPlay2用のスニペットを入れましょう。Guillaumeが作ったものがあります。
https://github.com/guillaumebort/play2-sublimetext2
設定の仕方は書いてあるとおりですが、Macの場合は下記のとおりです。
$ cd ~/Library/Application\ Support/Sublime\ Text\ 2/Packages/
$ git clone git://github.com/guillaumebort/play2-sublimetext2.git play2

これで、下記のようにPlay2のスニペットが動くようになります。


頭文字を打つと候補が出てきて...

Enterを押下するとこんな感じで展開されます


Ctagsを入れてコードジャンプを実現する

Sublime Text 2 の Package Control から CTags プラグインを入れましょう。
CTagsプラグインを入れたら、あとはコードジャンプを実現したいソースツリーに対してctagsコマンドを使って辞書ファイルを作ってやればいいです。
下記に説明があります。
https://github.com/SublimeText/CTags

ですが、いくつかやっておかないといけないことがあります。
まず、ctagsはScalaに対応していないっぽいので、その対応をしてやる必要があります。


Scala用のctags設定を書く

下記を参考に書きましょう。
http://scala-programming-language.1934581.n4.nabble.com/Simple-ctags-etags-support-td1939562.html

~/.ctags に下記を書きます。 ~/.ctags ファイルが存在しない場合は作りましょう。
--langdef=scala --langmap=scala:.scala 
--regex-scala=/^[ \t]*class[ \t]+([a-zA-Z0-9_]+)/\1/c,classes/ 
--regex-scala=/^[ \t]*trait[ \t]+([a-zA-Z0-9_]+)/\1/t,traits/ 
--regex-scala=/^[ \t]*type[ \t]+([a-zA-Z0-9_]+)/\1/T,types/ 
--regex-scala=/^[ \t]*def[ \t]+([a-zA-Z0-9_]+)/\1/m,methods/ 
--regex-scala=/^[ \t]*val[ \t]+([a-zA-Z0-9_]+)/\1/C,constants/ 
--regex-scala=/^[ \t]*var[ \t]+([a-zA-Z0-9_]+)/\1/l,local variables/ 
--regex-scala=/^[ \t]*package[ \t]+([a-zA-Z0-9_.]+)/\1/p,packages/ 

ctags コマンドを実行して辞書を作る

前掲のここにも説明が書いてありますが、MacOSXの場合、デフォルトで入っているctagsは-Rオプションが動作しないため、HomeBrewで入れなおしたほうがいいです。
また、~/.MacOSX/environment.plistも書いておいた方がいいです。/usr/local/binが優先になるように。下記のように。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>PATH</key>
<string>/usr/local/bin:/usr/bin:/bin</string>
</dict>
</plist>

上記設定ができたら、Scalaのソース、Playframeworkのソース、プロジェクトのソース、それぞれにおいてctagsを使って辞書を作ります。

Scalaの場合はソースコードがjarで落ちてくると思うので、unzipしてやってからctagsしたほうがいいです。ここでは、かなり適当ですがdecompsrcというディレクトリを作って、そこに解凍しておきました。
$ pwd
/Users/xxxx/scala-2.9.2
$ /usr/local/bin/ctags -f .tags -R decompsrc/scala/


Playframeworkについては、Javaは使わずScalaのコードだけを対象にした場合、下記のようなイメージで実行すると良いです。
$ pwd
/Users/xxxx/play-2.0.2
$ /usr/local/bin/ctags -f .tags -R framework/src/play/src/main/scala framework/src/anorm/src/main/scala framework/src/console/src/main/scala framework/src/play-test/src/main/scala framework/src/templates/src/main/scala framework/src/sbt-plugin/src/main/scala

最後にプロジェクト自身の辞書をつくります。
$ /usr/local/bin/ctags -f .tags -R . 

Sublime Text 2 の CTags 設定を書く

設定ファイルは ~/Library/Application\ Support/Sublime\ Text\ 2/Packages/CTags/CTags.sublime-settings にあります。開くと下記のようになっています。
{
    "debug"           :  false,
    "ctags_command"   :  "ctags -R -f .tags",
    "filters"         :  {
        "source.python": {"type":"^i$"}
    },
    "definition_filters": {
        "source.php": {"type":"^v$"}
    },
    "definition_current_first": false,
    "show_context_menus": false,
    "extra_tag_paths" :  [ [["source.python", "windows"], "C:\\Python27\\Lib\\tags"]],
    "extra_tag_files" : [".gemtags"]
}

上記中の、"extra_tag_paths"に、下記のように設定して、ScalaとPlayframeworkの辞書を見に行くようにします。
{
    "debug"           :  false,
    "ctags_command"   :  "ctags -R -f .tags",
    "filters"         :  {
        "source.python": {"type":"^i$"}
    },
    "definition_filters": {
        "source.php": {"type":"^v$"}
    },
    "definition_current_first": false,
    "show_context_menus": false,
    "extra_tag_paths" :
     [ 
       [["source.scala", "osx"], "/Users/shanon/scala-2.9.2//.tags"],
       [["source.scala", "osx"], "/Users/shanon/play-2.0.1/.tags"],
       [["source.python", "windows"], "C:\\Python27\\Lib\\tags"]
     ],
    "extra_tag_files" : [".gemtags"]
}

上記中の ["sources.scala", "osx"] という配列ですが、1つ目の要素がファイルの種類で、2つ目の要素がプラットフォームの設定のようです。どこにもそんな説明はありませんがw
でもって、このプラットフォームの文字列をどう書けばいいのか分からなかったのですが、MacOSXは"osx"でいい模様。大文字だとダメなので気をつけた方がいいです。

このへんもやっぱりドキュメントに書いてないので、Ctagsプラグインのコードを読みました。
下記参照です。
https://github.com/SublimeText/CTags/blob/master/ctagsplugin.py


上記コード中の、
sublime.platform() == platform

でプラットフォームの判定をしているので、sublime.platform() の出力がわかればいいのかと。
Sublime Text 2 上で、Ctrl+` をして Pythonインタプリタを起動し、そこで sublime.platform() と実行してやるとその場で出力が出ますので、適切な文字列が分かると思います。。
Pythonインタプリタに打ち込むと...
おー、なんか出た。これでいいっぽい。


ここまで設定すると、下記のようなイメージでコードジャンプが出来るようになります。
お疲れ様でした!
Controllerの上でNavigate to Definitionを選択すると...
見事! Playframeworkのソースコードにジャンプしました


さて、終わりです

もっとこうしたほうがいいよ!ってのがあればぜひぜひ教えて下さい!
このブログへのコメントでも、私のTwitterへメンション飛ばしてくれても、どちらでも結構です。

では~
次の記事
« Prev Post
前の記事
Next Post »
Related Posts Plugin for WordPress, Blogger...