ghc-mod を使うのを諦めてもうだいぶ長いのだけど、代わりに intero なるものを見つけた。Emacs専用なのだけど、MacOS上のstackでbuildできるプロジェクトを開発するのであればもうこれだけで十分なんじゃないかってくらい便利。
インストールは interoのインストール手順 に従って init.el などに記述をするだけで、stackで管理されている.hsファイルをemacsで開くだけで、elispのインストールからinteroコマンドのビルドまで全部自動でやってくれる。今まで開発環境の構築に苦しんだ時間は何だったんだって感じ。flycheckは普通に動くし、コードジャンプも型の表示もなんの苦労もなく使えた。(あ、補完試してないや)
余談だが、Windows上でも使えるはずだが、自分の環境では厳しかった(動かしたけど)。自分の環境は、MSYS2 と https://github.com/chuntaro/NTEmacs64 を突っ込んで、それを mintty 上から呼んでる感じ。苦しかったのは以下の2行で、まあごまかしたら動いた。
- 
https://github.com/commercialhaskell/intero/blob/e7723039044867101ec80d2b5cdf26560e30b536/elisp/intero.el#L375
- 
interoから出力がShiftJISで受けてるためにunibyteやnonasciiの正規表現にかからず。そもそもShiftJISで受けてるのがおかしい
 
- 
- 
https://github.com/commercialhaskell/intero/blob/e7723039044867101ec80d2b5cdf26560e30b536/elisp/intero.el#L395
- バッファ名とファイル名が一致するかチェックしてるのだけど、 /と\の違いやドライブレターの違いでうまく機能しなかった。intero-canonicalize-pathで解決しようとはしてるけど、こちらの環境では効果ないぽい
 
- バッファ名とファイル名が一致するかチェックしてるのだけど、 
さらに余談だが、winのghc付属のMSYS2では HDBC-sqlite3 が入らなかったので、 --skip-msysで自前のMINGW64使ってビルド させたりしてる。MINGW64の libsqlite.dll の名称の違いをghcが解決してくれないので、手でコピーしてPATHの通った部分にrenameして置いたりもしてる。ホストOSのstackでプロジェクトをビルドできないとinteroは使えないので、この辺は頑張るしかない。