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

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

今更の更新ですがこの記事はとっくの昔からもうメンテしてません。（随時更新）とか安易に書くべきじゃないですね... 😰
今新しくvimでHaskellの開発環境をセットアップするんでしたらとりあえず[Haskell IDE Engine](https://github.com/haskell/haskell-ide-engine)と適当なLSPクライアント（[vim-lsp](https://github.com/prabirshrestha/vim-lsp)か[LanguageClient-neovim](https://github.com/autozimu/LanguageClient-neovim)あたり）を入れるのがいいんじゃないかと思います。
筆者は現在LanguageClient-neovimでやってます。補完ぐらいしか使えてないけど...。

# [haskell-vim-now](https://github.com/begriffs/haskell-vim-now)を使うと早いらしい

いろいろいっぺんに入れてくれるらしいです。
が、出しゃばり過ぎてて既存の設定と衝突すること間違いなし[^vimrc] なので、今回は上記で紹介しているものをひたすれ入れてその時の記録をメモします。
つまり、haskell-vim-nowの[install.sh](https://github.com/begriffs/haskell-vim-now/blob/master/install.sh)を手で実行することになります。
人間シェルスクリプトです。
（実際はそれほどきっちり実行しませんでしたが...）

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

[^vimrc]: [なんでわざわざ`~/.vimrc`を書き換えるんだ...](https://github.com/begriffs/haskell-vim-now/blob/942db2f6f4ed672a5e7a8dfd6aa98e6faf26d394/install.sh#L74-L81) :fearful:

# 事前に必要なもの

:warning: stack・vimをなるべく新しいバージョンにしましょう。
haskell-vim-nowはstackを前提としているのでstack必須です。
stackについては[こちら](http://qiita.com/tanakh/items/6866d0f570d0547df026)を参考にどうぞ。

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をお使いの場合は、[この記事の過去のバージョン](http://qiita.com/igrep/items/278316669fbbd6dd124d/revisions/11)を参考にしてください。

```
$ 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](https://github.com/begriffs/haskell-vim-now/blob/master/.vimrc)を参考にします。

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

[codexのREADME](https://github.com/aloiscochard/codex#vim)通り、vimrcファイルに次の行を追加します。

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

まだ入れてなかったので、ctagsからファイルのアウトラインを表示してくれる[tagbar](https://github.com/majutsushi/tagbar)も入れましょう。

```vim
NeoBundle 'majutsushi/tagbar'
```

ctagsがサポートしていない言語は標準でサポートしてくれていないみたいです。
[tagbarのWiki](https://github.com/majutsushi/tagbar/wiki#haskell)によれば、次の設定を追加すれば良いとのこと。
そういえばhaskell-vim-nowのvimrcにも同じのが書いてありました。

```vim
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`](https://github.com/begriffs/haskell-vim-now/blob/master/git-hscope)をコピペして`$PATH`に追加しておきましょう。
どうやら、vimからタグを生成するコマンドの中で使用しているみたいです。
もちろん実行権限の追加も忘れずに。

それから、`ctags`も入れておきましょう。
hasktagsがあるからいいのかな、と思ったらインストールしてないとtagbarに怒られました。 :cry:

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

おかげさまで[ghc-mod 5.4以降、ghc-modはstackをサポートしてくれるようになりました](https://mail.haskell.org/pipermail/haskell-cafe/2015-September/121412.html) :tada:。
試そう！

```bash
$ 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のリリースアナウンスメント](https://mail.haskell.org/pipermail/haskell-cafe/2015-September/121412.html)でも触れている通り、
`dist/setup-config`というディレクトリがプロジェクトのルートにあると`cabal`で設定したプロジェクトだと認識してしまい、うまく動かないそうです。
私が試したプロジェクト自体はstackで作成したはずですが、stackの仕様が変わったのか、`dist/setup-config`がまだあったのです。

```bash
$ 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])"
```

バッチリ! :satisfied:
とりあえず動いているようです。 :relaxed:
:bow: GHCのバージョンを切り替えたりした時ちゃんと動くかまではあいにく試せておらず。

## とりあえずここまで。

他にも、おなじみ[hoogleをvimから呼び出すプラグイン](https://github.com/Twinside/vim-hoogle)や、
ポイントフリースタイルとそうでないバージョンとで書き換える[pointfree](https://github.com/bmillwood/pointfree)に[pointful](https://github.com/23Skidoo/pointful)、
コードフォーマッターの[stylish-haskell](https://github.com/jaspervdj/stylish-haskell)もhaskell-vim-nowでは導入・設定してくれるみたいです。
が、ひとまず、一番試したかったものが動いているので今日は名前を挙げるだけにしておきます。
また次回のHaskellもくもく会も環境づくりかな... :sweat_smile:

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

- リファクタリングツール [HaRe](https://github.com/RefactoringTools/HaRe)
- importを半自動で書いてくれる [vim-hsimport](https://github.com/dan-t/vim-hsimport)
- import文をsortしてくれる [vim-haskell-sort-import](https://github.com/itchyny/vim-haskell-sort-import)