emacsでgit下のファイルをdiffする小技

git statusすると色々な状態のファイルが出力される。その中でも「modified」が一番気になるものだ。なので、grepしてこくこのようなものを眺める状況になる:


$ git status | grep modified
# modified: lib/core/config.h
# modified: lib/index/indexer.c
# modified: lib/search/proximityscore.c

emacs使いだと、ここで各ファイルをediffしたくなる。現在のディレクトリ下を帰納的にdiffするコマンドがvcか何かにあるんだろうけど見つからない。そこで、シェルのテキストフィルターとelispをその場しのぎの対策をうつ。


git status | grep modified: | sed 's/.*modified: *\(.*\)/(ediff-revision "\1")/'
(ediff-revision "lib/core/config.h")
(ediff-revision "lib/index/indexer.c")
(ediff-revision "lib/search/proximityscore.c")

これを*shell*モード内で走らせる。elispはどこでも評価できるので、各行でC-x C-e (eval-last-sexp)するとediff-revisionが走って快適にgitに管理されたファイルの変更内容が見れる。

Unixのテキストフィルターからelispを出力してインタラクティブに処理するというやり方は、emacs内の処理とスクリプトを書く中間的存在だ。パイブラインでできるだけデータを整理しておいて、最後の判断が必要な部分をemacsで仕上げる。keyboardmacroではかなわないがperlスクリプトを書くまでいかないような問題を解決するのに便利。UnixのパイプとLISPのS式という二つの偉大な表現法を融合させた必殺技だ。