OCaml のソースコードの型を表示したり定義にジャンプしたりする Vim のプラグイン作った
この記事は Vim Advent Calendar 2012 の 185 日目の記事です。
昨日は id:deris さんの Vimでできる脱出系パズルゲーム でした。
はじめに
OCaml という静的型付けの関数型言語があります。同じく静的な型をもつ関数型言語である Haskell とは異なり、副作用をもつ関数を定義したり破壊的な操作も行うことができます。
ところが、OCaml 界隈ではどうやら Emacs がデファクトのエディタらしく、Vim での開発環境の情報は非常に少ない、またあったとしも情報が古くなっているものが大半というのが現状です。
参考 OCaml.jp > 開発環境
(追記:更新されたみたいです)
OCamlSpotter (ocamlspot) について
実は、OCaml のソースコードから型情報や定義情報を取得するためのプログラムはすでにあります。OCamlSpotter と言います。
インストールはこの辺が参考になりました。
OSXへOCamlの開発環境をOPAMで構築し直した - tmaeda 日記(2012-10-28)
例えば、下のような階乗を計算する OCaml のコードがあったとして、このファイルの 5 行目 12 桁目 (つまり print_int (factor 5) の factor の f) の位置を指定して OCamlSpottre を起動すると以下の様な出力が得られます。
$ ocamlspot test.ml:l5c12 load /home/cohama/tmp/test.cmt Pathreparse: not supported: factor (Failure("The given position is not clear enough")) Use: Value, factor__1008 Type: int -> int; XType: int -> int; At: Expr; Tree: l5c11b78:l5c17b84 XTree: </home/cohama/tmp/test.ml:l5c11b78:l5c17b84> In_module: Val: val factor : int -> int Spot: </home/cohama/tmp/test.ml:l1c8b8:l1c14b14> BYE!
この出力から型情報や定義情報なんかが取得できます。あとはこれを Vim Script でパースするだけなので簡単ですね。
というわけでプラグイン作った
実は前述の OCamlSpotter には公式の Vim 用のスクリプトも用意されているのですが、Emacs 版に比べると機能が少なく、また実装もいろいろ気に入らなかった*1ので自作することにしました。
the-ocamlspot.vim と言います。インストールは NeoBundle 等を使えば簡単に出来ます。依存する Vim プラグインはありませんが、OCamlSpotter のインストールは必須です。
NeoBundle 'cohama/the-ocamlspot.vim'
使ってみる
the-ocamlspot.vim の今後について
今後追加で実装したいものとしては
- (echodoc のように) 型情報の表示のときに簡単な色をつける
- 定義位置の表示だけじゃなくてジャンプも
- 定義されたファイルの開き方をプレビューウィンドウ以外にも水平、垂直分割やタブで開く
などなど。
ただ、私自身が OCaml 超初心者なのでなにが必要なのか分かっていないというのもあります。OCaml の習得も課題ですね。