アトミックウィンドウ(atomic window)とは少なくとも2つ以上の生きたウィンドウから組成された矩形領域であり以下のような特性をもちます:
split-window
(ウィンドウの分割を参照)を適用するとアトミックウィンドウ外部に新たなウィンドウの作成を試みる。
delete-window
(ウィンドウの削除を参照)を適用するとアトミックウィンドウ全体の削除を試みる。
delete-other-windows
(ウィンドウの削除を参照)を適用するとアトミックウィンドウによるフレームの充填、またはメインウィンドウ化を試みる(サイドウィンドウを参照)。
これはウィンドウ構造を変更する基本的な関数グループはアトミックウィンドウを生きたウィンドウのように扱い、それゆえアトミックウィンドウ内部の構造を保持することを意味しています。
アトミックウィンドウはファイルのリビジョン間の差異、異なる言語やマークアップでの同一テキストの表示のように、関連するバッファーを特定のマナーにしたがって同時に表示する際にのみ有意義なウィンドウレイアウトの構築と保持に有用です。特定のウィンドウの側面上のバーでウィンドウの情報を永続的に表示するためにも使用できます。
アトミックウィンドウは予約済みのウィンドウパラメーターwindow-atom
(ウィンドウのパラメーターを参照)の助けを借りて実装されていて、内部ウィンドウ(Emacsウィンドウの基本概念を参照)はアトミックウィンドウのルートウィンドウと呼ばれます。同じアトミックウィンドウの一部であるようなすべてのウィンドウは共通の祖先としてこのルートウィンドウをもち、window-atom
パラメーターに非nil
が割り当てられます。
以下の関数は指定したウィンドウを一部とするアトミックウィンドウのルートをリターンします:
この関数はwindowを一部とするようなアトミックウィンドウのルートウィンドウをリターンする。windowには有効なウィンドウを指定しなければならず、デフォルトは選択されたウィンドウ。windowがアトミックウィンドウの一部でなければnil
をリターンする。
アトミックウィンドウを新たに作成するには既存の内部ウィンドウを選んで以下の関数を適用するのがもっともシンプルなアプローチです:
この関数はwindowをアトミックウィンドウに変換する。windowには内部ウィンドウを指定しなければならない。この関数が行うのはwindowの子孫それぞれのwindow-atom
パラメーターにt
をセットすることだけである。
既存の生きたウィンドウから新たにアトミックウィンドウを作成したり、既存のアトミックウィンドウに新たにウィンドウを追加するには、以下のバッファーディスプレイアクション関数を使用できます(バッファー表示用のアクション関数を参照):
この関数は既存のウィンドウと組み合わせてアトミックウィンドウを形成することになる新たなウィンドウ内でbufferを表示する。既存のウィンドウがすでにアトミックウィンドウの一部なら、そのアトミックウィンドウに新たなウィンドウを追加する。
alistにはシンボルと値からなる連想リストを指定する。以下は特別な意味をもつシンボル:
window
このような要素は新たなウィンドウを組み合わせる既存のウィンドウを指定する。内部ウィンドウを指定すると、そのウィンドウのすべての子ウィンドウもアトミックウィンドウの一部になる。ウィンドウを何も指定しなければ新たなウィンドウは選択されたウィンドウの兄弟ウィンドウになる。既存ウィンドウのwindow-atom
パラメーターはそれが生きたウィンドウであり、かつwindow-atom
がすでにセット済みでなければmain
にセットされる。
side
このような要素は既存ウィンドウで新たなウィンドウが配置されるサイドを表す。有効な値はbelow
、right
、above
、left
。デフォルトはbelow
。この値は新たなウィンドウのwindow-atom
パラメーターにセットされる。
リターン値は新たなウィンドウ、ウィンドウ作成に失敗するとnil
。
非nil
である限りwindow-atom
パラメーターの値は問題ではないことに注意してください。display-buffer-in-atom-window
が割り当てる値は、関数の適用後に元のウィンドウと新たなウィンドウを簡単に取得することだけが目的です。display-buffer-in-atom-window
が割り当てるウィンドウパラメーターはwindow-atom
パラメーターだけであることにも注意してください。それ以外のパラメーターはalist内のwindow-parameters
エントリーを介してアプリケーションがセットする必要があります。
アトミックウィンドウはそれを構成するウィンドウのいずれかが削除された際には存在を終えます。アトミックウィンドウを手動で分解するためには、それを構成するウィンドウ(アトミックウィンドウのルートウィンドウと子孫)のwindow-atom
パラメーターをリセットしてください。
以下のスニペットコードを単一ウィンドウのフレームに適用すると、最初に選択されたウィンドウを分割して選択されたウィンドウと新たなウィンドウの親をルートとしてアトミックウィンドウを構成します。それからフレーム下辺にある新たなウィンドウでバッファー*Messages*を表示して、新たなウィンドウを作成したアトミックウィンドウの一部にします。
(let ((window (split-window-right))) (window-make-atom (window-parent window)) (display-buffer-in-atom-window (get-buffer-create "*Messages*") `((window . ,(window-parent window)) (window-height . 5))))
この時点においてフレーム内の任意のウィンドウでC-x 2をタイプすると、フレーム下辺に新たなウィンドウが作成されます。かわりにC-x 3をタイプすれば新たなウィンドウはフレーム右辺に配置されるでしょう。いずれのケースでもここでアトミックウィンドウ内の任意のウィンドウでC-x 1をタイプすると、新たなウィンドウだけが削除されます。アトミックウィンドウ内の任意のウィンドウでC-x 0をタイプすればフレームは新たなウィンドウで充填されるでしょう。