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


27.7 Recombining Windows

ウィンドウWの最後の兄弟を削除したときは、ウィンドウツリー内の親ウィンドウをWを置き換えることにより、その親ウィンドウも削除されます。これは、新たなウィンドウコンビネーションを形成するために、Wがその親の兄弟たちと再結合されなければならないことを意味します。生きたウィンドウを削除することにより、必然的に2つの内部ウィンドウが削除されるかもしれない場合もあります。

     ______________________________________
    | ______  ____________________________ |
    ||      || __________________________ ||
    ||      ||| ___________  ___________ |||
    ||      ||||           ||           ||||
    ||      ||||____W6_____||_____W7____||||
    ||      |||____________W4____________|||
    ||      || __________________________ ||
    ||      |||                          |||
    ||      |||                          |||
    ||      |||____________W5____________|||
    ||__W2__||_____________W3_____________ |
    |__________________W1__________________|

この構成におけるW5の削除は、通常はW3W4の削除を引き起こします。残りの生きたウィンドウW2W6W7は親をW7とする水平コンビネーションを形成するために再結合されます。

しかし、ときにはW4のような親ウィンドウを削除しないほうが合理的な場合もあります。特に、親ウィンドウが同じタイプのコンビネーション内に埋め込まれるコンビネーションを保護するために使用されるときは、それを削除するべきではありません。そのような埋め込みは、あるウィンドウを分割した後に続けて新たなウィンドウを削除する際、Emacsが関連するフレームで分割前にあったレイアウトを確実に再確立するために意味があります。

親がW1であるような2つの生きたウィンドウW2W3を開始点とするシナリオを考えてみましょう。

     ______________________________________
    | ____________________________________ |
    ||                                    ||
    ||                                    ||
    ||                                    ||
    ||                                    ||
    ||                                    ||
    ||                                    ||
    ||_________________W2_________________||
    | ____________________________________ |
    ||                                    ||
    ||                                    ||
    ||_________________W3_________________||
    |__________________W1__________________|

W2を分割すると、以下のようにウィンドウW4が新たに作成されます。

     ______________________________________
    | ____________________________________ |
    ||                                    ||
    ||                                    ||
    ||_________________W2_________________||
    | ____________________________________ |
    ||                                    ||
    ||                                    ||
    ||_________________W4_________________||
    | ____________________________________ |
    ||                                    ||
    ||                                    ||
    ||_________________W3_________________||
    |__________________W1__________________|

ここでウィンドウを垂直方向に拡大すると、Emacsはもしそのようなウィンドウがあれば、下位の兄弟ウィンドウから対応するスペースを得ようと試みます。このシナリオでふぁW4の拡大により、W3からスペースが奪われます。

     ______________________________________
    | ____________________________________ |
    ||                                    ||
    ||                                    ||
    ||_________________W2_________________||
    | ____________________________________ |
    ||                                    ||
    ||                                    ||
    ||                                    ||
    ||                                    ||
    ||_________________W4_________________||
    | ____________________________________ |
    ||_________________W3_________________||
    |__________________W1__________________|

W4を削除すると、前にW3から奪ったスペースを含む、スペース全体がW2に与えられるでしょう。

     ______________________________________
    | ____________________________________ |
    ||                                    ||
    ||                                    ||
    ||                                    ||
    ||                                    ||
    ||                                    ||
    ||                                    ||
    ||                                    ||
    ||                                    ||
    ||_________________W2_________________||
    | ____________________________________ |
    ||_________________W3_________________||
    |__________________W1__________________|

これは特にW4が一時的にバッファーを表示するために使用されていて(Temporary Displaysを参照)、かつ初期のレイアウトで作業を継続したい場合は直感に反するかもしれません。

この振る舞いは、W2を分割する際に、新たな親ウィンドウを作成することにより解決できます。

User Option: window-combination-limit

この変数は、ウィンドウ分割により新たに親ウィンドウを作成させるかどうかを制御する。以下の値が認識される:

nil

これは、既存のウィンドウコンビネーションと同じ方向で分割が発生した場合(これ以外の場合は、いずれにせよ内部ウィンドウが新たに作成される)は、既存の親ウィンドウが存在するならば、新たな生きたウィンドウがそれを共有できることを意味する。

window-size

この場合、display-bufferalist引数内のエントリーwindow-heightまたはwindow-widthに親ウィンドウが渡されるなら、新たに親ウィンドウを作成する(Display Action Functionsを参照)。

temp-buffer

この値は、一時的なバッファーを表示するウィンドウの分割に際し、新たに親ウィンドウを作成する。

display-buffer

これは、display-buffer(Choosing Windowを参照)がウィンドウを分割する際に、常に親ウィンドウを新たに作成することを意味する。

t

この場合は、ウィンドウを分割する際、常に親ウィンドウが新たに作成される。したがって、この変数の値が常にtの場合は、すべてのウィンドウツリーm常に2分木(ルートウィンドウ以外のすべてのウィンドウが正確に1つの兄弟をもつようなツリー)になる。

デフォルトはnilで、これら以外の値は将来のために予約済みである。

この返信のセッティングの結果としてsplit-windowが新たに親ウィンドウを作成した場合は、新たに作成された内部ウィンドウにたいしてset-window-combination-limit(以下参照)も呼び出す。これは、子ウィンドウが削除された際の、ウィンドウツリーの再配置に影響する(以下参照)。

window-combination-limittの場合、このシナリオの初期構成では以下のようになるでしょう:

     ______________________________________
    | ____________________________________ |
    || __________________________________ ||
    |||                                  |||
    |||________________W2________________|||
    || __________________________________ ||
    |||                                  |||
    |||________________W4________________|||
    ||_________________W5_________________||
    | ____________________________________ |
    ||                                    ||
    ||                                    ||
    ||_________________W3_________________||
    |__________________W1__________________|

子としてW2および新たな生きたウィンドウをもつ内部ウィンドウW5が新たに作成されます。ここでW2W4の唯一の兄弟なので、W4を拡大するとW3は変更せずに、W2を縮小しようと試みるでしょう。W5は垂直コンビネーションW1に埋め込まれた、2つのウィンドウからなる垂直コンビネーションを表すことに注意してください。

Function: set-window-combination-limit window limit

この関数は、ウィンドウwindowコンビネーションリミット(combination limit: 結合限界limitにセットする。この値は、関数window-combination-limitを通じて取得できる。効果については以下を参照のこと。これは内部ウィンドウにたいしてのみ意味をもつことに注意されたい。split-windowは、呼び出された際に変数window-combination-limittならば、tlimitとして、この関数を呼び出す。

Function: window-combination-limit window

この関数は、windowにたいするコンビネーションリミットをリターンする。

コンビネーションリミットは、内部ウィンドウにたいしてのみ意味をもつ。これがnilの場合は、Emacsはウィンドウ削除に応じて、兄弟同士で新たなウィンドウコンビネーションを形成することにより、windowの子ウィンドウをグループ化するために、windowの自動的な削除を許す。コンビネーションリミットがtの場合、windowの子ウィンドウは、その兄弟と自動的に再結合されることは決してない。

このセクションの冒頭で示した構成の場合、W4(W6W7の親ウィンドウ)のコンビネーションリミットはtなので、tを削除しても暗黙でW4も削除されることはない。

かわりに、同じ構成内の中の1つのウィンドウが分割または削除されたときは常に構成内のすべてのウィンドウをリサイズすることにより、上記で示した問題を避けることができます。これは、そのような操作にたいして、この方法以外では小さすぎるようなウィンドウの分割も可能にします。

User Option: window-combination-resize

この変数がnilの場合、split-windowはウィンドウ(以下window)自身と新たなウィンドウの両方にたいして、windowのスクリーンエリアが十分大きい場合のみ、windowを分割できる。

この変数がtの場合、split-windowは新たなウィンドウに対応するため、windowと同じコンビネーション内の、すべてのウィンドウのリサイズを試みる。これは特に、windowが固定サイズウィンドウのときや、通常の分割には小さすぎるときも、split-windowをが成功することを許す。さらに、続けてwindowをリサイズ、または削除すると、そのコンビネーション内のその他すべてのウィンドウをリサイズする。

デフォルトはnilで、それ以外の値は、将来の使用のため予約済みである。この変数の値は、window-combination-limitが非nilの場合は無視される。

window-combination-resizeの効果を説明するために、以下のフレームレイアウトを考えてください。

     ______________________________________
    | ____________________________________ |
    ||                                    ||
    ||                                    ||
    ||                                    ||
    ||                                    ||
    ||_________________W2_________________||
    | ____________________________________ |
    ||                                    ||
    ||                                    ||
    ||                                    ||
    ||                                    ||
    ||_________________W3_________________||
    |__________________W1__________________|

window-combination-resizenilの場合、ウィンドウW3を分割しても、W2のサイズは変更されません:

     ______________________________________
    | ____________________________________ |
    ||                                    ||
    ||                                    ||
    ||                                    ||
    ||                                    ||
    ||_________________W2_________________||
    | ____________________________________ |
    ||                                    ||
    ||_________________W3_________________||
    | ____________________________________ |
    ||                                    ||
    ||_________________W4_________________||
    |__________________W1__________________|

window-combination-resizetの場合は、W3を分割すると3つの生きたウィンドウすべてを、おおよそ同じ高さにします:

     ______________________________________
    | ____________________________________ |
    ||                                    ||
    ||                                    ||
    ||_________________W2_________________||
    | ____________________________________ |
    ||                                    ||
    ||                                    ||
    ||_________________W3_________________||
    | ____________________________________ |
    ||                                    ||
    ||                                    ||
    ||_________________W4_________________||
    |__________________W1__________________|

生きたウィンドウW2W3W4のいずれを削除しても、削除されたウィンドウのスペースは、残りの2つの生きたウィンドウに相対的に分配されます。