2011-09-17 4 views

答えて

1

まず、マニュアルでhooksを読んで、おそらくaround adviceを読んでこのマクロと比較したいと思うでしょう。このマクロを使用すると、将来のコードによってラップされて動作するコードを記述することができます。

(defun my-hook (your-code) 
    (let ((original-result (funcall your-code))) 
     (modify original-result))) 

関数オブジェクトにカプセル化上記your code here、の略your-code引数:

(with-wrapper-hook hook-name() 
    your code here) 

その後、他の誰かがこのようなものであることhook-nameに機能を追加することができます。ラッパーは(funcall your-code)で元のコードを呼び出すことができますが、必須ではありません。その場合、コードを完全に上書きします。フックには次の関数を最初の引数として受け取る関数がいくつか含まれることがあります。そのため、それぞれが次の関数の結果を変更する一連のラッパーが存在する可能性があります。これらの関数のそれぞれにいくつかの追加の引数を定義することもできます(上の空白の括弧が対象です)。

例を見つけるには、ソースをgrepしたいかもしれません。

(with-wrapper-hook abbrev-expand-functions() 
    ...) 

拡大-略語機能が十分に使用され、abbreviationsを展開し、それはあなたがこれは異なるモードで実行される方法をカスタマイズするためのフック(abbrev-expand-functionsを)持っている意味があります:1つの用途はexpand-abbrevです。このフックは、結果を変更できる必要があり、呼び出し元のコードにいくつかの結果を返すことができる必要があるため、「通常」にすることはできません。 (フックのドキュメントで説明されているように、通常のフックは引数なしで呼び出され、その戻り値は無視されるため、バッファ上の副作用に対してのみ呼び出されます)。

このフックの関数は、ラップされたコードを無視したり、ラップされたコードを呼び出すことができます。そのフックを使用する例はmail-abbrev-expand-wrapperです。To:ヘッダーを電子メールに入力するかどうかを確認します。その場合、標準の略語ではなくメールのエイリアスが展開されます。この関数は、略語展開(構文テーブル、略語テーブル)に影響を与えるさまざまな環境を変更し、実際の作業を行うためにラップされた関数を(funcall expand)で呼び出し、その結果を直接返します。

+0

ありがとうございました。注目すべきは、grepは、このマクロがemacs 24コードベースの3か所で使われていることを示しています。 – SetJmp

関連する問題