快適Haskell環境構築！ (ghc-modがエラーで動かない方へ)

なんちゃってvimmerな私。
最近はAtomというエディターをvimモードで使っています。
Atomのいいところは、Packageが充実しているところと、そしてなによりvimの補完よりもはるかに(私のvimプラグインが脆弱なのかもしれないけど)Atomの補完の方が強力なところです。

さて、最近Haskellの勉強をはじめました。
いいHaskell環境をAtom (or Vim)で構築したいということでやってみましたが、結構難儀したので手順をまとめておきます。

- ghc-modを使いたいがインストール手順がわからない
- ネットで調べた手順でインストールし、PATHも通してるのに機能しない
- Atomの`haskell-ghc-mod`プラグインが`spawn ghc-mod ENOENT`というエラーを吐く

などでお困りの方に向けた記事です。


なお、私の環境としては、

- Mac OSX Yosemite (10.10.5)
- bashじゃなくてzshつかってます。
- vim 7.4.769
- Atom 1.1.0


## Haskellの導入
Glasgow Haskell Compiler、いわゆるGHCをインストールします。
こちらの記事を参考にしました。

- [Haskell :: GHCを再インストールでアップグレードする - Mac + Haskell + IntelliJ環境構築](http://blog.euphonictech.com/entry/2015/08/09/160801)

基本的には、こちらの記事の通りに進めていきます。

### 手順0 クリーンアンインストール(必要な場合のみ)

私はすでにGHCを入れていたので、クリーンアンインストールをしました。
上記引用サイトの通り、私の場合も`/usr/local/bin`と`/usr/local/lib`の2ヶ所にGHC関係のファイルは入っていたようなので、

`/usr/local/bin`で

```shell-session
$ ls -l | grep ghc
```

`/usr/local/lib`で

```shell-session
$ ls -l | grep ghc
```
とそれぞれやって関連ファイルを確認したのち、


```shell-session
$ sudo rm -rf ghc-7.8.3
```

とかこんな感じで関連ファイルを削除していきました。
さらに`~/.ghc`と`~/.cabal`も同様に削除します。

シェルで

```shell-session
$ ghc
bash: ghc: command not found
$ cabal
bash: cabal: command not found
```

と出たらアンインストール完了です。

### 手順1 GHC, GHCiのインストール

次に、新しくGHCをインストールしていきましょう。
アーカイブをダウンロードして解凍していきます。

```shell-session
$ curl -O http://downloads.haskell.org/~ghc/7.10.2/ghc-7.10.2-x86_64-apple-darwin.tar.xz
$ tar -xvzf ghc-7.10.2-x86_64-apple-darwin.tar.xz
$ cd ghc-7.10.2
```

ここで、先ほどのサイトのアドバイス通り、--prefixオプションをつけてインストールすることにします。
私の場合はsudoをつけないと--prefixオプションなんかてめぇが使うんじゃねぇって怒られました笑

```shell-session
$sudo ./configure --prefix=/usr/local/ghc-7.10.2
$sudo make install
```

次に`/usr/local/ghc-7.10.2/bin`のフォルダにパスを通すのですが、`.zsh_profile`でexport PATHみたいなことしても機能しなくて、私の場合は`.zshrc`の中で次の一行を追加しました。

```vim:.zshrc
export PATH="/usr/local/ghc-7.10.2/bin:$PATH"
```

最後に、確認。

```shell-session
$ ghc --version
The Glorious Glasgow Haskell Compilation System, version 7.10.2
```

ちゃんと出てきたら、GHCはインストールできたことになります。

### 関連パッケージのインストール
#### cabalのインストール

```shell-session
$ curl -O https://hackage.haskell.org/package/cabal-install-1.22.6.0/cabal-install-1.22.6.0.tar.gz
$ tar -xzf cabal-install-1.22.6.0.tar.gz
$ cd cabal-install-1.22.6.0
$ sudo ./bootstrap.sh
$ sudo cabal update
```

#### その他

```shell-session
$ cabal install happy
$ cabal install hlint
```

でその他必要なものもインストール完了です。
基本的に、ここまでのことはわりとすんなりいくはずです。


## ghc-modのインストール

さて、ここからが本題です。
ghc-modを使いたいうまくインストールできない、という人がいっぱいいるらしく、少しググるだけでghc-modのインストール方法はけっこう出てきます。
しかし、私の場合はそれをやってもうまくいきませんでした。

これも、はじめに参考にしたのは先ほど紹介したのと同じ方が書いてるこちらの記事。

- [Haskell :: 2015年8月現在ghc-modをghc 7.10.2にインストールする](http://blog.euphonictech.com/entry/2015/08/10/120000)


要するに、ふつうに`$ cabal install ghc-mod`とやってもうまくインストールできないよ、ということですね。
上記サイトによると、

1. gitをclone
2. ローカルビルド

とすればうまくいくと書いてありますが、私の場合はこれでは***うまくいきませんでした！***

ということで、ここからがこの記事の本領です笑

### まずは指示通りにgit cloneしてローカルビルド

```shell-session
$ git clone https://github.com/kazu-yamamoto/ghc-mod.git
```

(注)　参考サイトの通り、`$ git clone git@github.com:kazu-yamamoto/ghc-mod.git`だと、私の場合はエラーが出てダメでした汗

そしてローカルビルドしましょう。

```shell-session
$ cd ghc-mod
$ cabal install
```

### なにがダメなのか？
上記の通りビルドしたバイナリは、本来なら`~/.cabal/bin`に配置されるようなのですが、私の場合はホームディレクトリ直下に`ghc-mod`フォルダが作られていました。
だからでしょうか、`.vimrc`でPATHをちゃんと指定してもvimでghc-modが使えません。
もちろん、AtomにHaskell用のPackageを入れてもエラーで動いてくれません。

### cabalで再インストールするとなぜか直る！
次のコマンドを叩いて再インストールすると、なぜかうまくいくようになります汗

```shell-session
$ sudo cabal install --reinstall --force-reinstalls ghc-mod
```

ためしに、`type`してみましょう。

```shell-session
$ type ghc-mod
ghc-mod is ~/.cabal/bin//ghc-mod
```

おおーなぜかはわかりませんが、ちゃんと`~/.cabal/bin`に配置されています！


## Atom側の設定
これでghc-modが入ったので、エディターの設定をしていきましょう。

### 各種Packageのインストール
AtomでHaskellをいじるときに入っていると便利なPackageは、[こちら(atom.io)](https://atom.io/users/atom-haskell) にある6つ＋他1つくらいでしょうかね。
リストアップすると、

- language-haskell
- autocomplete-haskell
- haskell-ghc-mod
- ide-haskell
- ide-haskell-cabal
- ide-haskell-repl
- haskell-pointfree


### haskell-ghc-mod パッケージの設定

特に、今回入れるのに苦労した`ghc-mod`なわけですが、`haskell-ghc-mod`プラグインの設定画面でちゃんと`ghc-mod`と`ghc-modi`のパスを設定しないとこのプラグインは使えません。
パスはさっきの`type`コマンドを使って、`$ type ghc-mod`とか`$ type ghc-modi`とやると特定することができます。

## vimのケース
力尽きました笑
`ghcmod-vim`というのがあるのでそれを使っています。
ググればこちらの使い方はたくさん出てくるとおもいます。
作者のサイトリンクだけ貼っときます。

- [ghcmod-vim作者のサイト](http://eagletmt.hateblo.jp/entry/2012/02/23/130526)



## まとめ！
要するに、

- Webで出てるみたいにインストールしてるのにghc-modが使えねぇ！なんでだ！
- 正攻法でインストールしたあと、再インストールするとうまくいくぜ！

ということを伝える記事でした。
ここらへんの内容がまとまって書いてあるサイトも記事も見当たらなかったので書いてみました。どなたかの参考になれば幸いです。