fnwiya's quine

自分自身を出力するブログ

emacsでadd-hookをまとめて設定する

emacsでadd-hookが必要なパッケージを使うときに
ひとつのモードにつき一つずつ

(require 'rainbow-delimiters)
(add-hook 'prog-mode-hook 'rainbow-delimiters-mode)
(add-hook 'emacs-lisp-mode-hook 'rainbow-delimiters-mode)
(add-hook 'python-mode-hook 'rainbow-delimiters-mode)
(add-hook 'c-mode-hook 'rainbow-delimiters-mode)
(add-hook 'js2-mode-hook 'rainbow-delimiters-mode)

(require 'highlight-symbol)
(add-hook 'emacs-lisp-mode-hook 'highlight-symbol-mode)
(add-hook 'python-mode-hook 'highlight-symbol-mode)
(add-hook 'c-mode-hook 'highlight-symbol-mode)
(add-hook 'js2-mode-hook 'highlight-symbol-mode)

のようにしていくのは面倒ですし、
新しいmodeを追加しようと思ったときに、
どこに設定があるんだっけ?となって大変です。

そこで、ある程度の固まりでhookの固まりを作っておいて、
基本的にはそれを使い回すことで
DRYなemacs設定ファイルができます。

;; loopを使うために必要
(require 'cl)

;; ここにmode-hookを追加する
(defvar programing-hooks
  '(prog-mode-hook
    emacs-lisp-mode-hook
    python-mode-hook
    c-mode-hook
    js2-mode-hook))

(require 'rainbow-delimiters)
(loop for hook in programing-hooks
       do (add-hook hook 'rainbow-delimiters-mode))

(require 'highlight-symbol)
(loop for hook in programing-hooks
       do (add-hook hook 'highlight-symbol-mode))

もちろん全部のmodeに設定したくないものもあるでしょうから
それに関しては一つ一つ設定していくことになります。

一つのパッケージだけだとそれほど効果は感じられませんが、
複数のパッケージを利用する際にはかなり楽になるので、
ぜひご検討ください。