Previous: , Up: Autorevert   [Contents][Index]


18.5.3 追加のバッファーにたいする自動リバートのサポートの追加

このセクションは、新しいタイプのバッファーに自動リバートのサポートを追加したいElispプログラマーのために意図されています。

バッファーに自動リバートのサポートを追加するには、まず最初に適切なrevert-buffer-functionをもつことです。See Reverting in the Emacs Lisp Reference Manual.を参照してください。

それに加えて、適切なbuffer-stale-functionをもたなければなりません。

Variable: buffer-stale-function

この変数の値は、バッファーがリバートする必要があるかチェックする関数です。これは1つのオプション引数noconfirmをもつ関数です。この関数はバッファーがリバートされるべきときは、非nilを返します。バッファーは、この関数が呼ばれたときのバッファーです。

この関数は主に自動リバートで使うことを意図していますが、他の目的にも同様に使うことができます。たとえば自動リバートが無効の場合、これはバッファーをリバートする必要があるとユーザーに警告するのに使えます。このアイデアは引数noconfirmが背景にあります。もしこれがtのときは、ユーザーに尋ねることなくリバートを行い、この関数をバッファーが無効だとユーザーに警告するために使うときは、nilを指定します。特に自動リバートに使う場合、noconfirmtになります。関数を自動リバートだけに使う場合、引数noconfirmは無視できます。

(Buffer Menuのように)auto-revert-intervalで指定した秒数ごとに自動リバートを自動的に行いたいだけのときは、以下のようにします:

(setq-local buffer-stale-function
     #'(lambda (&optional noconfirm) 'fast))

これをバッファーのモード関数の中に記述します。

特別な戻り値‘fast’は、呼出側にリバートの必要性チェックは必要ないが、バッファーのリバートは早く行うことを呼出側に伝えます。これはauto-revert-verboseが非nilのときも、自動リバートがリバートメッセージを表示しないことも伝えます。これは重要です。なぜならauto-revert-interval秒ごとにリバートメッセージが表示されるのは、とても煩わしくなり得るからです。この戻り値で提供される情報は、関数が自動リバート以外の目的で使われる場合にも有用です。

バッファーが適切なrevert-buffer-functionおよびbuffer-stale-functionをもっていても、通常は問題がいくつか残ります。

バッファーは、unmodifiedとマークされているときだけ自動リバートします。したがって、さまざまな関数がバッファーをmodifiedとマークするのは、バッファーがリバートされることにより失われる情報を持つとき、またはユーザーがバッファーで作業しているので、自動リバートが迷惑だと信じる理由があるときだと確信する必要があります。ユーザーはmodifiedのステータスを手作業で調整することにより、常にこれをオーバーライドできます。これをサポートするために、unmodifiedとマークされたバッファーでのrevert-buffer-functionの呼び出しは、そのバッファーのunmodifiedのマークを維持すべきです。

一連の自動リバートで、ポイントがあちこちジャンプしないことを保証するのは重要です。もちろんバッファーが活発に変化するとき、ポイントが移動するのは仕方ありません。

revert-buffer-functionが、auto-revert-verbosetのとき出力される自動リバート自身のメッセージと重複する、不要なメッセージを出力しないことと、auto-revert-verboseにセットされたnil値を、効果的にオーバーライドすることを確実にするべきです。したがってモードを自動リバートに適合させることは、しばしばそのようなメッセージの削除をともないます。これはauto-revert-interval秒ごとに自動リバートを行うバッファーで特に重要です。

新しい自動リバートがEmacsの一部となったときは、global-auto-revert-non-file-buffersのドキュメント文字列にそれを記載するべきです。

同様にこのチャプターにセクションを追加するべきです。そのセクション は、バッファーの自動更新を有効にすることによりバッファーのすべての情報が完全に最新(または最新からauto-revert-interval秒後)であると保証されるかを、最小限かつ明確にすべきです。