EclimでJavaの開発環境構築をしました。同様にちょっとしたScalaのアプリを書きたい時にEclipseやIntelliJ IDEAを起動するのも重たいのでいつものEmacsでScalaの開発環境を構築します。
開発用の仮想マシン
クラウド上にUbuntu 16.04.3の仮想マシンを用意してパッケージを更新しておきます。
$ sudo apt-get update && sudo apt-get dist-upgrade -y |
SDKMAN!
SDKMAN!はGradleやsbtなどJVM言語のSDK管理ツールです。最近ではJavaのバージョン管理もできるようになりました。
ワンライナーでSDKMAN!をインストールします。
$ curl -s get.sdkman.io | /bin/bash |
Java
SDKMAN!を使ってインストールできるJavaのバージョンを一覧します。
$ sdk list java |
OpenJDKベースのZuluの8を使います。
$ sdk install java 8u131-zulu |
シェルを起動し直して$JAVA_HOME
環境変数を確認します。
$ echo $JAVA_HOME |
Scalaとsbt
Scalaのインストール可能なバージョンです。
$ sdk list scala |
Scalaを最新の2.12.3
をインストールします。
$ sdk install scala 2.12.3 |
続いてsbtです。バージョンを指定しない場合は最新がインストールされます。
$ sdk install sbt |
Emacs
Emacs24とCaskをインストールします。
$ sudo apt-get install emacs24-nox emacs24-el -y |
パッケージ管理のCaskです。インストールする時にGitとPythonが必要です。
$ sudo apt-get install git python -y |
~/.emacs.d
ディレクトリに以下のような設定ファイルを用意します。
$ tree ~/.emacs.d/ |
init.elはinit-loaderで分割したい場合は前回の設定を確認してください。
- ~/.emacs.d/init.el
(require 'cask "~/.cask/cask.el") |
Caskにインストールするパッケージを記述します。
- ~/.emacs.d/Cask
(source gnu) |
~/.emacs.d
ディレクトリに移動してパッケージをインストールします。
$ cd ~/.emacs.d |
ユーザーごとの設定
sbtプラグインのsbt-ensimeはユーザー単位にインストールします。プラグインのディレクトリがない場合は作成します。
$ mkdir -p ~/.sbt/0.13/plugins/ |
plugins.sbt
sbtプラグインのsbt-ensimeをインストールします。ホームの~/.sbt
にplugins.sbtを作成します。
- ~/.sbt/0.13/plugins/plugins.sbt
addSbtPlugin("org.ensime" % "sbt-ensime" % "1.12.14") |
global.sbt
sbt-ensimeプラグインの設定を記述します。
- ~/.sbt/0.13/global.sbt
import org.ensime.EnsimeKeys._ |
カスタマイズの内容は以下を参考にしました。
scala_2.11
ディレクトリを作成しない
ensimeConfig creates directories java and scala-2.11, which I don’t needC-c
でプロセスをキャンセルする
Cancel Proceses
プロジェクトごとの設定
簡単なsbtプロジェクトを作成してEmacsからENSIMEを利用してみます。
$ mkdir -p ~/scala_apps/spike && cd ~/scala_apps/spike |
build.sbt
プロジェクト定義をbuild.sbtに書きます。ScalaのバージョンはSDKMAN!でインストールした2.12.3
から2.11.8
に変えてみました。
- ~/scala_apps/spike/build.sbt
name := "Spike" |
.ensime
プロジェクトのトップディレクトリでsbtを起動します。ensimeConfig
コマンドを実行して.ensime
ファイルを作成します。
$ cd ~/scala_apps/spike |
ENSIMEの使い方
作成したScalaプロジェクトに簡単なHello Worldのコードを書きます。
起動
.ensime
ファイルがあるプロジェクトのトップディレクトリでEmacsを開きます。ENSIMEサーバーの起動には少し時間がかかります。
M-x ensime |
ミニバッファにメッセージが出るとサーバーの起動終了です。
ENSIME ready. May the source be with you, always. |
HelloWorld.scala
mainメソッドを実装したScalaのコードを書きます。
object HelloWorld { |
scala-mode
scala-modeはENSIMEをインストールすると自動的に使えます。個別インストールも可能です。Scalaのコードを書く場合の基本的なモードです。例えばEmacsからScala REPLを起動してみます。キーバインドの意味はcontrol を押しながらc、v、controlを離してz
です。
C-c C-v z |
プロジェクトのbuild.sbtに定義した2.11.8
のREPLが起動しました。
Welcome to Scala 2.11.8 (OpenJDK 64-Bit Server VM, Java 1.8.0_131). |
sbt-mode
sbt-modeも自動的に使えます。このモードではEmacsからsbtを操作するときに使います。sbtのセッションを起動します。
M-x sbt-start |
runコマンドはプロジェクトのmainメソッドをプログラムを実行します。Hello worldが表示されました。
> run |