1

オンライン ヘルプは、このマクロについては有益ではありません。おそらく、Stackoverflow の方がうまくいくのではないでしょうか?

違いが生じる場合に備えて、emacs トランク (24.0.50.1) を使用しています。

ありがとう!

4

1 に答える 1

1

最初にhooksのマニュアルを読み、ドキュメントがこのマクロと比較するアドバイスを読みたいと思うでしょう。マクロを使用すると、将来のコードでラップアラウンドして動作を変更できるコードを作成できます。

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

次に、他の誰かhook-nameが次のような関数を追加できます。

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

引数は、関数オブジェクトにカプセル化された上記をyour-code表します。your code hereラッパーは元のコードを で呼び出すことができますが(funcall your-code)、そうする必要はありません。その場合、コードは完全にオーバーライドされます。フックにはいくつかの関数を含めることもでき、それぞれが最初の引数として次の関数を受け取ります。そのため、それぞれが次の関数の結果を変更する一連のラッパーが存在する可能性があります。これらの関数のそれぞれにいくつかの追加の引数を定義することもできます (上記の空の括弧はそのためのものです)。

例を見つけるには、ソースを grep したいかもしれません。1つの用途はexpand-abbrev次のとおりです。

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

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

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

于 2011-09-17T05:25:59.347 に答える