読者です 読者をやめる 読者になる 読者になる

ghc-mod の Vim プラグイン ghcmod-vim を書いた

vim haskell

kazu-yamamoto さんによって開発されている ghc-mod というコマンドとそのための一連の elisp がある. ghc-mod を利用して Vim で補完をサポートする neco-ghc を以前書いたが, 今回は ghc-mod のその他の機能をサポートする Vim プラグイン ghcmod-vim を書いた.eagletmt/ghcmod-vim - GitHub

必要なもの

当然 ghc-mod が必要なので cabal install ghc-mod でインストール. ~/.cabal/bin 等に ghc-mod が置かれますが,そこに正しくパスが通っていて実行可能であることを確認してください. 特に GVim, MacVim を使っていると,シェルでの環境変数GVim, MacVim での環境変数が異なるケースがあるので…

そして vimproc が必要です. 最近 vimproc に追加された checkpid() という関数を使っているため,git pull で最新版を使うことを勧めます. フォールバックは用意しているので,ver 6.1 でも動作します.

機能

:GhcModType, :GhcModTypeClear

Haskell のコードを開き,型を知りたい場所の上にカーソルを移動して :GhcModType とすると,その部分がハイライトされて型が表示されます. 型を表示できるのは単なる式だけでなく,束縛やパターンマッチのパターンにも使えます. また,ハイライトされている位置で再び :GhcModType とするとハイライトの範囲が変わります. スクリーンショットは github のほうの README.md を見てください. ハイライトは :GhcModTypeClear で消せます.

ハイライトの色は g:ghcmod_type_highlight に設定することができます. デフォルトでは 'Search' によってハイライトされます.

本当はバッファ毎にハイライトを設定したいのだけど,難しそうだったためハイライトそのものは現在のウィンドウのみで有効になる. ハイライトしている範囲はバッファ毎に保存される.

:GhcModCheck, :GhcModLint

:GhcModCheck とすると,現在のバッファで開いている Haskell のコードに対してコンパイラのエラー・警告を quickfix ウィンドウに表示します. 何らかのエラー・警告があったときは自動的に quickfix ウィンドウを開きます (勝手に :cwindow します). 同様に :GhcModLint とすると,hlint からのメッセージを quickfix ウィンドウに表示します.

現時点で最新版である ghc-mod 1.10.9 では ghc-mod check はファイルパスではなくファイル名を出力するため, :GhcModCheck は一時的にカレントディレクトリを変更してから setqflist() するという方法でファイル名と実際のファイルパスを関連付けている. しかしこの方法では import しているモジュールが別のディレクトリにあり,そちらのほうでエラー・警告が出た場合に対処できない. これは ghc-mod の問題だと思う. 対策としては,import 先のモジュールもそのプログラムの一部なわけだから, そちらのほうで先に :GhcModCheck して警告が出ないことを確認しておく,というある意味当然な方法がある.

さいごに

ghc-mod type がとても便利そうだったので,そのときの衝動で一気に書いた.

Haskell そのものに慣れていなかったり,利用している関数の型が複雑だったりするときに「ここにどんな型の式を書けばいいんだ???」となることがある. そんなときに,とりあえずその位置に undefined を書いてコンパイルは通るコードにした後,undefined の上で :GhcModType として型を見る,というような活用方法もあると思う.

不具合の報告や機能の追加・変更の希望を待ってます. github の issue に登録したり,Twitter で @eagletmt に報告したり,ここのコメントに書いたりすれば気付きます.