EmacsでのHaskell開発(旧その2)

Posted on September 21, 2020 by nobiruwa

tl;dr

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

lsp-haskellのバックエンドとしてhaskell-language-serverを使うようにセットアップしました。

切っ掛け

haskell-ide-engineを使っていましたが、haskell-ide-engineとghcideは統合されhaskell-language-serverによって置き換えられました。2020年9月21日時点のlsp-haskellはバックエンドがhaskell-language-serverに切り替わっていました。

lsp-haskell + haskell-language-server の構築手順

haskell-language-server

haskell-language-serverのInstallationに従ってバイナリをインストールします。

Prerequistes

$ sudo apt-get install libicu-dev libncurses-dev libgmp-dev zlib1g-dev

haskell-language-serverのビルド

$ cd ~/repo
$ git clone https://github.com/haskell/haskell-language-server --recurse-submodules haskell-language-server.git
$ cd haskell-language-server.git
$ stack ./install.hs help

Usage:
    stack install.hs <target> [options]
    or
    cabal v2-run install.hs --project-file install/shake.project -- <target> [options]

Targets:
    help                Show help message including all targets
                        
    hls                 Install haskell-language-server with the latest available GHC and the data files
    latest              Install haskell-language-server with the latest available GHC
    data                Get the required data-files for `haskell-language-server` (Hoogle DB)
    hls-8.10.1          Install haskell-language-server for GHC version 8.10.1
    hls-8.10.2          Install haskell-language-server for GHC version 8.10.2
    hls-8.6.4           Install haskell-language-server for GHC version 8.6.4
    hls-8.6.5           Install haskell-language-server for GHC version 8.6.5
    hls-8.8.2           Install haskell-language-server for GHC version 8.8.2
    hls-8.8.3           Install haskell-language-server for GHC version 8.8.3
    hls-8.8.4           Install haskell-language-server for GHC version 8.8.4
                        
    dev                 Install haskell-language-server with the default stack.yaml
                        
    icu-macos-fix       Fixes icu related problems in MacOS

Options:
    -s, --silent        Don't print anything.
    -q, --quiet         Print less (pass repeatedly for even less).
    -V, --verbose       Print more (pass repeatedly for even more).

Build completed in 0.07s

まずは最新のGHCバージョン(現時点は GHC version 8.8.4 でした)のビルドを行います。

$ stack ./install.hs hls
[...snip...]
Copied executables to /home/ein/.local/bin:
- haskell-language-server
- haskell-language-server-wrapper
# stack (for hls-8.8.4)
Build completed in 22m03s

次に、私が主に使用しているGHCバージョン(現時点は GHC version 8.6.5 です)のビルドを行います。

$ stack ./install.hs hls-8.6.5
[...snip...]
Copied executables to /home/ein/.local/bin:
- haskell-language-server
- haskell-language-server-wrapper
# stack (for hls-8.6.5)
Build completed in 20m46s

非力なマシンでは-jオプションで並列実行数を制限してください。

$ stack ./install.hs -j1 hls-8.6.5

あらゆるプロジェクトでのビルドで並列実行数を制限する場合はstackのグローバルな設定ファイルにGHCオプションを記述します。~/.stack/config.yamlに以下の行を追加するとよいでしょう。

ghc-options:
  "$locals": -j1

プロジェクトに合ったバージョンのhaskell-language-server-*が使われない場合、haskell-language-serverを削除することを試してください。

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

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

cradle:
  stack: