ログ日記

作業ログと日記とメモ

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

scalaDebian sidのパッケージを入れたので、それに対応するやつ。
Debianscalaパッケージは依存関係がほぼ無いので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よりこっちの古い方が分かりやすい。