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

ghcmod.vim 0.1.0

ghcmod.vim 0.1.0 をリリースした。 https://github.com/eagletmt/ghcmod-vim/downloads からダウンロードできます (リポジトリ内のファイルからプラグインとして利用する上で不必要なものを除いて zip で固めただけ)。

前回 からの変更点について書いていく。

:GhcModExpand コマンドを追加した

ghc-mod 1.10.8 で追加された ghc-mod expand のためのインターフェイス。 Template Haskell の展開の様子を quickfix に表示する。

ちなみに、ghc-mod expand と同等の出力は ghc -ddump-splices でコンパイルしても得られる。

GHC や hlint にオプションを渡せるようにした

ghc-mod は GHC や hlint を利用しており、それらにオプションを渡す機能が備わっている。 これらをそれぞれ g:ghcmod_ghc_optionsg:ghcmod_hlint_options でちゃんと設定できるようにした。

例えば :GhcModLint 時に "Redundant $" というヒントを出させないようにするためには以下のように ~/.vimrc で設定する。

let g:ghcmod_hlint_options = ['--ignore=Redundant $']

非同期チェックをサポートした

なぜ自動チェックが嫌いなのか - eagletmt's blog なんてことも書いたけど、 ブロックしない自動チェックならば便利だと思うので quickrun での非同期実行の実装を参考にして非同期的に :GhcModCheck:GhcModLint を実行できるようにした。 それぞれ :GhcModCheckAsync:GhcModLintAsync というコマンドを用意している。 さらに両方同時にチェックする :GhcModCheckAndLintAsync というコマンドも用意した。

バッファ保存時に自動的に実行するには ~/.vimrc で

autocmd BufWritePost *.hs GhcModCheckAsync

とか設定するといいと思う。

lint はともかく、check のほうは import しているモジュールが多かったりメタプログラミングをしていたりすると 結構時間が掛かるので、効果があるんじゃないかと思う。

ただし現状の非同期実行はちょっとロバストでない点があって、もしかしたらエラーを出してしまうかもしれない。 このへんは近いうちに改善したい…

Cabal を利用しているプロジェクトでの動作を改善した

Cabal はビルド時にやってくれていることがいくつかあって、それらに依存したプログラムのために 適切なオプションを GHC に渡すことで :GhcModCheck:GhcModType でエラーが出ないようにした。

具体的には、cabal build

  1. 依存パッケージに対してバージョンのテストを行うマクロを提供したり、
  2. 自身のパッケージに関する情報を提供する Paths_pkgname というモジュールを生成したり、
  3. 拡張子に応じて適切な前処理を実行したり

しているので、そのためのパスを設定したりしている。これら3点に関しては考慮しているつもりだけど、他にも何かあったりするのかな。

注意点としては、これらは cabal build 時に行われるので、一度 cabal build を実行して dist/build 以下にファイルを生成しておかないと意味がない。 1, 2 に関しては一度生成してしまえば後から変わることは無いので問題にはならないけど、 3 に関してはチェックの度に前処理が実行されて欲しいと思う。 単純な .cabal ファイルであれば https://gist.github.com/2227993 で前処理のみ実行できると思うけど、 Build-type: Simple ではない場合はどうするのがいいのかわからない。