🎃

HaskellをNeovimで書きたい

2023/10/22に公開

ゴール

「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