GNU Emacs 32.0.50 (9008bf64c3) のマニュアルを PLaMo 翻訳で機械翻訳したものです。誤訳を含むことがあります。原文: https://www.gnu.org/software/emacs/manual/html_node/elisp/Setting-Hooks.html ・ emacs-doc.conao3.com

24.1.2 フックの設定

以下に、Lisp Interactionモード時にAuto Fillモードを有効にする関数をモードフックに追加する例を示します。

(add-hook 'lisp-interaction-mode-hook 'auto-fill-mode)

フック変数の値は、関数のリストである必要があります。このリストは通常のLispの機能を用いて操作できますが、モジュール的な手法としては、以下で定義されている関数 add-hook と remove-hook を使用することが挙げられます。これらの関数は、いくつかの特殊な状況への対応や問題の回避を担っています。

フックに lambda-expression 関数を定義することは可能ですが、混乱を招く恐れがあるため、避けることをおすすめします。同じ lambda-expression を2回目に追加し、わずかに記述を変えた場合、フック上には等価ながらも異なる2つの関数が存在することになります。その後、そのうちの1つを削除しても、もう一方は残ったままになります。

関数: add-hook hook function &optional depth local

この関数は、フック変数 hook に関数 function を追加するための便利な方法です。通常のフックだけでなく、特殊なフックにも利用できます。function には、hook に適した数の引数を受け取れる任意の Lisp 関数を指定できます。例えば、

(add-hook 'text-mode-hook 'my-text-hook-function)

text-mode-hook というフックに my-text-hook-function を追加します。

hook に既に function が含まれている場合(equal を用いて比較)、add-hook はそれを二重に追加しません。

function が nil 以外のプロパティ permanent-local-hook を持つ場合、kill-all-local-variables(またはメジャーモードの変更)によって、それがフック変数のローカル値から削除されることはありません。

通常のフックでは、フック関数は実行順序に依存しないように設計すべきです。順序への依存はトラブルの元となります。ただし、順序は予測可能です。通常、function はフックリストの先頭に位置するため、(別の add-hook 呼び出しがない限り)最初に実行されます。

場合によっては、フック上の関数の相対的な順序を制御することが重要になります。オプション引数 depth を使用すると、リスト内のどこに関数を挿入すべきかを指定できます。指定値は -100 から 100 までの数値である必要があり、値が大きいほど、関数はリストの末尾に近い位置に配置されます。depth のデフォルト値は 0 であり、後方互換性のため、depth が nil 以外のシンボルである場合は深度 90 として解釈されます。さらに、depth が 0 より厳密に大きい場合、関数は同じ深度の関数の前ではなく、後に追加されます。深度 100(または -100)は決して使用しないでください。なぜなら、他のどの関数が自分より前(または後)に配置される必要がないか、確信を持つことができないためです。

add-hook は、hook が void であるか、あるいはその値が単一の関数である場合に対応でき、値を関数のリストに設定または変更します。

local が nil でない場合、グローバルフックリストではなくバッファローカルフックリストに function を追加することを意味します。これにより、フックがバッファローカルになり、バッファローカルの値に t が追加されます。後者は、デフォルト値とローカル値の両方でフック関数を実行するためのフラグとして機能します。

関数: remove-hook hook function &optional local

この関数は、フック変数 hook から function を削除します。equal を用いて function と hook の要素を比較するため、シンボルとラムダ式の両方で動作します。

local が nil でない場合、グローバルフックリストではなくバッファローカルフックリストから function を削除することを意味します。