ウィンドウWの最後の兄弟を削除したときは、ウィンドウツリー内の親ウィンドウをWを置き換えることにより、その親ウィンドウも削除されます。これは新たなウィンドウコンビネーションを形成するために、Wがその親の兄弟たちと再結合されなければならないことを意味します。生きたウィンドウを削除することにより、必然的に2つの内部ウィンドウが削除されるかもしれない場合もあります。
______________________________________ | ______ ____________________________ | || || __________________________ || || ||| ___________ ___________ ||| || |||| || |||| || ||||____W6_____||_____W7____|||| || |||____________W4____________||| || || __________________________ || || ||| ||| || ||| ||| || |||____________W5____________||| ||__W2__||_____________W3_____________ | |__________________W1__________________|
この構成におけるW5の削除は、通常はW3とW4の削除を誘発します。残りの生きたウィンドウW2、W6、W7は親をW7とする水平コンビネーションを形成するために再結合されます。
しかし、ときにはW4のような親ウィンドウを削除しないほうが合理的な場合もあります。特に親ウィンドウが同じタイプのコンビネーション内に埋め込まれるコンビネーションを保護するために使用されるときは、それを削除するべきではありません。そのような埋め込みは、あるウィンドウを分割した後に続けて新たなウィンドウを削除する際、Emacsが関連するフレームで分割前にあったレイアウトを確実に再構築するために意味があります。
親がW1であるような2つの生きたウィンドウW2とW3を出発点とするシナリオを考えてみましょう。
______________________________________ | ____________________________________ | || || || || || || || || || || || || ||_________________W2_________________|| | ____________________________________ | || || || || ||_________________W3_________________|| |__________________W1__________________|
W2を分割すると以下のようにウィンドウW4が新たに作成されます。
______________________________________ | ____________________________________ | || || || || ||_________________W2_________________|| | ____________________________________ | || || || || ||_________________W4_________________|| | ____________________________________ | || || || || ||_________________W3_________________|| |__________________W1__________________|
ここでウィンドウを垂直方向に拡大すると、Emacsはもしそのようなウィンドウがあれば下位の兄弟ウィンドウから対応するスペースを得ようと試みます。このシナリオではW4の拡大により、W3からスペースが奪われます。
______________________________________ | ____________________________________ | || || || || ||_________________W2_________________|| | ____________________________________ | || || || || || || || || ||_________________W4_________________|| | ____________________________________ | ||_________________W3_________________|| |__________________W1__________________|
W4を削除すると、前にW3から奪ったスペースを含むスペース全体がW2に与えられるでしょう。
______________________________________ | ____________________________________ | || || || || || || || || || || || || || || || || ||_________________W2_________________|| | ____________________________________ | ||_________________W3_________________|| |__________________W1__________________|
これは特にW4が一時的にバッファーを表示するために使用されていて(一時的な表示を参照)、かつ初期のレイアウトで作業を継続したい場合には直感に反するかもしれません。
この振る舞いはW2を分割する際に新たな親ウィンドウを作成することにより解決できます。
この変数はウィンドウ分割により新たに親ウィンドウを作成させるかどうかを制御する。以下の値が認識される:
nil
これは既存のウィンドウコンビネーションと同じ方向で分割が発生した場合(これ以外の場合には、いずれにせよ内部ウィンドウが新たに作成される)は、既存の親ウィンドウが存在するなら新たな生きたウィンドウがそれを共有できることを意味する。
window-size
これはdisplay-buffer
がウィンドウを分割する際に新たな親ウィンドウを作成してalist引数のwindow-height
エントリーやwindow-width
エントリーに渡すことを意味する(バッファー表示用のアクション関数を参照)。それ以外の場合にはウィンドウの分割は値がnil
のときのように振る舞う。
temp-buffer-resize
この場合にはwith-temp-buffer-window
がウィンドウを分割して、かつtemp-buffer-resize-mode
が有効なら新たに親ウィンドウを作成する(一時的な表示を参照)。それ以外ならウィンドウ分割はnil
の場合のように振る舞う。
temp-buffer
この場合にはwith-temp-buffer-window
は既存のウィンドウの分割時に常に新たな親ウィンドウを作成する(一時的な表示を参照)。それ以外ならウィンドウ分割はnil
の場合のように振る舞う。
display-buffer
これはdisplay-buffer
(バッファーを表示するウィンドウの選択を参照)がウィンドウを分割する際に、常に親ウィンドウを新たに作成することを意味する。それ以外ならウィンドウ分割はnil
の場合のように振る舞う。
t
これはウィンドウを分割することによって常に親ウィンドウが新たに作成されることを意味する。したがってこの変数の値が常にt
なら、すべてのウィンドウツリーは常に2分木(ルートウィンドウ以外のすべてのウィンドウが正確に1つの兄弟をもつようなツリー)になる。
デフォルトはwindow-size
であり、それ以外の値は将来のために予約済み。
この変数のセッティングの結果としてsplit-window
が新たに親ウィンドウを作成したら、新たに作成された内部ウィンドウにたいしてset-window-combination-limit
(以下参照)も呼び出す。これは子ウィンドウが削除された際のウィンドウツリーの再配置に影響する(以下参照)。
window-combination-limit
がt
なら、このシナリオの初期構成では以下のようになるでしょう:
______________________________________ | ____________________________________ | || __________________________________ || ||| ||| |||________________W2________________||| || __________________________________ || ||| ||| |||________________W4________________||| ||_________________W5_________________|| | ____________________________________ | || || || || ||_________________W3_________________|| |__________________W1__________________|
子としてW2と新たな生きたウィンドウをもつ内部ウィンドウW5が新たに作成されます。ここでW2はW4の唯一の兄弟なので、W4を拡大するとW3は変更せずにW2の縮小を試みるでしょう。W5は垂直コンビネーションW1に埋め込まれた2つのウィンドウからなる垂直コンビネーションを表すことに注意してください。
この関数はウィンドウwindowのコンビネーションリミット(combination limit:
結合限界)をlimitにセットする。この値は関数window-combination-limit
を通じて取得できる。効果については以下を参照のこと。これは内部ウィンドウにたいしてのみ意味をもつことに注意。split-window
は呼び出された際に変数window-combination-limit
がt
なら、t
をlimitとしてこの関数を呼び出す。
この関数はwindowにたいするコンビネーションリミットをリターンする。
コンビネーションリミットは内部ウィンドウにたいしてのみ意味をもつ。これがnil
ならEmacsはウィンドウ削除に応じて、兄弟同士で新たなウィンドウコンビネーションを形成することによりwindowの子ウィンドウをグループ化するために、windowの自動的な削除を許す。コンビネーションリミットがt
ならwindowの子ウィンドウがその兄弟と自動的に再結合されることは決してない。
このセクションの冒頭で示した構成の場合は、W4
(W6とW7の親ウィンドウ)のコンビネーションリミットはt
なのでt
を削除しても暗黙でW4も削除されることはない。
かわりに同じ構成内の中の1つのウィンドウが分割や削除されたときは、常に構成内のすべてのウィンドウをリサイズすることにより上記で示した問題を避けることができます。これはそのような操作にたいして、この方法以外では小さすぎるようなウィンドウの分割も可能にします。
この変数が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-resize
がnil
なら、ウィンドウW3を分割してもW2のサイズは変更されません:
______________________________________ | ____________________________________ | || || || || || || || || ||_________________W2_________________|| | ____________________________________ | || || ||_________________W3_________________|| | ____________________________________ | || || ||_________________W4_________________|| |__________________W1__________________|
window-combination-resize
がt
なら、W3を分割すると3つの生きたウィンドウすべてをおおよそ同じ高さにします:
______________________________________ | ____________________________________ | || || || || ||_________________W2_________________|| | ____________________________________ | || || || || ||_________________W3_________________|| | ____________________________________ | || || || || ||_________________W4_________________|| |__________________W1__________________|
生きたウィンドウW2、W3、W4のいずれを削除しても、削除されたウィンドウのスペースは残りの2つの生きたウィンドウに相対的に分配されます。