Sublime Text 3 で Erlang 開発をする (Windows)

ここ１年ほど，Erlang で開発しています．

普段は IntelliJ Idea で開発しているのですが，Erlang は IDE の恩恵が少な目なので，もう少し軽い Sublime Text を試してみました．Windows に Emacs や Vim を入れたら負けかなと思っています(普通にLinux上ではvimで開発してますが)．

Windows上でErlangを使っている人がどれくらいいるのかわからない上に，さらに日本語が読めてSublime Text 3ユーザである人が世界にどれくらいいるのかは考えないことにします．

# Erlangの実行環境の用意

Windows上に Erlang をセットアップするところから始めます．なるべく初めてErlangで開発をする人も手順通りにやれば試せるように書いていきますが，基本的なErlangの使い方は分かっていることが必要です．

- おすすめ入門書： [すごいErlangゆかいに学ぼう! ](http://www.amazon.co.jp/dp/4274069125)(Amazon)

もうErlang使ってるよという方は，「Sublime Text 3 で開発する」のところまで読み飛ばして大丈夫です．

## 最低限インストールするもの

以下のものはほぼ必須です．

- Erlang/OTP 18
- Git
- rebar

## Erlang/OTP 18

http://www.erlang.org/

「OTP 18.1 Windows 64-bit Binary File」というのをいれたらいいです(2015年12月)．

erl コマンドを実行すると Erlangシェルが起動します．(`C:\Program Files\erl7.1\bin` 等がPATHに追加されていることを確認)

```bat
> erl
Eshell V7.1  (abort with ^G)
1> hoge.
hoge
2> Hoge = 1 + 1.
2
3> Hoge * 3.
6
4>
```

## Git

下記のrebarで取り扱うライブラリはほとんどgitリポジトリにあるので，Gitは必須です．

特にこだわりがなければ， https://git-for-windows.github.io/ を入れましょう．

## rebar

おそらく，多くのErlangプロジェクトで使われているプロジェクト管理ツールです．

https://github.com/rebar/rebar

時代はRebar3ですが，とりあえずRebarを入れます．

``` bat
> git clone git@github.com:rebar/rebar.git
> cd rebar
> bootstrap
```

bootstrap.batを実行すると `rebar` と `rebar.cmd` ができるので，パスが通った場所に置きます．
Windowsでバッチファイルよく使う人は， rebar.cmd の最後に `exit /B` を一行加えておくとcallで呼び出せるので良いと思います．

試しにrebarでアプリケーションを作ってみます．

``` bat
> mkdir testapp
> cd testapp
> rebar create-app appid=testapp
==> testapp (create-app)
Writing src/testapp.app.src
Writing src/testapp_app.erl
Writing src/testapp_sup.erl

> rebar compile
==> testapp (compile)
Compiled src/testapp_app.erl
Compiled src/testapp_sup.erl

> rebar eunit skip_deps=true
==> testapp (eunit)
  There were no tests to run.

> erl -pa ebin -eval "application:ensure_all_started(testapp)."
Eshell V7.1  (abort with ^G)
1>
```

何も実装していないので，何も起きないです．とりあえず何か処理したいという場合は `testapp_app:start/2` あたりに書くと動きます．

参考になる説明：

- https://github.com/rebar/rebar/wiki/Getting-started
- https://gist.github.com/voluntas/4243802


# Sublime Text 3 で開発する

まず， Sublime Text 3 と Package Control をインストールします．情報は多いので困ることは少ないと思います．

- Sublime Text 3 http://www.sublimetext.com/3
- Package Control https://packagecontrol.io/installation#st3

## Erlangパッケージ

標準でも.erlファイルのキーワードハイライトはしてくれます．

![st3_erlang1.png](https://qiita-image-store.s3.amazonaws.com/0/58515/36476e71-01f4-8cfb-0679-dff510fe0cd0.png)

このままでも開発できますが，IDEを使った開発に慣れてしまっていると，少し素朴すぎます．

- オートコンプリートほしい
- フォーマッタもほしい
- エディタ上からのeunit(単体テスト)の実行結果くらいは見たい

……検索するとSublime Text 3 (以下，ST3) で Erlang 開発をするためのパッケージはいくつかありますが，試した範囲かぎりだとWindowsでまともに動くものが見つかりませんでした．探し方が悪いのかもしれないので詳しい方いたらコメントいただけるとありがたいです．

| リポジトリ                               | ST3 | Windows | eunit等 | 備考       |
|:----------------------------------------|:---:|:-------:|:-------:|------------|
| https://github.com/ostinelli/SublimErl  |  ×  |  ×      |  ○      | オリジナル　|
| https://github.com/artemeff/Erl         |  ○  |  ×      |  ○      | ST3対応    |
| https://github.com/glymehrvrd/SublimErl |  ○  |  ×      |  ○      | ST3対応+α  |
| https://github.com/binzume/SublimErl    |  ○  |  ○      |  ○      | ↑をfork    |
| https://github.com/fjl/Sublime-Erlang   |  ×  |  ○?     |  ×      |            |

Sublime-Erlang 以外は，ostinelli/SublimErl から派生しています．
オリジナルの物はST2専用ですが，いくつかforkされて開発は継続しているようです．今回は glymehrvrd/SublimErl をforkして使いました．

使いつつ以下の修正を入れました．

- Windowsで最低限動くように
- 最新のSublime Textで動かなくなっていた個所を修正
- 外部のPythonに依存せず組み込みのPython33で動くように

(たいした修正じゃないので少し整理してfork元にPR投げたいところです)

### セットアップ

Sublime Text 3のメニューから「Preferences」→「Browse Packages…」

通常は `C:\Users\ユーザ名\AppData\Roaming\Sublime Text 3\Packages` です．

``` bat
cd "%APPDATA%\Sublime Text 3\Packages"
git clone https://github.com/binzume/SublimErl  
```

SublimErl/SublimErl.sublime-settings を編集．PATHを見て探す実装になってますがWindowsだと動いていないので，以下のように Erlang等の実行ファイルを設定します．

``` json
     "erl_path": "C:/Program Files/erl7.1/bin/erl.exe",
     "escript_path": "C:/Program Files/erl7.1/bin/escript.exe",
     "dialyzer_path": "C:/Program Files/erl7.1/bin/dialyzer.exe",
     "rebar_path": "C:/rebar/rebar.cmd",
```
設定する場合は .exe まで含めてフルパスで書く必要があります．

設定した後，erlファイルを編集しつつしばらく待つと，そのうち補間が効くようになります．バックグラウンドで標準ライブラリ等のソースを処理するので1分くらいかかります．処理の様子は SublimeTextで Ctrl + ` でコンソールを開くと出てきます．途中でエラーが起きた場合もここを見ます．


## 試す

Sublime Textのプロジェクトの設定はとりあえず以下のような感じにしてます．

``` json
{
	"folders":
	[
		{
			"path": ".",
			"folder_exclude_patterns": [".*"],
			"file_exclude_patterns": ["*.beam"]
		}
	]
}
```

.eunit下のファイルやbeamは邪魔なので除外．

あとは「File」 → 「Open Folder...」 でフォルダを開くか，sublimeのプロジェクトファイルを開けば使えます．
erlファイルを編集中に右クリックするとSublimeErlのメニューがあるはずです．

現在開いているファイルの eunit(もしくはct) は，`Ctrl + Shift + F8` で実行できます．ファイル名が _SUITE.erl で終わっている場合は Common Tests が実行されます．キーバインドは使いやすいようにカスタマイズするのが良いでしょう．

![st3_erlang02.png](https://qiita-image-store.s3.amazonaws.com/0/58515/5f2c0f93-09c1-dcd1-7d04-dda9f66ab214.png)

テストを実行すると下にパネルが出て結果が表示されます．

あとは，好みでBuild System とかも設定すれば普通に開発できると思います．

サンプルプロジェクト： https://github.com/binzume/cowboy_sample

今回，ST3の確認をしつつ書いたコードなので意味のアプリケーションではありませんが，簡単なjsonを返すwebアプリになってます．HTTPサーバにはCowboyを使っています．

## Windows + Erlang + ST3 で開発をする上での制限

### 標準ライブラリ内のコードにジャンプできない

Ideaだと `lists:foldl/3` とかの実装も簡単に確認できて便利だったので欲しいです．

### フォーマッタ

フォーマッタの設定などは無いので，気に入らない場合はSublimErlのコードいじる必要があります(sublimerl_formatter.erl)．

仕事で書いてるコードはEmacsスタイルのインデントなので，下記のようなRubyスクリプトをエディタの外部ツールとして登録して使っています．(emacsをフォーマッタとして使うとか，素直にemacsで開発しろという指摘は受け付けません)

Emacsっぽいスタイルのインデントにするスクリプト: https://gist.github.com/binzume/b599b1ec1d3b39882285

### HiPE使えない

基本的には使えません．公開されてるErlangのWindows向けバイナリもHiPEは無効になっています．HiPE有効な環境でコンパイルされたbeamは実行できてるように見えますが問題がありそう．

HiPE使ってるライブラリは，rebar.config等を編集してHiPE無効にする必要があります．

### NIFではまる

nifそのものはWindows上でも対応していて dll ファイルが生成されます．が，Windowsは考慮されてないライブラリも多く，たいていの場合泥沼にはまります．コンパイラは VisualStudio等の cl.exe が必要です．

### TODO
- まだちゃんと使ってないので使いつつ更新します

# まとめ

Windowsでの開発は嵌りどころも多いですが，少し頑張ればそれなりに快適に開発できる環境を作れます．