自動でバイトコンパイルする設定

Emacsは*.elというEmacs Lispソースファイルと*.elcというバイトコンパイルされたファイルがある。
で、ソースのみが変更されたとき、*.elcよりも*.elが新しくなるのだが、そのとき、古い*.elcを読み込んでしまう。 だから、「変更したはずなのに、反映されてない、おかしいなあ」ということになる。
この問題に対処する方法として、保存直後に自動バイトコンパイルするという手があるのだが、Gitリポジトリとかからの変更をとりこんだときとかはわすれてしまう。あと、でかいファイルの場合、バイトコンパイルで待たされるので困る。
そこで、起動時に必要があればバイトコンパイルすることにした。

そもそもこの問題が起きるのは、Emacs Lispがホームディレクトリにある場合だ。だから、load-pathに加える時点で、読み込む前に必要あればバイトコンパイルしてしまえばよい。必要あればディレクトリにある*.elをバイトコンパイルするには byte-recompile-directory 関数がある!

導入方法は簡単。以下の関数を定義して、「add-to-list 'load-path "~/〜"」を「add-to-load-path-recompile "~/〜"」に全置換すればよい。複数のファイルにわけている人は grep-edit.el や moccur-edit.el を使おう。wizardはperlのonelinerで。

(defun add-to-load-path-recompile (dir)
  (add-to-list 'load-path dir)
  (let (save-abbrevs) (byte-recompile-directory dir)))

これがあれば、忌々しい「Source file `〜' newer than byte-compiled file」というメッセージを見ることがなくなるはずだ。