Previous: Auto Reverting Dired, Up: Autorevert [Contents][Index]
このセクションは、新しいタイプのバッファーに自動リバートのサポートを追加したいElispプログラマーのために意図されています。
バッファーに自動リバートのサポートを追加するには、まず最初に適切なrevert-buffer-function
をもつことです。See Reverting in the Emacs Lisp Reference
Manual.を参照してください。
それに加えて、適切なbuffer-stale-function
をもたなければなりません。
この変数の値は、バッファーがリバートする必要があるかチェックする関数です。これは1つのオプション引数noconfirmをもつ関数です。この関数はバッファーがリバートされるべきときは、非nil
を返します。バッファーは、この関数が呼ばれたときのバッファーです。
この関数は主に自動リバートで使うことを意図していますが、他の目的にも同様に使うことができます。たとえば自動リバートが無効の場合、これはバッファーをリバートする必要があるとユーザーに警告するのに使えます。このアイデアは引数noconfirmが背景にあります。もしこれがt
のときは、ユーザーに尋ねることなくリバートを行い、この関数をバッファーが無効だとユーザーに警告するために使うときは、nil
を指定します。特に自動リバートに使う場合、noconfirmはt
になります。関数を自動リバートだけに使う場合、引数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-verbose
がt
のとき出力される自動リバート自身のメッセージと重複する、不要なメッセージを出力しないことと、auto-revert-verbose
にセットされたnil
値を、効果的にオーバーライドすることを確実にするべきです。したがってモードを自動リバートに適合させることは、しばしばそのようなメッセージの削除をともないます。これはauto-revert-interval
秒ごとに自動リバートを行うバッファーで特に重要です。
新しい自動リバートがEmacsの一部となったときは、global-auto-revert-non-file-buffers
のドキュメント文字列にそれを記載するべきです。
同様にこのチャプターにセクションを追加するべきです。そのセクション
は、バッファーの自動更新を有効にすることによりバッファーのすべての情報が完全に最新(または最新からauto-revert-interval
秒後)であると保証されるかを、最小限かつ明確にすべきです。