IT Rescue IT関連Tips情報

分割 .emacs のすゝめ

2006年9月2日Emacs

いろいろ設定していると .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 も置いておきますね。


コメントをどうぞ

免責事項

著作権者の文書による承諾を得ずに、本サイトの内容の一部、全部を無断で複写、複製、転載することは、禁じられています。
また、当ウェブサイト に記載された情報の完全性・正確性に対して一切の保証を与えるものではありません。当ウェブサイトに含まれる情報もしくは内容を利用することで直接・間接的に生じた損失に関し一切責任を負わないものとします。