Subscribed unsubscribe Subscribe Subscribe

autoloadとセットでeval-after-loadを使うのが良い?

設定を見直し中 - すぎゃーんメモ シリーズ。
起動時に必ず読み込む必要ない関数ならautoloadを使う - すぎゃーんメモを書いてから気付いたけど、これで起動時のファイル読み込みを後回しにできるのは「関数に対してのみ」で(macroやkeymapも指定出来るようだけど引数の指定の仕方がよく分からない…)、変数を弄る場合などには使えない。
例えば

(autoload 'cperl-mode "cperl-mode" nil t)
(setq cperl-indent-level 4)

とやろうとしても、cperl-indent-levelはloadされていないと定義されていないので変更することができない。
(※2012-01-05追記: 「変更することができない」は間違い。id:masutaka26さんからご指摘いただきました。ただバイコンパイルする際に警告が出てしまいます。)

eval-after-load

id:poginさんからコメントで"lazyload"というマクロがある、と教えていただき、参考URLを読み直してみました。
http://e-arrows.sakura.ne.jp/2010/03/macros-in-emacs-el.html
ここではeval-after-loadを使ったマクロとして定義している。

― Function: eval-after-load library form
This function arranges to evaluate form at the end of loading the file library, each time library is loaded. If library is already loaded, it evaluates form right away. Don't forget to quote form!

http://www.gnu.org/software/emacs/manual/html_node/elisp/Hooks-for-Loading.html

ということで指定したファイルがロードされたときに評価される、とのことなので

(autoload 'cperl-mode "cperl-mode" nil t)
(eval-after-load "cperl-mode"
  '(progn
     (setq cperl-indent-level 4)))
(defalias 'perl-mode 'cperl-mode)

というように設定しておくと、

  1. 起動時にはautoloadでcperl-modeを登録するだけ
  2. 初めて.plファイルを開いたときにcperl-modeが呼び出され
  3. cperl-mode.elが読み込まれ関数が定義され
  4. その後eval-after-loadで指定したものが評価される

というカンジになる。はず。