次: , 前: Easy Customization, 上: Variables


28.2.3 フック

フックとはある特定の状況で既存のプログラムから呼び出される 関数/関数群を格納しておく変数をいいます。 Emacsには、カスタマイズ用のフックが数多くあります。

Emacs中のほとんどのフックはノーマルフックです。 これらの変数は、引数なしで呼び出される関数のリストを保持します。 ほとんどのフックがノーマルフックなのは、それらを統一的に扱えるからです。 Emacsでは、`-hook'で終わる名前の変数はすべてノーマルフックです。

ほとんどのメジャーモードは初期設定の最終段階でフックを実行します。 モードが設定したローカル変数をフックで変更すればよいので、 モードのふるまいをユーザーがカスタマイズすることが容易になります。 しかし、フックはそれ以外の場面でも使われます。 たとえば、suspend-hookは、Emacsが休止する直前に実行されます (see Exiting)。

ノーマルフックにフック関数を追加するお勧めのやり方は、 add-hookを呼ぶことです。 フック関数としては任意のLisp関数を使えます。 たとえば、テキスト(text)モードやテキスト(text)モードを 基にしているモードにおいて、 自動的に自動詰め込み(auto-fill)モードをオンにするにはつぎのようにします

     (add-hook 'text-mode-hook 'turn-on-auto-fill)

つぎの例は、Cコードの字下げをカスタマイズするのにフックを 使う方法を示します。 (誰でも字下げには独自の好みがある)。 ここでは、フック関数は名前のないラムダ式です。

     (setq my-c-style
       '((c-comment-only-line-offset . 4)
         (c-cleanup-list . (scope-operator
     		       empty-defun-braces
     		       defun-close-semi))
         (c-offsets-alist . ((arglist-close . c-lineup-arglist)
     			(substatement-open . 0)))))
     
     (add-hook 'c-mode-common-hook
       (function (lambda ()
         (c-add-style "my-style" my-c-style t))))

どの順番で実行されても大丈夫なようにフック関数を設計するのが最良です。 実行順序に依存するのは、『事故を呼び込む』ようなものです。 しかし、順番は予測できます。 もっとも最近に追加したフック関数ほど先に実行されます。