特殊なモードでは、ユーザーが同一のバッファから、性質の大きく異なる数種類のテキストにアクセスできるようにする必要があります。例えば、テキスト自体へのアクセスを可能にするだけでなく、バッファテキストの要約を表示させる必要がある場合などが考えられます。
これは、複数のバッファ(ユーザーがテキストを編集する際に同期が保たれる)を用いるか、あるいはナローイング(Narrowingを参照)によって実装可能です。しかし、こうした代替案は、特に各種類のテキストで正しい表示および編集コマンドを提供するためにコストの高いバッファグローバル操作が必要となる場合、時に煩雑になったり、コストが過大になったりすることがあります。
Emacsでは、こうしたモード向けに別の機能も提供されています。buffer-swap-text
を使えば、2つのバッファ間でバッファテキストを素早く切り替えることができます。この機能は、テキストを移動させず、バッファオブジェクトの内部データ構造を変更して別のテキストチャンクを指すようにするだけであるため、非常に高速です。これを利用することで、2つ以上のバッファのグループを、実際には個々のバッファの内容をすべてまとめて保持する単一の仮想バッファであるかのように扱うことができます。
この関数は、現在のバッファと引数 buffer のバッファの内容を入れ替えます。2つのバッファのいずれかが間接バッファ(間接バッファ を参照)であるか、あるいは間接バッファのベースバッファである場合は、エラーを通知します。
バッファテキストに関連するすべてのバッファプロパティも同様に入れ替わります。具体的には、ポイントとマークの位置、すべてのマーカー、オーバーレイ、テキストプロパティ、元に戻すリスト、enable-multibyte-charactersフラグの値(enable-multibyte-charactersを参照)などが該当します。
警告: この関数を save-excursion フォーム内から呼び出した場合、save-excursion
が位置とバッファを保存するために使用するマーカーも入れ替わるため、フォームを抜ける際に現在のバッファが buffer に設定されます。
ファイルアクセス用バッファで buffer-swap-text
を使用する場合は、スワップ先のテキストではなく、バッファの元のテキストを保存するフックを設定する必要があります。この目的には write-region-annotate-functions
が適しています。また、スワップ先のテキストの変更が自動保存を妨げないよう、バッファ内で buffer-saved-size を −2 に設定しておくのがよいでしょう。