ghc-mod の Vim プラグイン ghcmod-vim を書いた
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 に報告したり,ここのコメントに書いたりすれば気付きます.