with-eval-after-loadとrequireとautoloadとadd-hookと

発端

違いは何だ!!

まとめ

違ったら教えてください

  • 起動してずっと使ってる -> require
  • 起動時には必要ないけどmodeごとでは使う -> autoload
  • ライブラリでのsetqとかの設定 -> add-hook
  • ライブラリでのdefine-keyとかの設定 -> with-eval-after-load

調べた感じ

  • autoloadrequireは使うタイミングは似てる?
  • autoladは必要なときに読んでくるので起動時に必要ではないものを設定するといい
  • requireはこれが呼ばれたタイミングでライブラリ読むので起動時必要なものだけにしたほうが良さそう

起動時にjs2-modeが呼び出される

(require 'js2-mode)
(add-to-list 'auto-mode-alist '("\\.js$" . js2-mode))

初めてjsファイルを開いた時にjs2-modeが読み出される

(autoload 'js2-mode "js2-mode" nil t)
(add-to-list 'auto-mode-alist '("\\.js$" . js2-mode))

eval-after-loadwith-eval-after-loadadd-hookの違い

  • eval-after-loadwith-eval-after-loadの違いはwith-eval-after-loadはemacs24.4から新しく入ったマクロでprogn使わなくて良くなった
  • add-hookはバッファを呼び出すたびに呼ばれる
  • eval-after-loadは最初に設定しているライブラリがloadされるたびに呼ばれるが2回目以降は早いらしい

This macro arranges to evaluate body at the end of loading the file library, each time library is loaded. If library is already loaded, it evaluates body right away. 15.10 Hooks for Loading

  • setqとかはadd-hookがよくてdefine-keyとかはwith-eval-after-loadかな?

参考