(もうメンテしてません)vimによるHaskell編集環境メモ(ghc-modとかcodexとかをstackで入れてvimから使う)


もうこの記事はメンテしてません

今更の更新ですがこの記事はとっくの昔からもうメンテしてません。(随時更新)とか安易に書くべきじゃないですね... 😰

今新しくvimでHaskellの開発環境をセットアップするんでしたらとりあえずHaskell IDE Engineと適当なLSPクライアント(vim-lspLanguageClient-neovimあたり)を入れるのがいいんじゃないかと思います。

筆者は現在LanguageClient-neovimでやってます。補完ぐらいしか使えてないけど...。


haskell-vim-nowを使うと早いらしい

いろいろいっぺんに入れてくれるらしいです。

が、出しゃばり過ぎてて既存の設定と衝突すること間違いなし1 なので、今回は上記で紹介しているものをひたすれ入れてその時の記録をメモします。

つまり、haskell-vim-nowのinstall.shを手で実行することになります。

人間シェルスクリプトです。

(実際はそれほどきっちり実行しませんでしたが...)

:information_desk_person: もう入れちゃったよ、という方は最後にhaskell-vim-nowが紹介していないけど有用そうなものを追記したので良ければどうぞ。


事前に必要なもの

:warning: stack・vimをなるべく新しいバージョンにしましょう。

haskell-vim-nowはstackを前提としているのでstack必須です。

stackについてはこちらを参考にどうぞ。

stackはghc-mod 5.4が要求している通りver. 0.1.4.0以降、

vimはhaskell-vim-nowが要求している通りver. 7.4以降が必要です。

今回はhaskell-vim-nowを直接使うわけではありませんが、導入するライブラリが要求しているはずです。


とりあえずまとめて入れる

haskell-vim-nowが紹介しているプラグインが依存しているコマンド群をまとめて入れましょう。

追記: lts-4.0以降、ghc-modはLTS-Haskellに含まれ、普通にstack installできるようになりました。


それ以前のltsをお使いの場合は、この記事の過去のバージョンを参考にしてください。

$ stack install ghc-mod hasktags codex hscope pointfree pointful hoogle stylish-haskell

...
Copied executables to /home/yu/.local/bin:
- stylish-haskell
- pointful
- pointfree
- hscope
- hoogle
- hasktags
- ghc-modi
- ghc-mod
- codex

ご丁寧に、インストールした実行ファイルのパスまで教えてくれます。

$PATHに追加すること、けって〜い!


各種コマンドをvimから実行するよう設定

それでは入れた大量のコマンドをvimから呼び出す設定を書いていきましょう。

やはりhaskell-vim-nowのvimrcを参考にします。


その1 Tagの書き出し: codex・hasktags・hscope

codexのREADME通り、vimrcファイルに次の行を追加します。

set tags=tags;/,codex.tags;/

まだ入れてなかったので、ctagsからファイルのアウトラインを表示してくれるtagbarも入れましょう。

NeoBundle 'majutsushi/tagbar'

ctagsがサポートしていない言語は標準でサポートしてくれていないみたいです。

tagbarのWikiによれば、次の設定を追加すれば良いとのこと。

そういえばhaskell-vim-nowのvimrcにも同じのが書いてありました。

let g:tagbar_type_haskell = {

\ 'ctagsbin' : 'hasktags',
\ 'ctagsargs' : '-x -c -o-',
\ 'kinds' : [
\ 'm:modules:0:1',
\ 'd:data: 0:1',
\ 'd_gadt: data gadt:0:1',
\ 't:type names:0:1',
\ 'nt:new types:0:1',
\ 'c:classes:0:1',
\ 'cons:constructors:1:1',
\ 'c_gadt:constructor gadt:1:1',
\ 'c_a:constructor accessors:1:1',
\ 'ft:function types:1:1',
\ 'fi:function implementations:0:1',
\ 'o:others:0:1'
\ ],
\ 'sro' : '.',
\ 'kind2scope' : {
\ 'm' : 'module',
\ 'c' : 'class',
\ 'd' : 'data',
\ 't' : 'type'
\ },
\ 'scope2kind' : {
\ 'module' : 'm',
\ 'class' : 'c',
\ 'data' : 'd',
\ 'type' : 't'
\ }
\ }

次に、gitで管理している.hsファイルに対してまとめてhscopeを実行するシェルスクリプト、git-hscopeをコピペして$PATHに追加しておきましょう。

どうやら、vimからタグを生成するコマンドの中で使用しているみたいです。

もちろん実行権限の追加も忘れずに。

それから、ctagsも入れておきましょう。

hasktagsがあるからいいのかな、と思ったらインストールしてないとtagbarに怒られました。 :cry:


その2 型チェックや入力補完: ghc-mod

おかげさまでghc-mod 5.4以降、ghc-modはstackをサポートしてくれるようになりました :tada:

試そう!

$ ghc-mod type src/Foo.hs 26 1

...
EXCEPTION: types:
readCreateProcess: /home/yu/.stack/global/.stack-work/install/x86_64-linux/lts-3.10/7.10.2/libexec/cabal-helper-wrapper "/home/yu/Dropbox/prg/prj/guess-numbers" "/home/yu/Dropbox/prg/prj/guess-numbers/dist" "write-autogen-files" (exit 1): failed

なんかエラーが起きましたね。。。 :fearful:

先ほどのghc-mod 4.5のリリースアナウンスメントでも触れている通り、

dist/setup-configというディレクトリがプロジェクトのルートにあるとcabalで設定したプロジェクトだと認識してしまい、うまく動かないそうです。

私が試したプロジェクト自体はstackで作成したはずですが、stackの仕様が変わったのか、dist/setup-configがまだあったのです。

$ mv dist/setup-config dist/setup-config.bak

$ ghc-mod type src/Foo.hs 26 1
21 5 21 42 "(Ordering, t) -> Bool"
19 1 23 60 "[Int] -> Int -> ([Ordering], [Int])"

バッチリ! :laughing:

とりあえず動いているようです。 :relaxed:

:bow: GHCのバージョンを切り替えたりした時ちゃんと動くかまではあいにく試せておらず。


とりあえずここまで。

他にも、おなじみhoogleをvimから呼び出すプラグインや、

ポイントフリースタイルとそうでないバージョンとで書き換えるpointfreepointful

コードフォーマッターのstylish-haskellもhaskell-vim-nowでは導入・設定してくれるみたいです。

が、ひとまず、一番試したかったものが動いているので今日は名前を挙げるだけにしておきます。

また次回のHaskellもくもく会も環境づくりかな... :sweat_smile:


その他、haskell-vim-nowが紹介してないけど入れたい