分割 .emacs のすゝめ
 2006.09.02

いろいろ設定していると .emacs が巨大になって困りませんか?
  • 一行変更しただけで、全体コンパイルするのは激しく無駄ぽ。
  • けちくさい? いやいや、分割コンパイルって発想は当然だよね?

    そもそも ~/.emacs.elc なんて作ってないって? カスタマイズしていくと、Emacs の起動がどんどん遅くなっていくのです。 少しでも速くするための努力はしておこうかと。 もっとも、ずっと同じプロセスを動かしとくから、多少起動が遅くても問題にはならんですが。

  • 起動時にエラーするけど、どこが悪いの?
  • 分割しておけば、どのファイルの評価で止ってるかわかります。 *Messages* バッファで Loading してるのに done してない奴がおかしい。

    結局 --debug-init だの edebug-defun だのしたりしますがね。 範囲を絞り込む手間は減ります。

  • どこに何が書いてあるかもう把握できーん。
  • いくら似たような設定をまとめて記述してコメントつけたとしても、 ファイルが別であることの明快さにはかないません。

そんなこんなで、僕は分割して管理しています。 以下、実際に分割するやり方。

分割したファイルを置くディレクトリを作ります。 .emacs は、それらを読み込むようにしておきます。 このディレクトりには load-path を通したりしません。 ので、既存パッケージとのファイル名の衝突は気にする必要ありません。

各ファイル間に依存関係がなければよいですが、 そううまくいかないこともあるでしょう。 例えば、load-path に追加したディレクトリにある ファイルを load/autoload/require してたり。

依存関係を解決できるように load を書きまくってもよいですが、 なんだか計算機に使われてる感じ。 せっかくだから自動化しましょう。

まずは簡単なやり方。 ソートしたら順序が決まるようなファイル名をつけておきます。 ファイル名の頭に 00 とか 99 とか数字つけたらいいんじゃないかな。 あとは、~/.emacs.el にこう書いて、~/.emacs.d/init.d の下に分割したファイルを放り込みます。

(let* ((dir "~/.emacs.d/init.d")
       (el-suffix "\.el\'")
       (files (mapcar
	       (lambda (path) (replace-regexp-in-string el-suffix "" path))
	       (directory-files dir t el-suffix))))
  (while files
    (load (car files))
    (setq files (cdr files))))

拡張子削ってるのは、.elc を優先させたいからだよ。

次はファイル自体に依存関係情報を書いとく方法です。 依存関係をファイル名で解決したくない人向け。

僕は ~/.emacs.d/rc.d の下に分割したファイルを置いて、 こんな Makefile で ~/.emacs.el を生成してます。 ソースにコメントで PROVIDE: やら REQUIRE: やら書いとくわけですな。

gmake では動きません。 BSD な make と rcorder が必要です。

ついでなので .include してる elisp.mk も置いておきますね。

カテゴリー:技術情報メモ