ファイルに大幅な変更を加えた後、その変更を取り消したい場合は、revert-bufferコマンドでファイルの以前のバージョンを読み込むことで、それらの変更を取り消すことができます。The GNU Emacs Manualのバッファの復元を参照してください。
このコマンドは、バッファの内容をディスク上の参照済みファイルの内容で置き換えます。この操作により、ファイルを参照または保存して以降のすべての変更が取り消されます。
デフォルトでは、最新の自動保存ファイルが閲覧中のファイルよりも新しく、かつ引数 ignore-auto が
nil である場合、revert-buffer
はその自動保存ファイルを代わりに使用するかどうかをユーザーに確認します。このコマンドを対話的に実行する場合、数値の接頭辞引数がなければ ignore-auto は t
となります。したがって、対話時のデフォルトでは自動保存ファイルの確認は行われません。
通常、revert-buffer はバッファを変更する前に確認を求めますが、引数 noconfirm が nil 以外の場合、revert-buffer は確認を求めません。
通常、このコマンドはnormal-modeを用いてバッファのメジャーモードとマイナーモードを再設定します。ただし、preserve-modesがnilでない場合は、モードは変更されません。
リバート処理では、insert-file-contents
の置換機能を利用して、バッファ内のマーカー位置を保持しようとします。リバート操作前にバッファの内容とファイルの内容が同一であれば、すべてのマーカーが保持されます。同一でない場合は、バッファの内容が変更されるため、バッファの先頭と末尾にある変更されていないテキスト(もしあれば)内のマーカーが保持されます。それ以外の追加マーカーを保持すると、問題が生じる可能性があります。
ファイル以外のソースから戻す際、通常はマーカーは保持されませんが、これは具体的な revert-buffer-function の実装次第です。
revert-buffer は、動作中はこの変数を nil 以外の値にバインドします。
本節の後半で説明する変数を設定することで、revert-buffer の動作をカスタマイズできます。
この変数には、確認なしに復元すべきファイルのリストが格納されています。値は正規表現のリストです。参照したファイル名がこれらの正規表現のいずれかに一致し、かつディスク上のファイルは変更されているがバッファは変更されていない場合、revert-buffer はユーザーに確認を求めることなくファイルを復元します。
主要なモードの中には、これらの変数に対してバッファローカルなバインディングを作成することで revert-buffer をカスタマイズするものがあります。
この変数の値は、このバッファを復元するために使用する関数です。復元処理を行うための、2つのオプション引数を持つ関数である必要があります。これら2つのオプション引数
ignore-auto と noconfirm
は、revert-buffer が受け取った引数です。
Diredモードのように、編集中のテキストがファイルの内容ではなく、別の方法で再生成可能なモードでは、この変数に、内容を再生成するための特殊な関数というバッファローカルな値が設定されることがあります。
この変数の値は、このバッファを復元する際に更新後の内容を挿入する関数を指定します。この関数には2つの引数が渡されます。1つ目は使用するファイル名、2つ目は、ユーザーが自動保存ファイルの読み込みを要求した場合には
t となります。
モードが revert-buffer-function ではなくこの変数を変更する理由は、revert-buffer
が行うその他の処理――確認の要求、元に戻すリストのクリア、適切なメジャーモードの決定、および以下に挙げるフックの実行――の重複や置き換えを避けるためです。
この通常のフックは、変更後の内容を挿入する前に、デフォルトの revert-buffer-function によって実行されます。カスタムの revert-buffer-function がこのフックを実行する場合としない場合があります。
この通常のフックは、変更後の内容を挿入した後、デフォルトの revert-buffer-function によって実行されます。カスタムの revert-buffer-function がこのフックを実行する場合としない場合があります。
この変数の値には、バッファの状態を保持する関数のリストが指定されます。リバート操作の前に、このリストに含まれる各関数が引数なしで呼び出され、特定の状態(例えば読み取り専用状態)を保持するラムダ関数を返す必要があります。リバート操作の後は、各ラムダ関数がリストの順に一つずつ呼び出され、リバートされたバッファに保存されていた状態を復元する必要があります。
Emacsではバッファを自動的にリバートできます。デフォルトでは、ファイルを参照しているバッファに対してこの機能が働きます。以下では、新しい種類のバッファで自動リバート機能を追加する方法について説明します。
まず、こうしたバッファには適切な revert-buffer-function および buffer-stale-function が定義されている必要があります。
この変数の値は、バッファのリバートが必要かどうかを判定するために呼び出す関数を指定します。デフォルト値では、ファイルを参照しているバッファのみを対象に、更新日時を確認します。ファイルを参照していないバッファには、1つのオプション引数
noconfirm を取るカスタム関数が必要です。この関数は、バッファをリバートすべき場合に nil 以外の値を返す必要があります。この関数が呼び出される際、バッファはカレント状態です。
この関数は主に自動リバートでの使用を想定していますが、他の目的で利用することも可能です。例えば、自動リバートが有効になっていない場合、バッファをリバートする必要があることをユーザーに警告するために使用できます。noconfirm 引数の考え方は、ユーザーに確認せずにバッファをリバートする場合は t とし、単にバッファが古くなっていることをユーザーに警告するために使用する場合は nil とするというものです。特に、自動リバートで使用する場合、noconfirm は t
となります。この関数を自動リバートにのみ使用する場合は、noconfirm 引数を無視して構いません。
単にauto-revert-interval秒ごとに自動的に元の状態に戻したい場合(Buffer
Menuのように)は、以下を使用してください:
(setq-local buffer-stale-function
(lambda (&optional noconfirm) 'fast))
バッファのモード関数において。
特殊な戻り値 ‘fast’
は、リバートの必要性は確認されなかったものの、バッファのリバートは高速であることを呼び出し元に伝えます。また、auto-revert-verbose が nil
でない場合でも、Auto Revert がリバートメッセージを出力しないよう指示します。auto-revert-interval
秒ごとにリバートメッセージが表示されると非常に煩わしいため、この点は重要です。この戻り値が提供する情報は、関数が自動リバート以外の目的で呼び出される場合にも有用です。
バッファに適切なrevert-buffer-functionとbuffer-stale-functionが揃ったとしても、通常は依然としていくつかの問題が残る。
バッファが自動的にリバージョンされるのは、未変更としてマークされている場合に限られます。したがって、バッファにリバージョンによって失われる可能性のある情報が含まれている場合、あるいはユーザーがバッファで作業中であるため自動リバージョンによって不便が生じると考えられる場合に限り、さまざまな関数がバッファを変更済みとしてマークするようにする必要があります。ユーザーは、バッファの変更状態を手動で調整することで、常にこの動作を上書きできます。これをサポートするため、未変更としてマークされているバッファに対して
revert-buffer-function
を呼び出した場合、常にそのバッファは未変更のまま維持される必要があります。
オートリバートによってポイントが絶えず飛び跳ねないようにすることが重要です。もちろん、バッファが劇的に変化した場合には、ポイントの移動が避けられないこともあります。
auto-revert-buffer は、動作中にこの変数を nil 以外の値にバインドします。これは、例えばメジャーモード revert-buffer-function
の実装において、オートリバートモード時のメッセージを抑制するために利用できます。
現在のバッファがこの変数(バッファのリスト)に含まれている場合、そのバッファに対する自動リバートは抑制されます。これは、予期せぬ自動リバートによって損なわれる恐れのある重大な変更をそのバッファに適用する場合に有用です。変更完了後、そのバッファはinhibit-auto-revert-buffersから削除されるものとします。
inhibit-auto-revert-buffersのメンバーシップチェックはbuffer-stale-functionの呼び出し前に実行されるため、当該関数内での負荷の高いチェックは回避されます。
ファイル通知によって自動リバートがトリガーされ、かつ inhibit-auto-revert-buffers がこれを妨げている場合、auto-revert-avoid-polling が nil でない限り、次にバッファの変更がポーリングされた際に自動リバートが発生します。(emacs)Auto
Revert を参照してください。
このマクロは、現在のバッファをinhibit-auto-revert-buffersに追加し、bodyを実行した後、inhibit-auto-revert-buffersから現在のバッファを削除します。
revert-buffer-function が、auto-revert-verbose が t
の場合に表示される Auto Revert 自身のメッセージを不必要に重複して出力し、実質的に auto-revert-verbose の nil
値を上書きしないようにする必要があります。したがって、自動復帰モードを調整する際には、こうしたメッセージを排除することが多くなります。これは、auto-revert-interval 秒ごとに自動的に復帰するバッファにおいて特に重要です。
新しい自動リバート機能がEmacsの一部である場合は、global-auto-revert-non-file-buffersのドキュメント文字列にその旨を記載してください。
同様に、Emacsのマニュアルにも追加内容を記載すべきです。