EmacsでのHaskell開発(旧)

Posted on March 29, 2020 by nobiruwa

[Obsolete]

本記事は2020年9月時点ではobsoleteとなりました。新しい記事を参照してください。

tl;dr

lsp-haskellhaskell-ide-engineを用いることで、十分に快適な環境を得ることができました。

切っ掛け

元々はinteroを愛用していましたが、lts-14.20(GHC 8.6.5)を使い始めた頃から、関数によっては補完が表示されなくなりなした。GitHubを見ると”The intero project has reached the end of its life cycle.”とあり、代替のなかからLSPと簡単に統合が可能なhaskell-ide-engineを用いることにしました。

lsp-haskell + haskell-ide-engine の構築手順

開発のモードとしてlsp-modeを用い、バックエンドにはhaskell-ide-engineを用います。そのために、lsp-haskellをインストールします。

haskell-ide-engine

haskell-ide-engineのインストール

lsp-haskellには、interoのようなバックエンドの自動インストールは実装されていないので、ソースコードからインストールします。インストール手順の詳細はhaskell-ide-engineのREADMEにあります。

私はGHC 8.6.5を使用しており、ソースコードのリポジトリを~/repo/<project-name>.gitというディレクトリ体系で管理していることから、以下のコマンドでhie(またはhie-8.6.5)とhie-wrapper~/.local/binディレクトリにインストールしました。

$ mkdir -p ~/repo
$ cd ~/repo
$ git clone https://github.com/haskell/haskell-ide-engine.git --recurse-submodules haskell-ide-engine.git
$ cd haskell-ide-engine.git
$ stack ./install.hs hie # GHC 8.6.5がデフォルトのバージョンである場合
$ stack ./install.hs hie-8.6.5 # GHC 8.6.5がデフォルトのバージョンでない場合
$ stack ./install.hs -j1 hie-8.8.3 # 非力なPCではビルド時のジョブ数を制限する

Emacs

Emacsパッケージのインストール

M-x package-install
lsp-haskell

Emacsパッケージの設定

;;;;;;;;
;; lsp-haskell
;;;;;;;;
(require 'lsp-haskell)
(add-hook 'haskell-mode-hook #'lsp)

プロジェクトの作成

$ stack new --resolver=<resolver name> <project-name>
// example
$ stack new --resolver=lts-14.27 http-conduit-example

HIEがプロジェクトのセットアップに失敗する場合はプロジェクトの設定ファイルを作成してみます。 設定に関する詳細はREADMEの通りですが、以下に最小の設定を示します。

cradle:
  stack: