私が普段常用しているマクロを以下に書いておく.
(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は出典を失念してしまった.私のオリジナルではないことを明記しておく.
本記事以降で,これらマクロが頻繁に出てくることになる.