Next: , Previous: , Up: Windows   [Contents][Index]


28.18 アトミックウィンドウ

アトミックウィンドウ(atomic window)とは少なくとも2つ以上の生きたウィンドウから組成された矩形領域であり以下のような特性をもちます:

これはウィンドウ構造を変更する基本的な関数グループはアトミックウィンドウを生きたウィンドウのように扱い、それゆえアトミックウィンドウ内部の構造を保持することを意味しています。

アトミックウィンドウはファイルのリビジョン間の差異、異なる言語やマークアップでの同一テキストの表示のように、関連するバッファーを特定のマナーにしたがって同時に表示する際にのみ有意義なウィンドウレイアウトの構築と保持に有用です。特定のウィンドウの側面上のバーでウィンドウの情報を永続的に表示するためにも使用できます。

アトミックウィンドウは予約済みのウィンドウパラメーターwindow-atom (Window Parametersを参照)の助けを借りて実装されていて、内部ウィンドウ(Basic Windowsを参照)はアトミックウィンドウのルートウィンドウと呼ばれます。同じアトミックウィンドウの一部であるようなすべてのウィンドウは共通の祖先としてこのルートウィンドウをもち、window-atomパラメーターに非nilが割り当てられます。

以下の関数は指定したウィンドウを一部とするアトミックウィンドウのルートをリターンします:

Function: window-atom-root &optional window

この関数はwindowを一部とするようなアトミックウィンドウのルートウィンドウをリターンする。windowには有効なウィンドウを指定しなければならず、デフォルトは選択されたウィンドウ。windowがアトミックウィンドウの一部でなければnilをリターンする。

アトミックウィンドウを新たに作成するには既存の内部ウィンドウを選んで以下の関数を適用するのがもっともシンプルなアプローチです:

Function: window-make-atom window

この関数はwindowをアトミックウィンドウに変換する。windowには内部ウィンドウを指定しなければならない。この関数が行うのはwindowの子孫それぞれのwindow-atomパラメーターにtをセットすることだけである。

既存の生きたウィンドウから新たにアトミックウィンドウを作成したり、既存のアトミックウィンドウに新たにウィンドウを追加するには、以下のバッファーディスプレイアクション関数を使用できます(Buffer Display Action Functionsを参照):

Function: display-buffer-in-atom-window buffer alist

この関数は既存のウィンドウと組み合わせてアトミックウィンドウを形成することになる新たなウィンドウ内でbufferを表示する。既存のウィンドウがすでにアトミックウィンドウの一部なら、そのアトミックウィンドウに新たなウィンドウを追加する。

alistにはシンボルと値からなる連想リストを指定する。以下は特別な意味をもつシンボル:

window

このような要素は新たなウィンドウを組み合わせる既存のウィンドウを指定する。内部ウィンドウを指定すると、そのウィンドウのすべての子ウィンドウもアトミックウィンドウの一部になる。ウィンドウを何も指定しなければ新たなウィンドウは選択されたウィンドウの兄弟ウィンドウになる。既存ウィンドウのwindow-atomパラメーターはそれが生きたウィンドウであり、かつwindow-atomがすでにセット済みでなければmainにセットされる。

side

このような要素は既存ウィンドウで新たなウィンドウが配置されるサイドを表す。有効な値はbelowrightaboveleft。デフォルトはbelow。この値は新たなウィンドウのwindow-atomパラメーターにセットされる。

リターン値は新たなウィンドウ、ウィンドウ作成に失敗するとnil

nilである限りwindow-atomパラメーターの値は問題ではないことに注意してください。display-buffer-in-atom-windowが割り当てる値は、関数の適用後に元のウィンドウと新たなウィンドウを簡単に取得することだけが目的です。display-buffer-in-atom-windowが割り当てるウィンドウパラメーターはwindow-atomパラメーターだけであることにも注意してください。それ以外のパラメーターはalist内のwindow-parametersエントリーを介してアプリケーションがセットする必要があります。

以下のスニペットコードを単一ウィンドウのフレームに適用すると、最初に選択されたウィンドウを分割して選択されたウィンドウと新たなウィンドウの親をルートとしてアトミックウィンドウを構成します。それからフレーム下辺にある新たなウィンドウでバッファー*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をタイプすればフレームは新たなウィンドウで充填されるでしょう。