OCamlSpotter を使う

インストールについてはこちらを参照してください。

まずパスを設定して動作確認

PREFIX/bin をパスに入れてください。設定方法はシェルによって違うので書きません。
設定を変えてから、

$ ocaml
        Objective Caml version 3.11.0+ocamlspotter

# 

となっているか確認してね。

なんか書いてみる

fib.ml:

let rec fib n =
  match n with
  | 1 | 2 -> 1, 1
  | _ -> 
      let f_1, f_2 = fib (n-1) in
      f_1 + f_2, f_1

let fib n = fst (fib n)

-annot スイッチ付きでコンパイルしてみる:

$ ocamlc -annot -c fib.ml

fib.cmo, fib.cmi, fim.annot の他に、fib.spot というファイルが出来ていますか?fib.spot はバイナリファイルですが、ocamlspot プログラムを使うとそこから役に立つ情報を引き出すことが出来ます。

兎に角早く Emacs でサクサク使いたいという人は、次の ocamlspot.el から使うまですっ飛ばしておk。

例えば、

$ ocamlspot -dump-lannots fib.spot

とするとソースコード位置に結び付けられた情報を眺めることが出来ます。

さて、この位置情報を使って定義を探してみよう。fib.ml に出てくる最後の fib は133バイト目にあるので、その定義位置を探すには ocamlspot fib.ml:133 とやる:

$ ocamlspot fib.ml:133
cwd: /home/camlspotter/tmp
Tree: 132:135
Use(Value, fib_58);
Type: int -> int * int;
Spot: /home/camlspotter/tmp/fib.ml:8:11
BYE!

なんか色々無節操に出て来たが、最後から二行目の Spot: /home/camlspotter/tmp/fib.ml:8:11 がその答。fib.ml の 8バイト目から11バイト目に定義があります。一番始めの fib の所だ。

ocamlspot.el から使う

ocamlspot は単純なコマンドラインツールなので、人間には使いづらい。Emacs を使っている人は、ソース中にある、ocamlspot/ocamlspot.el を使えば、カーソル位置を利用して ocamlspot を呼び出し、その結果を自動的に表示してくれるようになる。vi の人はすいませんが、何も用意していません。でも基本は上の通りだから、インターフェースを書くのは簡単だと思う。

ocamlspot.el の設定

ocamlspot.el をどこか適当なところに置く。(caml-mode.el と同じく、make install ではインストールされません。)
自分の .emacs に次のように書き込む:

(setq load-path (cons (expand-file-name "<.elをインストールしたディレクトリ名>") load-path))
(setq ocamlspot-path (expand-file-name "<PREFIXで設定したディレクトリ名>/bin/ocamlspot")) ; ocamlspot.opt でもいいよ
(autoload 'ocamlspot-query "ocamlspot" "OCamlSpot")

後はキーバインディングを仕込むんだけど、もちろん、caml-mode か tuareg-mode を使っているよね?次は caml-mode の場合:

(add-hook 'caml-mode-hook
	      (function
	       (lambda ()
                 ... 他にもいろいろとあるよね ...
		 (local-set-key "\C-c;" 'ocamlspot-query)
		 )))

はい、これで準備完了。

Emacsから使ってみる!

ようやくたどり着きました。fib.ml を開いて、最後の fib にカーソルを持っていって、おもむろに C-c;。百聞は一見にしかず:

上の例は単純すぎるけど、OCamlSpotter を使うと、module とか、include とか open とか functor application とか全部解析して元の定義まで飛んでくれます。ホントはそこがいいところなんです。