アトミックウィンドウとは、少なくとも2つのライブウィンドウからなる矩形の構成のことです。これらには、以下のような特徴的な性質があります。
split-window(ウィンドウの分割を参照)をアトミックウィンドウの構成要素に適用すると、そのアトミックウィンドウの外側に新しいウィンドウを作成しようとします。
delete-window(ウィンドウの削除を参照)をアトミックウィンドウの構成要素に適用すると、代わりにアトミックウィンドウ全体を削除しようとします。
delete-other-windows(ウィンドウの削除を参照)をアトミックウィンドウの構成要素に適用すると、そのアトミックウィンドウが自身のフレームまたはメインウィンドウを埋めるようになります(サイドウィンドウを参照)。
つまり、ウィンドウ構造を変更する基本的な関数群は、アトミックウィンドウをライブウィンドウと同様に扱い、それによってアトミックウィンドウの内部構造を保持するということです。
アトミックウィンドウは、ファイルリビジョン間の差異や、異なる言語やマークアップによる同一テキストの表示など、関連するすべてのバッファが特定の形式で同時に表示された場合にのみ意味を持つウィンドウレイアウトを構築・保持するのに有用です。また、特定のウィンドウに関連する情報を、そのウィンドウの左右のバーに恒久的に表示するためにも利用できます。
アトミックウィンドウは、予約済みの window-atom ウィンドウパラメータ(ウィンドウパラメータ
を参照)と、アトミックウィンドウのルートウィンドウと呼ばれる内部ウィンドウ(Emacsウィンドウの基本概念
を参照)を用いて実装されます。同一のアトミックウィンドウに属するすべてのウィンドウは、このルートウィンドウを共通の祖先とし、nil でも window-atom
でもないパラメータが割り当てられます。
以下の関数は、指定したウィンドウが属するアトミックウィンドウのルートを返します。
この関数は、アトミックウィンドウ 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 となります。
なお、window-atom パラメータの値は、nil 以外であれば実質的に任意です。display-buffer-in-atom-window
で割り当てられる値は、当該関数の適用後に元のウィンドウと新しいウィンドウを容易に取得できるようにするためのものです。また、window-atom パラメータは、display-buffer-in-atom-window
によって割り当てられる唯一のウィンドウパラメータである点にも注意してください。その他のパラメータについては、アプリケーション側で 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 と入力すると、その新しいウィンドウがフレーム全体に広がるようになります。