変数after-load-functions
を使用することにより、Emacsがライブラリーをロードするたびにコードを実行させることができます:
このアブノーマルフック(abnormal hook)は、ファイルをロードした後に実行される。フック内の各関数は1つの引数(ロードされたファイルの絶対ファイル名)で呼び出される。
特定のライブラリーのロード後にコードを実行したければ、マクロwith-eval-after-load
を使用します:
このマクロはlibraryがロードされるたびに、ファイルlibraryのロードの最後でbodyが評価されるよう準備する。libraryがすでにロード済みなら即座にbodyを評価する。
ファイル名libraryにディレクトリーや拡張子を与える必要はない。通常は以下のようにファイル名だけを与える:
(with-eval-after-load "js" (keymap-set js-mode-map "C-c C-c" 'js-eval))
どのファイルが評価をトリガーするか制限するには、ディレクトリーか拡張子、またはその両方をlibraryに含める。実際のファイル名(シンボリックリンク名はすべて除外される)が、与えられた名前すべてにマッチするファイルだけがマッチとなる。以下の例ではどこかのディレクトリー..../foo/bar
にあるmy_inst.elcやmy_inst.elc.gzは評価をトリガーするが、my_inst.elは異なる。:
(with-eval-after-load "foo/bar/my_inst.elc" ...)
libraryはフィーチャ(たとえばシンボル)でもよく、その場合には(provide
library)
を呼び出す任意のファイルの最後にbodyが評価される。
body内でのエラーはロードをアンドゥしないが、bodyの残りの実行を防げる。
上手く設計されたLispプログラムは、通常はwith-eval-after-load
を使用するべきではありません。(外部からの使用を意図した)他のライブラリーで定義された変数を調べたりセットする必要があるなら、それは即座に行うことができます
−−−
そのライブラリーがロードされるのを待つ必要はありまん。そのライブラリーで定義された関数を呼び出す必要があるならそのライブラリーをロードすべきであって、それにはrequire
(名前つき機能を参照)が適しています。