TextMate で Clojure のソースを快適にインデント!

Clojure のソースを TextMate で書き綴って、REPL で実行するプロセスはとても快適ではありますが、一点ほど難点があります。それはインデントです。

python でも同様の症状が発生しますが、ruby のようにブロックの終端を表わすブレースなどが行頭に戻って来ないソース形式の場合、TextMate ではインデントが正常に動作しません。

仕方ありませんので、python では、Python Package Index : PythonTidy 1.20 を呼び出して代用しておりましたが、どうも Clojure でも同様の処置を施さねばならないようです。


Google 先生によると、こちらを

(参考) はてなブックマーク - TextMateでのClojureのインデント解決編 - マンジラボ

参考にせよ、との思し召しなのですが、残念ながら、当該サイトは閉鎖、ないしはメンテナンスされていない状態のようです。

ブクマに残されたコメントから推察するに、Emacsclojure-mode を呼び出してコード整形を果たしている様子。その辺から Google 先生にお問い合わせすると....

(参考) All sizes | Tidy up clojure code in TextMate | Flickr - Photo Sharing!

有りましたぁ!なんと、コードの断片を画像で発見してしまいましたよw


この画像を写経することでキレイなインデントを獲得することができました。以下が Command(s) に埋め込むコードです。

#!/usr/bin/env ruby

filename = "/tmp/tmptx_tidyup_code.clj";

File.open(filename, "w") {|f|
  STDIN.each do |line|
    f.print line
  end
}

# path は clojure-mode.el を保存したパスに変更してください
# lisp-indent-offset は好みのインデント幅に変更してください

result = `/usr/bin/emacs -batch \
--eval '(load "/path/clojure-mode.el")' \
#{filename} \
--eval '(setq indent-tabs-mode nil)' \
--eval '(setq lisp-indent-offset 4)' \
--eval '(indent-region (point-min) (point-max) nil)' \
-f save-buffer &> /dev/null`

puts `cat #{filename}`


いやいや。これで閉じ括弧を先頭に持って来るような、無様なことをせずに済みます。