HaskellをNeovimで書きたい
ゴール
「NeovimでHaskellを書く」が今回のゴールです。具体的には以下のとおりです。
- 補完が出る。
- 定義に飛べる。
- 型の情報を確認できる。
環境構築
ghcup
公式サイトに従って、ghcupをインストールします。
インストールコマンドを実行すると以下の質問をされます。
Detected bash shell on your system...
Do you want ghcup to automatically add the required PATH variable to "$HOME/.zshrc"?
[P] Yes, prepend [A] Yes, append [N] No [?] Help (default is "P").
ghcupが.zshrcにPATHを自動的に追加するかどうかを聞かれています。
Pを選び、自動で書いてもらいます。
Do you want to install haskell-language-server (HLS)?
HLS is a language-server that provides IDE-like functionality
and can integrate with different editors, such as Vim, Emacs, VS Code, Atom, ...
Also see https://haskell-language-server.readthedocs.io/en/stable/
Do you want to install haskell-language-server (HLS)?
HLS is a language-server that provides IDE-like functionality
and can integrate with different editors, such as Vim, Emacs, VS Code, Atom, ...
Also see https://haskell-language-server.readthedocs.io/en/stable/
[Y] Yes [N] No [?] Help (default is "N").
Haskell-language-serverを入れるかを聞かれます。
今回はneovim側で入れるのでNを選択します。
Do you want to enable better integration of stack with GHCup?
This means that stack won't install its own GHC versions, but uses GHCup's.
For more information see:
https://docs.haskellstack.org/en/stable/yaml_configuration/#ghc-installation-customisation-experimental
If you want to keep stacks vanilla behavior, answer 'No'.
[Y] Yes [N] No [?] Help (default is "Y").
stackがghcupのghcバージョンを使用するかを聞かれます。
今回はYを選択します。

最後に設定を反映させるために、上記に書かれているようにsoruce ~/.ghcup/envを実行しましょう。
ghcup tuiを実行します。
以下のように、インストールできるstack, ghc, cabalが表示されます。
チェックマークが2つついているのが、使われるバージョンです。
基本的にrecommendedと書かれているバージョンが使われていればOKです。

Neovim
Masonでhaskell-language-serverをインストールします。
mrcjkb/haskell-tools.nvimというプラグインをインストールします。
haskellを書く上で便利な機能を提供してくれるプラグインです。
nvim-cmpなどと連携したり、コードの評価などの機能があります。
-- 最小構成
{
'mrcjkb/haskell-tools.nvim',
dependencies = {
'nvim-lua/plenary.nvim',
},
version = '^2', -- Recommended
ft = { 'haskell', 'lhaskell', 'cabal', 'cabalproject' },
init = function()
vim.g.haskell_tools = {}
end,
}
ここまでセットしたら一度プロジェクトを作成します。
任意のディレクトリでstack new {プロジェクト名}を実行し、Haskellプロジェクトを作成します。
プロジェクトディレクトリ内でstack buildを実行します。
プロジェクト内のHaskellファイルを開いて以下のように補完が効けば成功です。

hoogle
最後にhoogleを入れます。
hoogleはHaskellの型や関数を検索することができます。
hoogleの使い方は主に
- webブラウザから利用する。
- ローカル環境にインストールする。
があります。
今回は、ローカルにインストールして使います。
まず、stack install hoogleを実行します。
インストールが成功したら、hoogle generateを実行して、インデックスを作成します。
hoogle server --localを実行します。
次にNeovim内で検索ができるようにします。
haskell-toolsにはhoogleと連携して検索を可能にする機能があります。以下のキーマップを追加します。
local ht = require('haskell-tools')
vim.keymap.set('n', '<space>hs', 'ht.hoogle.hoogle_singature')
ここまでできたら、また実行します。

このようにカーソル下の型シグネチャを検索できたら成功です。
ここまででNeovimでHaskellを書く環境が整いました。
今回インストールしたmrcjkb/haskell-tools.nvimには他にも色々な機能がありますので、ドキュメントを読んでみることをおすすめします。
Discussion