みなさんこんばんわ@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へメンション飛ばしてくれても、どちらでも結構です。
では~