Emacs で Scala + Lift の環境を作る
ファイルを保存したらsbtが自動でコンパイルしてJRebelがclassファイルの自動リロードするなら、もうIDEである必要は無いんじゃね?ってことで。
mvn でプロジェクトを作って sbt updateするところまでは前回 *1と同じ。
scala-modeのためにソースをダウンロードする。
wget http://www.scala-lang.org/downloads/distrib/files/scala-2.9.0.1.tgz
scalaはDebian sidのパッケージを入れたので、それに対応するやつ。
Debianのscalaパッケージは依存関係がほぼ無いのでsidでも問題ない。ってことはパッケージ版を使わなくてもいいんだけど。
tar xvzf scala-2.9.0.1.tgz cp -a scala-2.9.0.1/misc/scala-tool-support/emacs ~/.emacs.d/plugins/scala-mode cp scala-2.9.0.1/misc/scala-tool-support/emacs/contrib/dot-ctags ~/.ctags aptitude install exuberant-ctags
http://d.hatena.ne.jp/tototoshi/20100925/1285420294
http://d.hatena.ne.jp/tototoshi/20100927/1285595939
ここを参考に。
wget https://github.com/downloads/aemoncannon/ensime/ensime_2.9.0-1-0.6.1.tar.gz tar xvzf ensime_2.9.0-1-0.6.1.tar.gz cp -a ensime_2.9.0-1-0.6.1 ~/.emacs.d/plugins/
.emacsを編集する。
;; scala (add-to-list 'load-path "~/.emacs.d/plugins/scala-mode") (require 'scala-mode-auto) (add-to-list 'auto-mode-alist '("\\.scala$" . scala-mode)) ;; (require 'scala-mode-feature-electric) ;; (add-hook 'scala-mode-hook ;; (lambda () ;; (scala-electric-mode))) (add-to-list 'load-path "~/.emacs.d/plugins/ensime_2.9.0-1-0.6.1/elisp/") (require 'ensime) (add-hook 'scala-mode-hook 'ensime-scala-mode-hook) ;;(define-key ensime-mode-map (kbd "C-.") 'ensime-edit-definition) (defadvice scala-block-indentation (around improve-indentation-after-brace activate) (if (eq (char-before) ?\{) (setq ad-return-value (+ (current-indentation) scala-mode-indent:step)) ad-do-it)) (defun scala-newline-and-indent () (interactive) (delete-horizontal-space) (let ((last-command nil)) (newline-and-indent)) (when (scala-in-multi-line-comment-p) (insert "* "))) (add-hook 'scala-mode-hook (lambda () (define-key scala-mode-map (kbd "RET") 'scala-newline-and-indent)))
インデントは http://www.callcc.net/diary/20101106.html ここに書いてあるものを使った。
scala-mode-feature-electric は何となく指に合わないのでコメントアウトしている。
cat ~/bin/sbt #!/bin/bash java -Xmx512M -jar `dirname $0`/sbt-launch.jar "$@" cat ~/bin/sbtj #!/bin/bash java -noverify -javaagent:/home/user/lib/jrebel/jrebel.jar \ -Drebel.lift_plugin=true -XX:+CMSClassUnloadingEnabled \ -XX:MaxPermSize=512m -Xmx512M -Xss2M -jar `dirname $0`/sbt-launch.jar \ "$@" cd project_dir sbt "~compile"
http://batsov.com/Java/Scala/Programming/2011/04/26/jrebel-with-scala.html
ここの通りにjrebel用のコマンドを作った。
別窓で
sbtj test-run
で RunWebApp を選択すると動的にリロードするサーバーが立ち上がる。
emacsを起動して M-x ensime-config-gen 後に M-x ensime する。起動が正直重い。etagsのみでいいかもしれない。
逆にensimeを使うなら、etagsは利用しないので exuberant-ctags や .ctags は不要。
ensimeをやめてもflymake が使えそう。 http://d.hatena.ne.jp/kiris60/20091004/1254586627
でもsbtのコンパイルが動きっぱなしならそれも不要かもしれない。
http://www.scala-lang.org/node/5940
この辺に emacs からsbtコンパイルの連携があるが…もう一歩という感じ。
SBTのコマンド
http://code.google.com/p/simple-build-tool/wiki/RunningSbt
githubよりこっちの古い方が分かりやすい。