Emacsのマクロ定義

私が普段常用しているマクロを以下に書いておく.

(defmacro append-to-list (to list)
  (declare (indent 1))
  `(setq ,to (append ,list ,to)))

(defmacro require-if-locate (lib &rest body)
  (declare (indent 1))
  `(when (require ',lib nil t)
     (progn ,@body)))

(defmacro add-hook-fn (name &rest body)
  (declare (indent 1))
  `(add-hook ,name #'(lambda() ,@body)))

(defmacro lazyload (func lib docstring &rest body)
  (declare (indent 3))
  `(when (locate-library ,lib)
     ,@(mapcar (lambda (f) `(autoload ',f ,lib ,docstring t)) func)
     (eval-after-load ,lib
       '(progn ,@body))))

(defmacro my-eval-after-load (lib &rest body)
  (declare (indent 1))
  `(when (locate-library ,lib)
     (eval-after-load ,lib
       '(progn ,@body))))

(defmacro defkey (keymap key command)
  `(define-key ,keymap ,(read-kbd-macro key) ,command))

(defmacro gdefkey (key command)
  `(define-key global-map ,(read-kbd-macro key) ,command))

lazyloadやadd-hook-fn, append-to-listは深町氏の記事
http://e-arrows.sakura.ne.jp/2010/03/macros-in-emacs-el.html を参考にした.
差分はlazyloadにdocstringを追加したぐらいだが.
require-if-locateは出典を失念してしまった.私のオリジナルではないことを明記しておく.
本記事以降で,これらマクロが頻繁に出てくることになる.