フックとは?


8

明確にするために...たとえば、このドキュメントでは

フックは関数のリストを保持するLisp変数であり、明確に定義された場合に呼び出されます。(これはフックの実行と呼ばれます。)リスト内の個々の関数は、フックのフック関数と呼ばれます。たとえば、フックkill-emacs-hookはEmacsを終了する直前に実行されます...

評価kill-emacs-hook時に実行される一連の「フック関数」のリストを表す名前付きの変数(シンボル)kill-emacs-hookがあり、それによってそれらの関数を実行していると言っています。正しい?その後

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

追加されたauto-fill-modeことにより、特定され、そのリストにtext-mode-hookあり、すでに何に加えて。良い。今これ

(defcustom text-mode-hook nil
  "Normal hook run when entering Text mode and many related modes."
  :type 'hook
  :options '(turn-on-auto-fill flyspell-mode)
  :group 'wp)

を作成または変更しているようtext-mode-hookです。フックの性質とフックとの関係について混乱していdefcustomます。私の論理的な選択は、このコードがtext-mode-hook「タイプ」(elispのタイプが何を意味するのかわからない)の変数を作成することですhook。これは確かに、フックの最初の作成であるはずtext-mode-hookですか?もしそうなら、「オプション」とは何ですか?それらは想定されたフック関数ですか、それとも何か他のものですか?


1
あなたのリンクから:«:optionsキーワードは、変数の値の推奨リストを指定します。通常、:optionsはフックに適用されます。リストは単なる提案です。それは排他的ではありません。変数を設定する人は、それを他の値に設定できます。:optionsキーワードの後に​​表示されるリストは、ユーザーに便利な選択肢を提供することを目的としています。»
Sidhekin

回答:


6

Emacs Lispのフックの概念についてのあなたの理解は完全に正しいです。実際、「通常の」フックは単なる関数のリストです(すべての関数は引数を取りません。それ以外の場合、Emacs Lispでは通常「フック」または「通常のフック」と呼ばれません)。

これらの変数のほとんどは、名前がで終わる-hook。これらは通常のフックであり、によって実行されrun-hooksます。そのようなフックの値は関数のリストです。関数は引数なしで呼び出され、その値は完全に無視されます。そのようなフックに新しい関数を置くための推奨される方法は、を呼び出すことadd-hookです。

名前が終わる変数-functionsは通常異常なフックです(古いコードの中には非推奨の-hooksサフィックスを使用しているものもあります)。それらの値は関数のリストですが、これらの関数は特別な方法で呼び出されます(引数が渡されるか、戻り値が使用されます)。名前が終わる変数-functionは、値として単一の関数を持っています。

カスタマイズインターフェースは別物です。間のすべての違い defvarとは、defcustom後者が編集に「カスタマイズ」インターフェースを介して変数をユーザーに許可するということです。このインターフェイスは、特定のタイプのデータの編集を容易にすることができます。たとえば、それ:typetext-mode-hookis と言っているhook場合、カスタマイズインターフェイスは、それが常に関数のリストであること確認text-mode-hookます。さらに、あなたがされているオプションを指定することができますをお勧めして:options引数。

したがって、あなたの理解は正しく、defcustomそのオプションはEmacsに指示するための方法にすぎないため、ユーザーが「カスタマイズ」インターフェースを使用するときにユーザーをよりよく支援できます。


しかし、このaの例はすでに存在しているdefcustomため、すばらしいものではありませんtext-mode-hook。すでに含まれています。正しい?ここで、独自のモードを記述してからカスタマイズが必要な場合は、これを行います。私の混乱は、この例が実際にを作成してtext-mode-hookおり、変更していないことです。それは正しい理解ですか?これは確かに新しいを作成している場合やtext-mode-hook:options実行するオプションとして、これらの二つの機能を提供しているadd-hook右、リストに?
2015

@ 147pm、この例は、Emacsの既存のコードの一部がフックを表すカスタマイズ可能な変数をどのように定義するかを示しています。一言で言えばdefcustom、新しい変数を定義するだけです。この特定の例でtext-mode-hookは、作成され、その初期値はnilです。カスタマイズインターフェイスには、このリストに含める推奨値はturn-on-auto-fillおよびであることも伝えられていますflyspell-mode。ただしtext-mode-hook、プログラムで好きなように設定できます。これは通常の変数です。add-hook他の機能でも使用できます。
Mark Karpov

@ 147、つまり、すべてのキーワード引数はカスタマイズシステムのヒントにすぎず、それ以外では何の違いもありません。ヒントがないと、コードはになり(defvar text-mode-hook nil)ます。
Mark Karpov

しかし、これdefcustomはフックが最初に作成される方法ですか?それがどのように見えるか。言い換えると、この例は、Emacsコードのどこか深いところから取ったものです。
2015

@ 147pm、はい、正解です。
マークカルポフ2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.