インダイレクトバッファー(indirect buffer: 間接バッファー)は、そのインダイレクトバッファーのベースバッファー(base buffer: 基底バッファー)と呼ばれる、他のバッファーのテキストを共有します。ある点においては、ファイルにおけるシンボリックリンクの、バッファー版に例えることができます。
カレントバッファーの、インダイレクトバッファーを作成します。
カレントバッファーのインダイレクトバッファーを作成して、それを別のウィンドウで選択します(clone-indirect-buffer-other-window
)。
インダイレクトバッファーのテキストは、常にベースバッファーのテキストと等しく、どちらかを編集すると、その変更はすぐにもう一方から見えるようになります。ここで言う“テキスト”にはテキストの文字とそれらのテキストプロパティの両方が含まれます。しかし他の観点では、インダイレクトバッファーとベースバッファーは、完全に分離されています。これらのバッファーは異なる名前、異なるポイント値、異なるナローイング、異なるマーカー、異なるオーバーレイ、異なるメジャーモード、異なるローカル変数をもつことができます。
インダイレクトバッファーはファイルをvisitできませんが、ベースバッファーはvisitできます。インダイレクトバッファーの保存を試みると、それは実際にはベースバッファーの保存として機能します。ベースバッファーをkillするとインダイレクトバッファーもkillされますが、インダイレクトバッファーのkillは、ベースバッファーに影響を与えません。
インダイレクトバッファーの1つの使い方としては、アウトラインの複数の視点からの表示です。複数ビューによるアウトラインの閲覧を参照してください。
手早くインダイレクトバッファーを作成するには、コマンドC-x 4 c
(clone-indirect-buffer-other-window
)を使う方法があります。これはカレントバッファーをベースバッファーとする、インダイレクトバッファーを作成して選択します。数引数を指定すると、インダイレクトバッファーの名前の入力を求めます。指定しない場合、カレントバッファー名の後ろに‘<n>’を付加した名前を使います。
インダイレクトバッファーを作成する、より一般的な方法はコマンドM-x make-indirect-bufferです。これはバッファーbase-bufferから、名前がindirect-nameのインダイレクトバッファーを作成します。これらの名前は、ミニバッファーを使って入力が求められます。
インダイレクトバッファーを作成した関数はインダイレクトバッファーの作成後にフックclone-indirect-buffer-hook
を実行します。このフックの実行時には、作成されたインダイレクトバッファーがカレントバッファーになります。
注意: バッファーのテキストにたいして変更が行われた際には、変更フックはベースバッファーでのみ実行されます。なぜならこれらのフックに登録されている関数のほとんどは、インダイレクトバッファーで正しく動作するように想定されていないからです。したがってインダイレクトバッファーで変更フック関数が必要なら、ベースバッファーにおいて手動でその関数を追加してから、その関数に目的であるインダイレクトバッファーを処理させる必要があります。