OCaml-indent: OCaml で書いた OCaml ソースコードインデンタ
OCaml のソースコードのインデント整形には Emacs なら ocaml-mode, tuareg-mode, Vim なら ocaml.vim(?) や omlet.vim があります。便利です。
でもどうも細かい部分が自分のスタイルと違ったり、特殊な改行をするとボロボロッとおかしなインデントをしてきたりします。あーなんかヤダナアと思って、(私の場合は tuareg の emacs lisp を)直そうと思うのですが、どうも面倒です。Elisp は慣れて無いのでコードを解析するのは辛い。
そこで、じゃあインデント解析部は OCaml で書いて、解析とエディタの部分だけエディタ固有の言語で書くようにすれば、Elisp なり、 Vim script なり書く量は極小になるんじゃないかなと思って OCaml-indent を作りました。
さらにインデント解析もできるだけ手間を掛けたくないので、 OCaml コンパイラの lexer 部分をそのまま使いました。普通のインデンタはカーソルのあるところから逆向きにパース(というか正規表現マッチ)をして、カーソル行のインデントを計算する情報が十分得られるまで上へ上へと行く事で、パース量を減らしているのですが、OCaml-indent は一回一回ソースコードの頭から token を読み込むというヌルイ設計です。でも lexer は十分早いので今の所問題ありません。10000行もあるコードとかだと多分ファイルの最後辺りの整形には時間が掛かると思いますが…そもそもそんな長いコードをエディタで人間がインデントしたいか?したくないよね。
例によって bitbucket な: https://bitbucket.org/camlspotter/ocaml-indent/wiki/Home
インデントスタイルは完全に私の嗜好に合わしてありますので、あなたの好みとずれていたら、頑張って main.ml を読んで直してみるか、まあ諦めてください。でも OCaml で書いてあるから Elisp を読むよりはカンタンだよ。
まあ、大体それっぽくインデントしますけど… omake test すると result.diff というファイルに理想と現実の差が立ち現れるようになっています。それ以外に、もし明らかにおかしいインデントが発生したら Bitbucket の Issues に書いてくれると嬉しいです。
例によってエディタとのインターフェースは Emacs しか作ってません。だって Vim 使わないもん。興味があれば、作ってみてください。簡単です。