EmacsでつくるScala開発環境 前編(scala-mode)

Emacsでのscala開発環境をご紹介。


ちょっと量が多いので2回に分けます。
前編はscala-mode
後編はENSIME(scala IDE)


今日は前編
scala-modeについて


scala-mode

インストール

Emacsにはデフォルトでscala用のモードは入っていません。
自分でscala-modeをインストールする必要があります。
scala-modeはScalaの配布パッケージに含まれています。


まずscalaのtarをダウンロードします。
現在の安定板は2.8.0.finalです。


まずはダウンロード

    $ wget http://www.scala-lang.org/downloads/distrib/files/scala-2.8.0.final.tgz


展開します。

    $ tar zxvf scala-2.8.0.final.tgz


scala-2.8.0.final/misc/scala-tool-support/emacs 以下にemacs用のelファイルがまとめて入っています。
ディレクトリごと~/.emacs.d以下に持っていきましょう。そしてついでに名前も変更

    $ cp -r scala-2.8.0.final/misc/scala-tool-support/emacs ~/.emacs.d/scala-mode


次にemacsの設定をします。設定ファイル(.emacsやinit.el)に次のように書きます。

    (add-to-list 'load-path "~/.emacs.d/scala-mode")
    (require 'scala-mode-auto)


scala-modeをインストールすると、scalaのファイルを開くと自動的scala-modeになります。

もし自動でscala-modeにならなかったら次の1行を設定ファイルに加えてください。

    (add-to-list 'auto-mode-alist '("\\.scala$" . scala-mode))

以上でインストール完了です。

使い方

このモードには便利なコマンドがいくつかあります。
是非使いましょう。


まずは
M-x scala-run-scala
scalaインタプリタが起動し、*inferior-scala*バッファが開きます。


これで次のようなコマンドが使えるようになります。

Ctrl-c Ctrl-b
scala-eval-buffer
Ctrl-c Ctrl-r
scala-eval-region
Ctrl-c Ctrl-l
scala-load-file

scala-eval-buffer は今編集しているバッファを評価します。
やってみましょう。
def Hello = println("Hello")
とバッファに入力。


ここでCtrl-C Ctrl-b(scala-eval-buffer)。すると


バッファ内が評価され、*inferior-scala*バッファにその結果が吐かれました。


*inferior-scala*バッファはもちろん普通のscalaインタブリタとしても使えます。
*inferior-scala*バッファに移動し、さっき評価したHello関数を呼んでみましょう。

ほら。


scala-eval-regionもscala-load-fileもこれと似たようなコマンドです。
コマンド名の通り、scala-eval-regionは選択した範囲を評価、scala-load-fileは指定したファイルをロードします。


*inferior-scala*バッファはEmacs上からscalaインタプリタ使えるってだけで便利です。
自分は↓こうやって編集バッファと*inferior-scala*バッファとの間を
Ctrl+c Ctrl+zで行き来できるようにしてます。

    (defvar my-scala-current-buffer nil)

    (defun my-scala-switch-to-interpreter ()
      (interactive)
      (setq my-scala-switch-to-interpreter (current-buffer))
      (unless (scala-interpreter-running-p-1)
	(scala-run-scala "scala"))
      (scala-switch-to-interpreter))

    (defun my-scala-back-to-editing-buffer ()
      (interactive)
      (switch-to-buffer my-scala-current-buffer))

    (define-key scala-mode-map "\C-c\C-z" 'my-scala-switch-to-interpreter)
    (define-key scala-mode-inf-map "\C-c\C-z" 'my-scala-back-to-editing-buffer)
scala-electric-mode

scala-modeと一緒にscala-electric-modeっていうのがあるのでこいつも使いましょう。
ruby-mode に ruby-electric-modeってのくっついてますよね。あれと同じ。

設定ファイルに次のように付け加えてください。

    (require 'scala-mode-feature-electric)
    (add-hook 'scala-mode-hook
	      (lambda ()
		(scala-electric-mode)))

{ を入力すると勝手に } を入力してくれたりします。



以上、scala-modeの紹介でした。

次回はENSIMEについて。お楽しみに。


2010/10/30 追記
scala-mode + imenu - tototoshiの日記
scala-modeでimenu使えるようにする設定

2010/11/1 追記
scalaのタグジャンプ
Scala + Emacs + ctags - tototoshiの日記

2011/2/13追記
scala-modeで*inferior-scala*をポップアップさせるadvice - tototoshiの日記