理系学生日記

おまえはいつまで学生気分なのか

init-loader.el で特定環境用に設定ファイルを分ける

emacs の設定ファイル、1 ファイルだけに書いてるとどうしても長くなるし

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; キーバインド

(global-set-key ....)
(global-set-key ....)
(global-set-key ....)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; anything

みたいにコメントで境界付けたりしだしてカッコよくない。設定ファイルの上部にキーバインド設定用の領域があるのに、それを忘れてしまって設定ファイルの下の方にもキーバインド用の設定領域を作るとかなって、マジにダサくなるし保守しづらくなる。このあたりの話、1,000 行のコードを 1 つの関数で書くとかそういうのと一部通じるものがある。自分で何やってるのか分からなくなるのつらい。


そういう問題があるから、init-loader.el 使ってファイルを分割してる人多いと思う。Coderepos とか Github とかに色んな亜種が転がってるけど、ぼくはこれ使ってる。

でだ、この init-loader.el には元々環境依存のファイルを読み分けできる機能が入ってるので、別に自分で条件分岐書かなくて良い。


読み分けてるコード、以下の init-loader-load の部分。環境毎に特定の正規表現のファイルを読み込むようになってるの分かる。正規表現、init-loader.el の初っ端に書いてあるので、それ見たら良いと思う。
で、今きづいたけど、ちゃんとこの機能、コメントにも書いてあるのな。このエントリ書いた意味ないとおもう。

(defun* init-loader-load (&optional (init-dir init-loader-directory))
  (let ((init-dir (init-loader-follow-symlink init-dir)))
    (assert (and (stringp init-dir) (file-directory-p init-dir)))
    (init-loader-re-load init-loader-default-regexp init-dir t)
    ;; meadow
    (and (featurep 'meadow)
         (init-loader-re-load init-loader-meadow-regexp init-dir))
    ;; carbon emacs
    (and (featurep 'carbon-emacs-package)
         (init-loader-re-load init-loader-carbon-emacs-regexp init-dir))
    ;; cocoa emacs
    (and (equal window-system 'ns)
         (init-loader-re-load init-loader-cocoa-emacs-regexp init-dir))
    ;; no window
    (and (null window-system)
         (init-loader-re-load init-loader-nw-regexp init-dir))
    ;; 2011/06/12 zqwell Windows/Linux 固有設定ファイル読み込み用
    ;; windows
    (and (featurep 'dos-w32)
	 (init-loader-re-load init-loader-win-regexp init-dir))
    ;; Linux
    (and (equal system-type 'gnu/linux)
	 (init-loader-re-load init-loader-lin-regexp init-dir))

    (when init-loader-show-log-after-init
      (add-hook  'after-init-hook 'init-loader-show-log))))