本節では、既存のウィンドウを分割して新しいウィンドウを作成する関数について説明します。なお、一部のウィンドウは特殊な性質を持っており、これらの関数ではここで説明されている通りに分割できない場合があります。そのようなウィンドウの例としては、サイドウィンドウ(サイドウィンドウを参照)やアトミックウィンドウ(アトミックウィンドウを参照)が挙げられます。
この関数は、ウィンドウ window の隣に新しいライブウィンドウを作成します。window が省略された場合、または nil
が指定された場合は、選択中のウィンドウがデフォルトとなります。そのウィンドウは分割され、サイズが縮小されます。空いたスペースに新しいウィンドウが配置され、それが返されます。
省略可能な第2引数 size は、window
および/または新しいウィンドウのサイズを決定します。これが省略されるか、あるいは nil
が指定された場合、両方のウィンドウに等しいサイズが割り当てられ、奇数行がある場合は新しいウィンドウに割り当てられます。size が正の数の場合、window には size 行(または side
の値に応じて列)が割り当てられます。size が負の数の場合、新しいウィンドウには −size 行(または列)が割り当てられます。
size が nil である場合、この関数は変数
window-min-height および window-min-width に従います(ウィンドウサイズ
を参照)。したがって、分割によってウィンドウがこれらの変数で指定されたサイズよりも小さくなる場合は、エラーを通知します。ただし、size に nil
以外の値が指定されている場合は、これらの変数は無視されます。その場合、許容される最小のウィンドウは、高さ1行および/または幅2列のテキストを配置できるサイズであると見なされます。
したがって、size
が指定された場合、そこから展開されるウィンドウが、モードラインやスクロールバーといったすべての装飾を包含するのに十分な大きさであるかを確認するのは、呼び出し側の責任となります。この点に関して、関数
window-min-size(Window Sizes を参照)を用いて window の最小要件を判定できます。新しいウィンドウは通常、モードラインやスクロールバーなどの領域を window
から継承するため、この関数も新しいウィンドウの最小サイズを推測する上で有効な手段となります。呼び出し側は、次回の再表示前に継承した領域をそれに応じて削除する場合にのみ、より小さいサイズを指定すべきです。
省略可能な第3引数 side は、window
に対する新しいウィンドウの位置を指定します。これが nil または below の場合、新しいウィンドウは window
の下に配置されます。これが above の場合、新しいウィンドウは window の上に配置されます。いずれの場合も、size
はウィンドウの総高さを行単位で指定します。
side が t または right の場合、新しいウィンドウは window
の右側に配置されます。side が left
の場合、新しいウィンドウは window の左側に配置されます。いずれの場合も、size は列単位のウィンドウ全体の幅を指定します。
原則として、window がすでに side
に一致する組み合わせ(ウィンドウとフレーム
を参照)を形成しており(水平方向の組み合わせは、side が left または right
であれば一致し、垂直方向の組み合わせは、side が above または below であれば一致します)、かつ
window-combination-limit(ウィンドウの再結合 を参照)が nil である場合、この関数はウィンドウツリーにおける window の親を新しいウィンドウの親として再利用します。
ただし、window が side
と一致しない組み合わせである場合、あるいは window-combination-limit が
nil ではない場合、この関数はウィンドウツリー内の window を置き換える新しい親ウィンドウを作成し、window
と新しいウィンドウをその唯一の子ウィンドウとします。この標準的な動作は、refer
引数によって上書き可能です。
省略可能な第4引数 pixelwise が nil
以外の場合、size を行や列ではなくピクセル単位で解釈することを意味します。
省略可能な第5引数 refer が nil
以外の場合、新しいウィンドウのプロパティ設定に使用される参照ウィンドウを指定します。nil
以外の場合、refer はウィンドウ、または2つのウィンドウからなるコンスセルのいずれかになります。
refer がコンスセルである場合、その CAR は、window と同じフレーム上で、削除済みの元のライブウィンドウ – 以前にバッファを表示していたウィンドウ – を指定しなければならない。そのバッファは依然としてライブ状態でなければならない。CDR は、削除される前に window と同じフレーム上の親ウィンドウであった、削除済みのウィンドウを指定しなければならない。この場合、この関数は新しいウィンドウを作成するのではなく、ウィンドウツリーにおいて window を refer の CDR で置き換え、window と refer の CAR を新たな子ウィンドウとする。refer の CAR のバッファ、開始位置、およびポイント位置は、refer の CAR が最後に削除される直前の値に設定される。デコレーションとパラメータは、refer の CAR および CDR が削除される前の値から変更されない。
あるいは、refer は window と同じフレーム上で、削除された元のライブウィンドウ – 以前にバッファを表示していたウィンドウ – を指定することがあります。そのバッファは依然としてライブ状態でなければなりません。この場合、本関数は新しいウィンドウを作成するのではなく、refer を再びライブ状態にし、新しいウィンドウに割り当てられるはずだった位置およびサイズでウィンドウツリーに挿入します。refer のバッファ、開始位置、およびポイント位置は、前回 refer が削除される直前の値に設定されます。デコレーションとパラメータは、refer が削除される前の値から変更されません。その後、refer の親は、新たに作成されたウィンドウであるかのように決定されます。
それ以外の場合、refer はライブウィンドウを指定する必要があります。すると、新しいウィンドウは
refer からバッファ、開始位置、ポイント位置などのプロパティや、一部の装飾を継承します。refer が nil
であるか、あるいは省略されている場合、window がライブであれば、新しいウィンドウは window からこれらのプロパティを継承します。一方、window
が内部ウィンドウである場合、新しいウィンドウは window
のフレームで選択されたウィンドウからこれらのプロパティを継承します。
変数 ignore-window-parameters が nil である限り、この関数の動作は window
のウィンドウパラメータによって変更されることがあります。split-window
ウィンドウパラメータの値が t
である場合、この関数は他のすべてのウィンドウパラメータを無視します。そうでない場合、split-window ウィンドウパラメータの値が関数であれば、split-window の通常の動作に代わり、引数 window、size、および side を用いてその関数が呼び出されます。それ以外の場合、この関数は window-atom または window-side
ウィンドウパラメータ(もしあれば)に従います。ウィンドウパラメータ を参照してください。
例として、Windows and
Framesで解説されているウィンドウ構成を実現するsplit-window呼び出しのシーケンスを以下に示します。この例では、ライブウィンドウの分割と内部ウィンドウの分割の両方を示します。まず、単一のウィンドウ(ライブルートウィンドウ)を含むフレームから始め、これをW4と表記します。(split-window
W4)を呼び出すと、次のようなウィンドウ構成になります:
______________________________________
| ____________________________________ |
|| ||
|| ||
|| ||
||_________________W4_________________||
| ____________________________________ |
|| ||
|| ||
|| ||
||_________________W5_________________||
|__________________W3__________________|
split-window の呼び出しにより、W5
で示される新しいライブウィンドウが作成されました。また、W3
で示される新しい内部ウィンドウも作成され、これがルートウィンドウとなり、W4 と W5 の両方の親となります。
次に、内部ウィンドウ W3 を引数として渡し、(split-window W3 nil 'left) を呼び出します。結果は以下の通りです。
______________________________________
| ______ ____________________________ |
|| || __________________________ ||
|| ||| |||
|| ||| |||
|| ||| |||
|| |||____________W4____________|||
|| || __________________________ ||
|| ||| |||
|| ||| |||
|| |||____________W5____________|||
||__W2__||_____________W3_____________ |
|__________________W1__________________|
内部ウィンドウ W3 の左側に、新しいライブウィンドウ W2 が作成されます。新しい内部ウィンドウ W1 が作成され、新たなルートウィンドウとなります。
インタラクティブな操作用に、Emacsには選択中のウィンドウを常に分割する2つのコマンドが用意されています。これらは内部的にsplit-windowを呼び出します。
この関数は、ウィンドウ window-to-split を左右に並んだ2つのウィンドウに分割し、左側に window-to-split を配置します。window-to-split のデフォルト値は選択中のウィンドウです。size が正の場合、左側のウィンドウには size 列が割り当てられ、size が負の場合、右側のウィンドウには −size 列が割り当てられます。
この関数は、ウィンドウ window-to-split を上下2つのウィンドウに分割し、上のウィンドウを選択した状態にします。window-to-split のデフォルト値は、選択中のウィンドウです。size が正の場合、上のウィンドウには size 行が割り当てられ、size が負の場合、下のウィンドウには −size 行が割り当てられます。
この関数はフレーム全体を2つに分割します。現在のウィンドウ構成は上部に保持され、下部にはフレームの全幅を占める新しいウィンドウが作成されます。sizeはsplit-window-belowと同様に扱われます。
この関数はフレーム全体を2つに分割します。現在のウィンドウ構成は左側に保持され、右側にはフレームの全高を占める新しいウィンドウが作成されます。sizeはsplit-window-rightと同様に扱われます。
この変数の値が non-nil(デフォルト)の場合、split-window-below は上述のように動作します。
nil の場合、split-window-below
は再表示を最小限に抑えるため、2つのウィンドウそれぞれのポイントを調整します。(これは低速な端末で有用です。)前回ポイントがあった画面行を含む方のウィンドウを選択します。なお、これは
split-window-below にのみ影響し、下位レベルの split-window 関数には影響しません。