はじめに
この記事を書いて以来、各方面への説明に追われてしまい、しばらく触るための時間的及び精神的な余裕が取れていなかったScalaですが、そろそろ再開できる見通しとなりました。
Scalaの利用を再開するにあたり、Eclipseを使った開発環境の準備と並行して、Emacsを使った開発環境を準備できないか検討することにしました。
この記事ではWindows 10及びEmacs 26並びにSBT-1.3.0-RC1を使ってScala言語による統合開発環境のようなものを構築する方法について書いていきます。
構築の手順
Scala言語による統合開発環境のようなものを構築するには、以下の2種類の作業が必要です。
- ScalaのCUIによる開発環境のセットアップ。
- Emacsのインストール及び関連するLispパッケージのインストール並びにセットアップ。
ScalaのCUIによる開発環境のセットアップ。
Windows 10におけるScalaのCUIによる開発環境のセットアップは、以下の手順で行います。
インストール
開発環境のセットアップのために必要なソフトウェアのインストールは、以下の手順で行います。
- JDKをインストールします。今回はAmazon Corrette 11をインストールしました。インストールのいきさつやインストールの具体的な方法についてはこちらをご参照ください。
- ここのページからSBTのインストール用パッケージをダウンロードします。今回の作業ではバージョン1.3.0-RC1のMSIインストーラをダウンロードしました。
- 手順2でダウンロードしたMSIインストーラを起動し、インストールを行います。この手の開発用のツールのインストール時の今までの経験上、インストール先のディレクトリ名にスペースが入っていると大変な目に遭うことが多いので、インストール先のディレクトリ名は以下のように指定します。
c:\sbt
- SBTのインストールを行います。
動作確認
ScalaのCUIによる開発環境のセットアップが終わったら、以下の手順で動作確認をします。
- 以下のようなディレクトリ階層を持つ動作確認用のプロジェクト(HelloWorldプロジェクト)を作成します。
HelloWorld +-src-+ | +-main-+ | +-scala-+ | +-info-+ | +-pandanote-+ | +-test-+ | +-main.scala +-build.sbt
build.sbtはsrcディレクトリと同一のディレクトリ階層(HelloWorldディレクトリの直下)に作成します(下図)。
- main.scalaには以下のような動作確認用のコードを書きます。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersobject HelloMain { def main(args: Array[String]) = { var sum: Int = 0 (1 to 10).foreach( s => ((x: String) => println(x))(s.toString) ) (1 to 10).foreach( s => ((x: Int) => { sum += x println(sum.toString) })(s)) } } - build.sbtにはビルド時の設定を以下のような感じで書きます。SBTの動作確認用なので、SBT-1.3.0-RC1で使用可能かつ必要最低限の設定としています。なお、scalaVersionにはこの記事を最初に書いた時点(2019年5月)で入手可能なScalaの最新バージョンを指定していますが、versionの設定は適当です。
version := “0.1.1-SNAPSHOT” scalaVersion := “2.12.8”
- コマンドプロンプトを開き、cdコマンドでカレントディレクトリをHelloWorldディレクトリの下に変更してからsbtコマンドを実行します。
- sbtのコマンドプロンプトが起動しますので、以下のように入力すると、main.scalaのコンパイルが実行されます。
sbt:helloworld> compile
以下のように表示されるとコンパイルは成功です。[success] Total time: … sbt:helloworld> - sbtのコマンドプロンプトからrunコマンドを実行すると、コンパイルされたコードが実行されます。以下のように実行されると動作確認は成功です。(`・ω・´)
Emacs 26のインストール及びセットアップ
Emacsのインストール
スポンサーリンク
ScalaのCUIによる開発環境のセットアップができたら、以下の手順でEmacs 26をインストールします。
- このページからEmacs 26.2の日本語IME対応パッチ適用版のバイナリファイル(ZIPファイル)をダウンロードします。
- PC上の適当なディレクトリの下で手順1でダウンロードしたZIPファイルを展開します。
- 手順2で”emacs-26.2″というディレクトリが作成されますので、”emacs-26.2\bin”の下にある”runemacs”のショートカットをデスクトップなどの実行しやすい場所に作成します。
- お好みでショートカットのプロパティを開き、「作業フォルダー」の設定を変更します。本Webサイトの管理人たるpandaは自分のホームディレクトリを作業フォルダーに通常設定しています。
Emacsのパッケージアーカイブのセットアップ
インストールが終わったら、以下の手順でEmacsのパッケージアーカイブの設定を行います。
ホームディレクトリの下の”.emacs.d/init.el”に以下の記述を追加します(“.emacs.d/init.el”がない場合には作成します)。
上記の設定のうち、6行目のorgmodeについての設定はお好みで追加しておきます(設定しなくてもこの記事の範囲内においては影響ありません)。
ENSIME等のEmacs Lispパッケージのインストール及び設定
次に、ENSIME(the ENhanced Scala Interaction Mode for Emacs)を以下の手順でインストールします。
- Emacsを起動し、”M-x package-install”と入力します。なお、”M-x”とはEscキーを押した後で”x”キーを押すことを意味します(以下同じ)。
- Enterキーを押すと、ミニバッファに以下のように表示されますので、”use-package”と入力し
Enterキーを押します。
- byte-compileが完了後にミニバッファに”Done”と表示されれば、use-packageインストールは成功です。
- ホームディレクトリの下の”.emacs.d/init.el”に以下の記述を追加し、Emacsを再起動します。
(require ‘use-package) (use-package ensime :ensure t :pin melpa-stable)
- すると、ENSIMEがインストールされます。なお、ミニバッファに”M-x package-list-packages”と入力してEnterキーを押すとpackage-archivesに指定したアーカイブのリストにあるパッケージのインストール状況を確認することができます。確認例を下図に示します。
- ディレクトリ構造はEmacs内でツリー表示ができた方が都合がよいので、ホームディレクトリの下の”.emacs.d/init.el”に以下の記述を追加し、Emacsを再起動します。
(require ‘neotree) (global-set-key [f8] ‘neotree-toggle) (setq neo-smart-open t) (setq neo-show-hidden-files t)
上記の設定を追加することにより、F8キーを押すとバッファが2分割されて、左側のバッファにディレクトリ構造のツリービューが現れます。
このツリービューはもう一度F8キーを押すとバッファごと消去できますので、必要な時だけ表示させることができます。
ENSIMEを使用するためのScalaプロジェクト側における設定と動作確認。
前節までの手順はEmacsのインストール時に1回だけ行えばよい手順ですが、Scalaプロジェクト側では以下の手順をプロジェクトごとに行います。
- build.sbtに以下の行を追加し、ENSIMEで使用するScalaのバージョンを指定します。
ensimeScalaVersion in ThisBuild := “2.12.8”
- HelloWorldディレクトリの直下に”.ensime”という名前のファイルが生成されたことを確認します。これはENSIMEのための設定ファイルです。
- Emacsを起動し、カレントディレクトリをHelloWorldディレクトリにします。Emacsのカレントディレクトリの変更は”M-x cd”と入力してEnterキーを押した後でディレクトリ名をミニバッファに入力してEnterキーを押すと行うことができます。
- “M-x ensime”と入力してEnterキーを押すと、ENSIMEサーバが起動してEmacsはクライアントとしてENSIMEサーバとの間の接続を確立させます。ENSIMEサーバとの間の接続が確立するとその旨を通知するメッセージが一瞬だけ表示されて、以下の画面が表示されます。
- Scalaのソースコードを開き、構文チェックやメソッド名の補完が機能することを確認します(下図)。
ここまでの作業で、Windows 10上のEmacsでScalaのコードを編集できる環境を整えることができました。(`・ω・´)
EmacsからSBTが起動できない件
この記事を書くよりも前にTwitterでツイートした以下の件↓
Windows 10 + #amazoncorretto 11+ #sbt 1.3.0-RC1 + #Emacs 25.1で #scala の開発環境を構築しようとするも、Emacsからsbtの起動時にterminalの設定ができていない件(赤矢印)。コマンドプロンプトからのsbtの実行は問題ないので、それを使う方向でもいいのですが…#lifeinyokohama pic.twitter.com/MoQr3cCqed
— pandanote.info (@Pandanote_info) 2019年5月26日
ですが、Emacs 26.2でも同様の結果となってしまいました。
Windows 10上においては、
- コード等の編集はEmacs+ENSIME
- コンパイル及び実行等はコマンドラインのSBT
というように使い分けるしかなさそうです。(´・ω・`)
まとめ
Emacsの本格的なカスタマイズはこの記事を最初に書いた時点(2019年5月)から過去に遡ること10年以上行っていなかったのですが、MELPAのようなパッケージアーカイブができていたことには正直驚きました。Mavenみたいな使い方ができそうです。
Scalaはバージョンごとの仕様の違いがまだまだ大きいので、できるだけ最新のバージョンを使った方が良いと考えられる反面、EclipseやIntelliJ IDEAのような大型の統合開発環境(IDE)の最新のバージョンへの追従性には少々不安があるので、それらと比較して軽量であるEmacsで統合開発環境のようなものが実現できるのは助かります。
Emacsを使うことにより、Java界隈の喧騒から暫し離れて、気楽にコードを書くことができそうです(※個人の感想です)。
この記事は以上です。