[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] |
本章では、Emacsのウィンドウに関したほとんどの関数と変数について述べます。 ウィンドウにどのようにテキストが表示されるかに関しては、 37. Emacsの画面表示を参照してください。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] |
Emacsのウィンドウ(window)は、 バッファを表示するスクリーン上の物理的な領域のことです。 この用語は、Emacs Lispにおいて、当該物理領域を表す Lispオブジェクトを意味するためにも使います。 どちらの意味かは文脈から明らかなはずです。
Emacsではウィンドウをフレームにまとめています。 フレームは、Emacsが使えるスクリーンの領域を表します。 各フレームには少なくとも1つのウィンドウがつねにありますが、 フレームは上下や左右に重なり合わない複数のEmacsのウィンドウに分割できます。
ある時点では、各フレームにはフレームの選択されているウィンドウと 区別されるウィンドウがたった1つだけあります。 フレームのカーソルはそのようなウィンドウに現れます。 ある時点では、1つのフレームが選択されているフレームであり、 当該フレームで選択されているウィンドウが選択されているウィンドウです。 選択されているウィンドウのバッファが、 (set-buffer
を使った場合を除いて)普通はカレントバッファです。 See 節 26.2 カレントバッファ (2003/10/30)。
実用上、ウィンドウは、それがフレームに表示されている期間だけ存在します。 フレームからいったん取りさると、(ウィンドウへの参照が残っているとしても) ウィンドウは実質的には削除され使えません。 保存したウィンドウ構成を復元する以外に、 スクリーンから消えたウィンドウを戻す方法はありません。 (see 節 27.3 ウィンドウの削除。)
各ウィンドウにはつぎの属性があります。
複数のバッファを同時に見られるようにユーザーは複数のウィンドウを作ります。 さまざまな理由でLispライブラリは複数のウィンドウを使いますが、 そのほとんどは、関連する情報を表示するためです。 たとえば、rmailでは、あるウィンドウのサマリバッファで移動すると、 別のウィンドウでは対応するメッセージを表示します。
Emacsにおける『ウィンドウ』の意味は、 Xのような汎用目的のウィンドウシステムにおける意味に似ていますが、 同一ではありません。 Xウィンドウシステムは、スクリーン上にXのウィンドウを配置します。 Emacsは、1つか複数のXのウィンドウをフレームとして使い、 それらをEmacsのウィンドウに分割します。 文字端末でEmacsを使うと、 Emacsは端末のクリーン全体を1つのフレームとして扱います。
ほとんどのウィンドウシステムは、任意に重ね合わさったウィンドウを扱えます。 対照的に、Emacsのウィンドウはタイル型です。 つまり、互いに重なり合うことはなく、 スクリーンやフレームの全面に敷き詰められます。 Emacsが新たなウィンドウを作成する方法や ウィンドウサイズの変更方法に起因するのですが、 Emacsのフレームを任意の形にウィンドウで敷き詰めることは、 実際には必ずしも可能であるとは限りません。 27.2 ウィンドウの分割とSee 節 27.13 ウィンドウサイズ。
ウィンドウのバッファの内容がどのようにウィンドウに表示されるかについては、 See 節 37. Emacsの画面表示。
t
を返す。[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] |
ここで述べる関数は、ウィンドウを2つに分割するための基本関数です。 上位レベルの2つの関数、pop-to-buffer
とdisplay-buffer
も ウィンドウを分割しますが、 つねに分割するとは限りません(see 節 27.7 ウィンドウへのバッファの表示)。
ここに述べる関数は、引数にはバッファを受け付けません。 分割されたウィンドウの2つの『部分』には、分割前に表示されていたのと 同じバッファが始めは表示されます。
horizontalがnil
以外であると、windowは左右に分かれる。 もとのウィンドウwindowは左端のsizeコラムに留まり、 残りのコラムは新たなウィンドウに与えられる。 さもなければ、ウィンドウは上下に分かれ、 windowは上側のsize行に留まり、 残りの行は新たなウィンドウに与えられる。 したがって、もとのウィンドウは左側か上側にあり、 新たなウィンドウは右側か下側にある。
windowを省略したりnil
であると、 選択されているウィンドウを分割する。 sizeを省略したりnil
であると、 windowを均等に分ける。 (余分な行は新たなウィンドウに与える。) split-window
が対話的に呼び出されると、 すべての引数はnil
である。
つぎの例では、50行×80コラムのスクリーン上の1つのウィンドウを分割する。
(setq w (selected-window)) => # |
スクリーンはつぎのようになる。
┌──────┐ │ │ 0行目 │ w │ │ │ ├──────┤ │ │15行目 │ w2 │ │ │ └──────┘ 50行目 コラム0 コラム80 |
つぎに上側のウィンドウを左右に分割する。
(setq w3 (split-window w 35 t)) => # |
スクリーンはつぎのようになる。
コラム35 ┌─┬────┐ │ │ │ 0行目 │w│ w3 │ │ │ │ ├─┴────┤ │ │15行目 │ w2 │ │ │ └──────┘ 50行目 コラム0 コラム80 |
通常、Emacsは左右に並んだウィンドウの境界を スクロールバー(see 節 Scroll Bars)か 文字`|'で表す。 表示テーブルで境界に別の文字を指定できる。 37.14 表示テーブルを参照。
この関数はsplit-window
の単なるインターフェイスである。 その完全な関数定義はつぎのとおりである。
(defun split-window-vertically (&optional arg) "Split current window into two windows, ..." (interactive "P") (split-window nil (and arg (prefix-numeric-value arg)))) |
この関数はsplit-window
の単なるインターフェイスである。 split-window-horizontally
の完全な関数定義は (説明文字列を除けば)つぎのとおりである。
(defun split-window-horizontally (&optional arg) "Split selected window into two windows, side by side..." (interactive "P") (split-window nil (and arg (prefix-numeric-value arg)) t)) |
nil
以外を返す。 引数no-miniがnil
以外であると、 ミニバッファが活性であってもそれを数えないことを意味する。 さもなければ、ミニバッファが活性であればそれも総ウィンドウ個数に数えて 1と比較する。
引数all-framesは、どのフレームを対象にするかを指定する。 指定できる値とその意味はつぎのとおりである。
nil
t
visible
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] |
ウィンドウを削除するある種の関数を呼び出して ウィンドウを削除しない限り、 ウィンドウはそのフレームに表示され続けます。 削除されたウィンドウがスクリーンに現れることはありませんが、 それを参照するものがある限りLispオブジェクトととしては 存在し続けます。 保存したウィンドウ構成(see 節 27.16 ウィンドウ構成)を復元する以外には、 ウィンドウの削除は取り消せません。 ウィンドウ構成を復元すると、 その構成に含まれないウィンドウはすべて削除されます。
ウィンドウを削除すると、それが使っていた場所は 近接する兄弟ウィンドウの1つに与えられます。
nil
を返し、 さもなければt
を返す。
警告: 削除されたウィンドウを正しいものとして使うと、 誤った情報や重大なエラーを引き起こす。
nil
を返す。 windowを省略すると、選択されているウィンドウを削除する。 delete-window
を呼び出したときにたった1つのウィンドウしかないと エラーを通知する。nil
であると、 選択されているウィンドウをデフォルトで使う。
これはnil
を返す。
delete-windows-on
はフレームを1つ1つ処理する。 フレームに異なるバッファを表示しているウィンドウが複数ある場合、 それらのうちでbufferを表示しているものを削除し、 他のものは空いた領域を埋めるために拡張される。 あるフレームのすべてのウィンドウ(たった1つのウィンドウである場合も含む) がbufferを表示している場合、当該フレームは、 other-buffer
で選ばれる別のバッファを表示する 1つのウィンドウだけになる。 see 節 26.8 バッファリスト (2003/10/30)。
引数frameは、どのフレームを対象にするかを指定する。 この関数は、すべてのウィンドウを走査する他の関数と同じようには frameを使わない。 特に、t
とnil
の値の意味は他の関数とは逆である。 以下に詳細を示す。
nil
であると、すべてのフレームを対象にする。t
であると、選択されているフレームを対象にする。visible
であると、すべての可視フレームを対象にする。この関数はつねにnil
を返す。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] |
ウィンドウを選択すると、当該ウィンドウのバッファがカレントバッファになり、 カーソルがそのウィンドウに現れます。
戻り値はwindowである。
(setq w (next-window)) (select-window w) => # |
このマクロは、ウィンドウサイズ、配置、内容に関して いっさいなにも保存したり復元しないので、 formsがそれらを変更するとその変更は持続する。
ある時点で、各フレームにはフレームの選択されているウィンドウがある。 このマクロは、選択されているウィンドウだけを保存し、 他のフレームについてはなにも保存しない。 formsが別のフレームを選択して そのフレームの選択されているウィンドウを変更すると、その変更は持続する。
以下の関数は、さまざま条件でスクリーン上のウィンドウの1つを選びます。
ウィンドウがたった1つであると、 選択されているウィンドウが もっとも昔に使われたウィンドウであることもありうる。 新たに作成されたウィンドウは、選択されるまではもっとも昔に 使われたウィンドウになる。 ミニバッファ用ウィンドウは候補にはならない。
引数frameは、どのウィンドウを対象とするかを制御する。
nil
であると、選択されているフレームのウィンドウを対象とする。t
であると、すべてのフレームのウィンドウを対象とする。visible
であると、 すべての可視フレームのウィンドウを対象とする。同じ大きさのウィンドウが2つある場合、 この関数は、選択されているウィンドウから始めて ウィンドウの巡回順序(次節参照)で最初のウィンドウを返す。
引数frameは、ウィンドウのどのような集まりを対象にするかを指定する。 うえのget-lru-window
を参照。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] |
つぎのウィンドウを選択するためにコマンドC-x o(other-window
)を 使うと、スクリーン上のすべてのウィンドウをある巡回順序で巡ります。 ウィンドウのある構成において、この順序は変わりません。 これをウィンドウの巡回順序(cyclic ordering of windows)と呼びます。
この順番は一般に上から下、左から右になります。 しかし、ウィンドウを分割した順番に依存して、 下や右が最初になることもあります。
最初に上下に分割してつぎに左右に分割すると、 順番は、フレームの上側で左から右、フレームのその下では左から右 といった具合になります。 最初に左右に分割すると、 順番は、フレームの左側で上から下といった具合になります。 一般に、ウィンドウ木のあるレベルで分割された各兄弟の中では、 順番は、左から右、あるいは、上から下になります。
引数minibufの値は、ミニバッファを ウィンドウの順序に含めるかどうかを決定する。 minibufがnil
であると、 ミニバッファが活性であるときにはミニバッファを含める。 これはC-x oのふるまいである。 (ミニバッファが使われているあいだは、 ミニバッファ用ウィンドウは活性である。 see 節 19. ミニバッファ。)
minibufがt
であると、 ミニバッファが活性でなくても巡回順序にミニバッファ用ウィンドウを含める。
minibufがt
でもnil
でもないと、 活性であってもミニバッファ用ウィンドウを含めない。
引数all-framesは、どのフレームを対象にするかを指定する。 可能な値とその意味を以下に示す。
nil
t
visible
つぎの例では、2つのウィンドウがあり、 どちらもバッファ`windows.texi'を表示していると仮定する。
(selected-window) => # |
next-window
と同様に、 どのようなウィンドウを巡回に含めるかを指定する。nil
を返す。
対話的に呼び出すと、countは数値前置引数である。
省略可能な引数minibufとall-framesは、 走査するウィンドウの集まりを指定する。 詳しくは上記のnext-window
を参照。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] |
本節では、ウィンドウを調べたり、 正確に制御してウィンドウにバッファを表示する低レベルの関数について述べます。 使用するウィンドウを探したりそれにバッファを指定する関連する関数については、 See 節 27.7 ウィンドウへのバッファの表示。 そこに述べた関数は本節の関数より簡単に使えますが、 それらはウィンドウを選んだり作ったりするときに発見的手法を使います。 完全に制御する必要があるときには、本節の関数を使います。
nil
を返す。 これは、ウィンドウに表示するバッファを切り替える もっとも基本の基本関数であり、 他の切り替え関数はこの関数を呼び出す。
(set-window-buffer (selected-window) "foo") => nil |
(window-buffer) => # |
nil
を返す。 そのようなウィンドウが複数ある場合、 ウィンドウの巡回順序において選択されているウィンドウから始めて 最初にみつかったウィンドウを返す。 see 節 27.5 ウィンドウの巡回順序。
引数all-framesは、どのウィンドウを対象とするかを制御する。
nil
であると、選択されているフレームのウィンドウを対象とする。t
であると、すべてのフレームのウィンドウを対象とする。visible
であると、 すべての可視フレームのすべてのウィンドウを対象にする。省略可能な2つの引数は、next-window
(see 節 27.5 ウィンドウの巡回順序)の 省略可能な引数と同様に働き、 get-buffer-window
の省略可能な単一の引数と同じではない。 get-buffer-window
を他の関数と互換性があるように 将来変更すべきなのであろう。
引数all-framesは、どのウィンドウを対象とするかを制御する。
nil
であると、選択されているフレームのウィンドウを対象とする。t
であると、すべてのフレームのウィンドウを対象とする。visible
であると、 すべての可視フレームのすべてのウィンドウを対象にする。set-window-buffer
は、呼ばれるたびに 指定されたバッファのこの変数に(current-time)
を設定する (see 節 39.5 時刻)。 バッファが初めて作られると、buffer-display-time
は値nil
で始まる。[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] |
本節では、ウィンドウを自動的に選びそれに指定したバッファを表示する 便利な関数について述べます。 これらの関数は、ある状況では、既存のウィンドウを分割します。 ウィンドウを選ぶ際の発見的手法を制御する変数についても述べます。 より正確に制御するための低レベルの関数については、 See 節 27.6 バッファとウィンドウ。 これらの関数はすべてset-window-buffer
を呼び出して動作します。
バッファをカレントバッファにしてLispプログラムで参照したり変更できるように するためには、本節の関数を使わないでください。 これらはその目的には強力すぎます。 ウィンドウのバッファの表示をユーザーにとっては迷惑で驚くようなものに 変更してしまうからです。 そのかわりに、ウィンドウのバッファの表示には影響せずに バッファをプログラムから参照するためにカレントバッファにする set-buffer
とsave-current-buffer
(see 節 26.2 カレントバッファ (2003/10/30))を 使います。
set-buffer
と比較してほしい。 see 節 26.2 カレントバッファ (2003/10/30)。
buffer-or-nameが既存のバッファを指定しなければ、 その名前の新たなバッファが作成される。 新たなバッファのメジャーモードは変数default-major-mode
に 従って設定される。 see 節 22.1.3 メジャーモードの選択方法。
通常、指定したバッファはバッファリスト (選択されているフレームのバッファリストとフレーム独立のバッファリストの 両方)の先頭に置かれる。 これは、other-buffer
の動作に影響する。 しかし、norecordがnil
以外であると、これを行わない。 see 節 26.8 バッファリスト (2003/10/30)。
関数switch-to-buffer
は、しばしば、 C-x bにバインドされて対話的に使われる。 プログラムでも多用される。 つねにnil
を返す。
switch-to-buffer
と同じである。
現在選択されているウィンドウは、この処理には絶対に使わない。 それが唯一のウィンドウである場合には、この目的のために ウィンドウを分割して別のウィンドウを作る。 選択されているウィンドウがすでに当該バッファを表示している場合には、 当該ウィンドウはそのまま表示し続けるが、それにも関わらず、 表示するために別のウィンドウを探す。
この関数は、norecordがnil
であると、 switch-to-buffer
のようにバッファリストを更新する。
変数pop-up-frames
がnil
以外であると、 pop-to-buffer
は、可視フレームから 当該バッファをすでに表示しているウィンドウを探す。 そのようなウィンドウがあれば、そのウィンドウを返すとともに、 そのウィンドウをそのフレームの選択されているウィンドウにする。 そのようなウィンドウがなければ、新たなフレームを作成し それにバッファを表示する。
pop-up-frames
がnil
であると、 pop-to-buffer
は選択されているフレーム内だけで処理を行う。 (選択されているフレームがミニバッファのみであるときには、 pop-to-buffer
は、ミニバッファのみでない もっとも最近に選択されたフレーム内で処理する。)
変数pop-up-windows
がnil
以外であると、 もとのウィンドウとは異なる新たなウィンドウを作成するために ウィンドウを分割することがある。 詳しくは、27.8 表示ウィンドウを選ぶを参照。
other-windowがnil
以外であると、 選択されているウィンドウにbuffer-or-nameがすでに表示されていても、 pop-to-buffer
は別のウィンドウを探したり作成する。 そのため、buffer-or-nameは2つのウィンドウに表示されることになる。 一方で、buffer-or-nameが選択されているウィンドウに すでに表示されていて、かつ、other-windowがnil
であると、 選択されているウィンドウはbuffer-or-nameの表示には十分であるとみなし、 なにも行わない。
display-buffer
に影響するすべての変数は、 pop-to-buffer
にも影響する。 see 節 27.8 表示ウィンドウを選ぶ。
buffer-or-nameが文字列であり既存のバッファを指定しない場合、 その名前のバッファを作成する。 新たなバッファのメジャーモードは変数default-major-mode
に 従って設定される。 see 節 22.1.3 メジャーモードの選択方法。
この関数は、norecordがnil
であると、 switch-to-buffer
のようにバッファリストを更新する。
other-buffer
で選ぶ。 この関数の普通の用途は、別のバッファがどれになるか気にしない場合である。 つまり、bufferが表示されていないことを保証したい場合である。
この関数はnil
を返す。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] |
本節では、バッファを表示するためのウィンドウを選ぶための基本的な機能、 display-buffer
について述べます。 上位レベルの関数やコマンドはすべてこのサブルーティンを使います。 ここでは、display-buffer
の使い方とカスタマイズ方法を説明します。
pop-to-buffer
のように、 buffer-or-nameをあるウィンドウに表示するが、 そのウィンドウを選択しないので当該バッファもカレントバッファにならない。 この関数は、選択されているウィンドウを変えない。
not-this-windowがnil
以外であると、 指定したバッファが選択されているウィンドウにすでに表示されていても、 別のウィンドウに当該バッファを表示することを意味する。 これにより、当該バッファが同時に2つのウィンドウに表示される。 さもなければ、buffer-or-nameがウィンドウにすでに表示されていると、 それで十分とみなしこの関数はなにもしない。
display-buffer
は、buffer-or-nameを表示するために 選んだウィンドウを返す。
引数frameがnil
以外であると、 バッファがすでに表示されているかどうかを検査するときに どのフレームを対象とするかを指定する。 それらのフレームのどれかのウィンドウに当該バッファがすでに表示されていると、 display-buffer
は単にそのウィンドウを返す。 frameの可能な値はつぎのとおりである。
nil
であると、選択されているフレームのウィンドウを対象とする。t
であると、すべてのフレームのウィンドウを対象とする。visible
であると、 すべての可視フレームのすべてのウィンドウを対象にする。display-buffer
がウィンドウを作成したり探す詳しい手順は、 以下に述べる変数に依存する。
display-buffer
が新たにウィンドウを作るかどうかを制御する。 nil
以外であり、かつ、ウィンドウがたった1つである場合、 そのウィンドウを分割する。 nil
であると、display-buffer
は 単一のウィンドウを分割せずにそれ全体を使う。display-buffer
がどの時点でウィンドウを分割するかを決定する。 display-buffer
は、最大ウィンドウの行数が この変数による指定行数より大きければ、最大ウィンドウをつねに分割する。 最大ウィンドウがこれだけ大きくない場合には、 それが唯一のウィンドウであり、かつ、pop-up-windows
がnil
以外 の場合にのみ最大ウィンドウを分割する。display-buffer
が新たなフレームを作るかどうかを制御する。 nil
以外であると、display-buffer
は、 すべての可視フレームから指定されたバッファをすでに表示している 既存のウィンドウを探す。 そのようなウィンドウがあれば、そのウィンドウを返す。 さもなければ、新たなフレームを作る。 変数pop-up-frames
がnil
以外であると、 変数pop-up-windows
とsplit-height-threshold
は影響しない。
pop-up-frames
がnil
であると、 display-buffer
はウィンドウを分割するか再利用する。
詳しくは、see 節 28. フレーム。
pop-up-frames
がnil
以外であるときに どのように新たなフレームを作るかを指定する。
その値は引数なしの関数であること。 display-buffer
が新たにフレームを作るとき、 フレームを返すこの関数を呼び出す。 この変数のデフォルト値は、 pop-up-frame-alist
のパラメータを使って新たなフレームを作る関数である。
display-buffer
が新たにフレームを作るときに 使用するフレームパラメータを指定する連想リストを保持する。 フレームパラメータに関して詳しくは、 see 節 28.3 フレームパラメータ。display-buffer
は当該バッファを特別に扱う。
デフォルトでは、特別に表示するとは、 専用のフレームにバッファを表示することである。
リストの要素が文字列でなくリストであると、 リストのCARがバッファ名であり、 リストの残りはフレームの作成方法を指定する。 それは、フレームパラメータを指定する連想リストであるか、 関数とそれに渡す引数である。 (関数の第1引数はつねに表示すべきバッファである。 そのあとにリスト内の引数が続く。)
display-buffer
は当該バッファを特別に扱う。
デフォルトでは、特別に表示するとは、 専用のフレームにバッファを表示することである。
リストの要素が文字列でなくリストであると、 リストのCARが正規表現であり、 リストの残りはフレームの作成方法を指定する。 上記のspecial-display-buffer-names
を参照。
この関数のデフォルト値はspecial-display-popup-frame
である。
この関数は、bufferを表示している既存のウィンドウのフレームで 当該バッファだけを表示しているかどうかに関わらず、 既存の当該ウィンドウを使う。 しかし、bufferを作るまえに読者の初期化ファイルで上記の変数に設定 しているときには、当該ウィンドウは以前にこの関数が作成したものであろう。
special-display-popup-frame
がフレームを作るときに 使用するフレームパラメータを保持する。display-buffer
は選択されているウィンドウで当該バッファに切り替える。display-buffer
は選択されているウィンドウで当該バッファに切り替える。display-buffer
のふるまいをカスタマイズする もっとも柔軟な方法である。 nil
以外であると、display-buffer
が処理を依頼するために 呼び出す関数であること。 その関数は、display-buffer
が受け取るのと同じ2つの引数を受け付けること。 その関数は、ウィンドウを選ぶか作成し、指定されたバッファを表示し、 当該ウィンドウを返すこと。
このフックは、上に述べた他のオプションやフックすべてに優先する。
ウィンドウにはそのバッファ『専用』と印を付けられます。 そうすると、display-buffer
は他のバッファを表示するために 当該ウィンドウを使わないようにします。
t
を返し、 さもなければnil
を返す。nil
以外であるとwindowに専用の印を付け、 さもなければ専用の印を消す。[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] |
各ウィンドウには、同じバッファを表示している 別のウィンドウのポイントの値とは独立な独自のポイントの値があります。 これにより、あるバッファを複数のウィンドウに表示しても有用なのです。
ユーザーにとっては、ポイントとはカーソルが置かれた箇所であり、 別のバッファに切り替えるとそのバッファのポイント位置に カーソルが移動します。
windowが選択されているウィンドウであり、かつ、 そのバッファがカレントバッファであれば、 戻り値は当該バッファのポイントと同じである。
厳密にいえば、すべてのフォームsave-excursion
の外側での 『トップレベル』のポイントの値を返すほうがより正確である。 しかし、そのような値を探すのは困難である。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] |
各ウィンドウには、バッファのどの箇所から表示を始めるかを指定する バッファ内位置を追跡するために使うマーカがあります。 この位置をウィンドウの表示開始(display-start)位置 (あるいは単に開始(start)位置)と呼びます。 この位置の直後にある文字が、ウィンドウの左上隅に現れます。 この位置は、通常、テキスト行の先頭にありますが、必須ではありません。
nil
であると、 選択されているウィンドウを使う。 たとえばつぎのとおりである。
(window-start) => 7058 |
新たにウィンドウを作成したり異なるバッファをウィンドウに表示すると、 表示開始位置は、当該バッファの最近に使われた表示開始位置になるか、 バッファに表示開始位置がなければ1になる。
再表示するとウィンドウ開始位置は (それ以前の再表示で明示的に位置を指定していなければ)、 ポイントがスクリーンに現れるように更新される。 再表示以外には、ウィンドウ開始位置を自動的に変更しない。 ポイントを移動しても、つぎの再表示までは、 連動してウィンドウ開始位置が変更されると期待しないこと。
window-start
を使った実際的な例は、 29.2.4 テキスト行単位の移動のcount-lines
の記述を参照。
nil
であると、選択されているウィンドウを使う。
バッファのテキストを変更したりポイントを移動しただけでは、 window-end
が返す値は更新されない。 この値は、Emacsが再表示を実行し途中で止めることなく 最後まで終了した場合にのみ更新される。
windowの最後の再表示が途中で止められて完了していないと、 当該ウィンドウの表示の末尾の位置はEmacsにはわからない。
updateがnil
以外であると、 window-end
はウィンドウの末尾の更新値をつねに返す。 保存しておいた値が正しければwindow-end
はそれを返す。 さもなければ、バッファのテキストを走査して正しい値を計算する。
表示ルーティンは、バッファを表示するときには ポイント位置が可視であることを強要する。 通常、表示ルーティンは、ポイントを可視にするために必要なときには 表示開始位置を(つまりウィンドウをスクロールして)変更する。 しかし、noforceにnil
を指定してこの関数で開始位置を指定すると、 ポイント位置がスクリーンからはみ出したとしても、 表示開始位置をpositionとすることを意味する。 ポイントがスクリーンからはみ出す場合には、 表示ルーティンはウィンドウの中央行の左端にポイントを移動する。
たとえば、ポイントが1にあるときに ウィンドウの開始位置を2にしたとすると、 ポイントはウィンドウの上端より『上』になる。 表示ルーティンは、再表示時にポイントが1のままであると 自動的にポイントを移動する。 以下に例を示す。
;; 式 |
noforceがnil
以外であって positionにするとつぎの再表示時にポイントがスクリーンからはみ出す 場合には、再表示ではポイントが収まるように新たなウィンドウ開始位置を 計算し、positionを使わない。
t
を返す。 positionがスクリーンの上下端からはみ出す場合にはnil
を返す。 引数positionのデフォルトはポイントの現在位置であり、 windowのデフォルトは選択されているウィンドウである。 例を示す。
(or (pos-visible-in-window-p (point) (selected-window)) (recenter 0)) |
関数pos-visible-in-window-p
は、垂直方向のスクロールだけを考慮する。 windowを水平方向にスクロールしたために positionがはみ出している場合には、 pos-visible-in-window-p
はt
を返す。 see 節 27.12 水平スクロール。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] |
垂直スクロールとは、ウィンドウ内のテキストを上向きや下向きに動かすことです。 ウィンドウの表示開始位置の値を変更することで動作します。 ポイントがスクリーン内に留まるようにwindow-point
の 値を変更することもあります。
コマンドscroll-up
やscroll-down
の 方向を示す『up』(上向き)と『down』(下向き)は、 ウィンドウを見ているときのバッファ内のテキストの移動方向を表します。 テキストは縦に長い紙に(横書きで)書いてあり、 スクロールコマンドはその紙を上下に動かすと想像してください。 したがって、バッファの中ほどのテキストを見ているときに scroll-down
を繰り返し呼び出すと、 最終的にはバッファの先頭を見ることになります。
逆の慣習の名前を使うべきだと主張する人々もいます。 彼らは、固定されたテキストのうえをウィンドウが動いていると想像するのです。 すると、『下向き』のコマンドはバッファの末尾に移動することになります。 この見方は、ウィンドウとバッファ内のテキストとの実際の関係に よく適合しているのですが、ユーザーはそのように考えないようです。 端末上ではウィンドウは動きませんし、スクロールコマンドは 明らかにテキストをスクリーン上で上下に動かしています。 ユーザーの視点に合う名称を選んだのです。
カレントバッファと選択されているウィンドウに 表示されているバッファとが異なる場合には、 (scroll-other-window
以外の)スクロール関数の結果は予測できません。 See 節 26.2 カレントバッファ (2003/10/30)。
countがnil
(あるいは省略)であると、 スクロール量は、ウィンドウの(モード行を数えない)利用可能な高さより next-screen-context-lines
だけ少なくなる。
scroll-up
はnil
を返す。
countがnil
(あるいは省略)であると、 スクロール量は、ウィンドウの(モード行を数えない)利用可能な高さより next-screen-context-lines
だけ少なくなる。
scroll-down
はnil
を返す。
nil
であると、 scroll-up
と同様に扱う。
変数other-window-scroll-buffer
で、スクロールするバッファを指定できる。 選択されているウィンドウがミニバッファ用であるときには、 つぎのウィンドウは、通常、もっとも左上隅にあるウィンドウである。 変数minibuffer-scroll-window
で、 スクロールする別のウィンドウを指定できる。 別のウィンドウが選択されている場合には、この変数の効果はない。 see 節 19.9 ミニバッファに関するその他。
ミニバッファが活性であると、 右下隅のウィンドウが選択されているウィンドウであるときには、 つぎのウィンドウはミニバッファ用ウィンドウである。 この場合、scroll-other-window
はミニバッファをスクロールしようとする。 ミニバッファにたった1行しか入っていなければスクロールできず、 エコー領域に『Beginning of buffer』と短時間表示されたあとで、 ミニバッファの行が再度現れる。
nil
以外であると、 scroll-other-window
がスクロールするバッファを指定する。scroll-conservatively
の古い変種である。 違いは、値がnであると正確にn行だけのスクロールを許すことである。 この機能はscroll-margin
では働かない。 デフォルト値は0である。nil
以外であると、 スクロール関数は、可能ならばカーソルの垂直方向の位置を 変えないようにポイントを移動する。nil
のscroll-up
は、 ウィンドウの下端にあるこの行数だけの行が上端にくるようにスクロールする。 デフォルト値は2
である。countが非負の数であると、ポイント位置にある行を ウィンドウの上端からcount行下にくるようにする。 countが負の数であると、ウィンドウの下端から数え、 -1はウィンドウの使用可能な最後の行を表す。 countがnil
以外のリストであると、 ウィンドウの中央の行を表す。
countがnil
であると、recenter
は、 ポイント位置にある行がウィンドウの中央にくるようにして、 選択されているフレーム全体をクリアして再表示する。
recenter
が対話的に呼び出されると、countは生の前置引数である。 したがって、前置引数としてC-uと打つと countはnil
以外のリストになり、 C-u 4と打つとcountは4になって上端から4行目に現在行がくる。
引数が0であると、 recenter
はウィンドウの上端に現在行がくるようにする。 この動作は、このための専用のキーバインディングをする人がいるくらい便利である。 たとえばつぎのようにする。
(defun line-to-top-of-window () "Scroll current line to top of window. Replaces three keystroke sequence C-u 0 C-l." (interactive) (recenter 0)) (global-set-key [kp-multiply] 'line-to-top-of-window) |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] |
英文は『内側のループ』では左から右へ『外側のループ』では上から下へと読むので、 水平スクロールは垂直スクロールには似ていません。 垂直スクロールでは表示するテキストの連続部分を選びますが、 水平スクロールでは各行の一部がスクリーンからはみ出すことになります。 そのため、水平スクロールの量は、バッファ内の位置ではなく、 コラム数で指定します。 これは、window-start
が返す表示開始位置とはなんの関係もありません。
通常、水平スクロールは行われません。 つまり、左端のコラムはウィンドウの左端にあります。 この状態で右向きにスクロールしても、 それによって見えてくるスクリーンの左側にはなにもないので意味がありません。 ですから、これは禁止されます。 左向きへのスクロールは許されて、 テキストの先頭コラムはウィンドウの端からはみ出し、 それまで切り詰められていた右側のコラムが見えるようになります。 左向きの水平スクロール量が0でなければ、 右向きへスクロールして戻せますが、 これは全体としての水平スクロール量が0になるまでです。 左向きスクロールの限界はありませんが、 最終的にはテキストすべてが左端からはみ出してしまいます。
window-hscroll
(下記参照)が返す値と同じである。window-hscroll
(下記参照)が返す値と同じである。
可能なだけウィンドウを右向きにスクロールしてしまうと、 通常の状態、つまり、左向き水平スクロール量が0になり、 それ以降、右向きスクロールは効果がなくなる。
値はけっして負にはならない。 windowが水平方向にスクロールされていなければ (これが通常の状態)0である。
windowがnil
であると、選択されているウィンドウを使う。
(window-hscroll) => 0 (scroll-left 5) => 5 (window-hscroll) => 5 |
戻り値はcolumnsである。
(set-window-hscroll (selected-window) 10) => 10 |
水平スクロールのために指定位置positionが スクリーンからはみ出しているかどうかを調べる方法をつぎに示します。
(defun hscroll-on-screen (window position) (save-excursion (goto-char position) (and (>= (- (current-column) (window-hscroll window)) 0) (< (- (current-column) (window-hscroll window)) (window-width window))))) |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] |
Emacsのウィンドウは矩形であり、そのサイズ情報は 高さ(行数)と幅(各行の文字数)から成ります。 モード行は高さに含みます。 しかし、スクロールバーや左右のウィンドウを隔てる文字`|'のコラムは 幅には含みません。
つぎの3つの関数は、ウィンドウのサイズ情報を返します。
frame-height
の値より1小さい (最後の行はミニバッファ用につねに確保してあるため)。
windowがnil
であると、この関数は選択されているウィンドウを使う。
(window-height) => 23 (split-window-vertically) => # |
frame-width
の値と同じである。 この幅には、ウィンドウのスクロールバーや 左右のウィンドウを隔てる文字`|'のコラムは含まない。
windowがnil
であると、この関数は選択されているウィンドウを使う。
(window-width) => 80 |
nil
であると、選択されているウィンドウを使う。
list内の順番は(left top right bottom)
(つまり、左端、上端、右端、下端)であり、 フレームの左上隅を0としてすべての要素は0を基準とする。 要素rightはwindowが使用する右端のコラムより1大きく、 bottomはwindowが使用する下端より1大きく モード行と同じである。
左右に隣り合ったウィンドウがある場合、 右隣にウィンドウがあるウィンドウの右端の値には、 ウィンドウを隔てる区切りの幅が含まれる。 この区切りは、文字`|'のコラムであるかスクロールバーである。 ウィンドウの幅にはこの区切りは含まないため、 この場合、左端と右端の差は幅に等しくない。
典型的な24行の端末でウィンドウが1つの場合に得られる結果を示す。
(window-edges (selected-window)) => (0 0 80 23) |
下端が23行目であるのは、最下行はエコー領域だからである。
windowがフレームの左上隅にあると、 bottomは(window-height)
の値に等しく、 rightは(window-width)
の値にほぼ等しく (9)、 topとleftは0である。 たとえば、つぎのウィンドウは`0 0 5 8'である。 当該フレームには8コラムより多くあり、 ウィンドウの最終コラム(7コラム目)はテキストではなく境界であると仮定する。 最後の行(4行目)はモード行であり、ここでは`xxxxxxxxx'で示した。
0 _______ 0 | | | | | | | | xxxxxxxxx 4 7 |
左右に隣り合ったウィンドウがあるときには、 フレームの右端にないウィンドウの最後のコラムは区切りである。 区切りは、ウィンドウの幅では1コラムか2コラム占める。 左側の区切りは左隣のウィンドウに属するので、 ウィンドウには左側の区切りは含まれない。
つぎの例では、フレームは7コラム幅であるとする。 すると、左側のウィンドウの四隅は`0 0 4 3'であり、 右側のウィンドウの四隅は`4 0 7 3'である。
___ ___ | | | | | | xxxxxxxxx 0 34 7 |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] |
ウィンドウサイズ関数は2つに大別できます。 ウィンドウサイズを変える上位レベルのコマンドと ウィンドウサイズを調べる下位レベルの関数です。 Emacsでは重なり合ったウィンドウやウィンドウのあいだに隙間を許さないので、 1つのウィンドウの大きさを変えると別のウィンドウにも影響します。
window-min-height
行未満になると、 そのウィンドウは消える。
horizontalがnil
以外であると、 この関数は、隣り合うウィンドウから場所を奪って、 選択されているウィンドウをsizeコラム広くする。 場所を奪われたウィンドウがwindow-min-width
コラム未満になると、 そのウィンドウは消える。
指定した大きさがウィンドウのフレームの大きさを超える場合、 この関数は、ウィンドウがフレームの高さ(あるいは幅)全体を占めるようにする。
sizeが負であると、この関数は-size行/コラムだけ ウィンドウを縮める。 ウィンドウが(window-min-height
とwindow-min-width
の) 最小サイズより小さくなると、enlarge-window
は 当該ウィンドウを削除する。
enlarge-window
はnil
を返す。
(defun enlarge-window-horizontally (columns) (enlarge-window columns t)) |
enlarge-window
に似ているが引数sizeの符号を変えて、 選択されているウィンドウを縮めて指定行数(コラム数)を 他のウィンドウに与える。 ウィンドウがwindow-min-height
やwindow-min-width
未満に縮むと、 そのウィンドウは消える。
sizeが負であると、ウィンドウは -size行/コラムだけ伸びる。
(defun shrink-window-horizontally (columns) (shrink-window columns t)) |
window-min-height
行未満にはしない。
しかし、バッファの全テキストを表示するにはウィンドウが小さすぎる場合や、 内容の一部がスクロールでスクリーンからはみ出している場合や、 ウィンドウの幅がフレームの幅と同じでない場合や、 ウィンドウがフレームの唯一のウィンドウである場合には、 このコマンドはなにもしない。
つぎの2つの変数は、ウィンドウサイズを変える関数に最小の高さと幅を課します。
window-min-height
行未満に小さくすると自動的に削除され、 これより短いウィンドウは作成できない。 絶対的な最小の高さは2行(モード行に1行、バッファの表示に1行)である。 ウィンドウサイズを変える処理では、この変数が2未満であると2に設定し直す。 デフォルト値は4である。window-min-width
コラム未満に小さくすると自動的に削除され、 これより狭いウィンドウは作成できない。 絶対的な最小の幅は1であり、それ未満は無視する。 デフォルト値は10である。[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] |
本節では、スクリーン座標をウィンドウに関連付ける方法を述べます。
window-at
はnil
を返す。
frameを省略すると、選択されているフレームを使う。
引数coordinatesは、(x . y)
の形のコンスセルである。 座標xとyは、スクリーンやフレームの左上隅から文字単位で数える。
coordinates-in-window-p
が返す値がnil
以外であると、 当該座標はwindowの内側にある。 つぎのように、この値はウィンドウ内での位置も表す。
(relx . rely)
mode-line
vertical-split
nil
関数coordinates-in-window-p
は、 windowのフレームをつねに使うため、引数にフレームを必要としない。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] |
ウィンドウ構成(window configuration)は、 1つのフレームの全体の配置、つまり、 すべてのウィンドウ、それらの大きさ、表示しているバッファ、 各バッファの表示位置、ポイントとマークの値を記録します。 保存しておいたウィンドウ構成を復元すれば、 まえとまったく同じ配置に戻せます。
1つのフレームではなくすべてのフレームを記録するには、 ウィンドウ構成のかわりにフレーム構成を使います。 See 節 28.12 フレーム構成。
window-min-height
、window-min-width
、 minibuffer-scroll-window
の値も含む。 例外はカレントバッファのポイントであり、その値は保存されない。current-window-configuration
が返した値であること。 configurationを作成したフレームにおいて、 そのフレームが選択されているかどうかに関わらず、この構成を復元する。 set-window-configuration
は、新たな構成が古いものと 実際に異なるのかどうか識別する方法を知らないため、 ウィンドウサイズの変更とつねにみなして window-size-change-functions
(see 節 27.17 ウィンドウのスクロールとサイズ変更向けのフック)の 実行を引き起こす。
configurationを保存したフレームがなくなっていると、 この関数は、3つの変数、window-min-height
、 window-min-width
、minibuffer-scroll-window
を 復元するだけである。
save-window-excursion
と同じ効果を得るための この関数の使い方をつぎに示す。
(let ((config (current-window-configuration))) (unwind-protect (progn (split-window-vertically nil) ...) (set-window-configuration config))) |
save-excursion
も使う。
save-selected-window
で十分なときには、この構文を使わないこと。
save-window-excursion
から抜けると、 window-size-change-functions
の実行をつねに引き起こす。 (復元した構成とformsの終りでの構成が実際に異なるかどうかを 識別する方法を知らない。)
戻り値は、formsの最後のフォームの値である。 例を示す。
(split-window) => # |
t
を返す。t
を返す。
関数equal
でも2つのウィンドウ構成を比較できるが、 保存されたポイントやマークが違うだけであっても異なる部分があると、 等しくない構成とみなす。
ウィンドウ構成の内部を調べる基本関数には意味があるでしょうが、 実装してありません。 実装するだけの価値があるほど有用なのかはっきりしないのです。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] |
本節では、ウィンドウにバッファの別の部分を表示したり 別のバッファを表示するたびに、 Lispプログラムが動作する方法を述べます。 変更できる動作は3種類、ウィンドウをスクロールするとき、 ウィンドウでバッファを切り替えるとき、 ウィンドウサイズを変えるときです。 最初の2つの動作ではwindow-scroll-functions
を実行し、 3つ目はwindow-size-change-functions
を実行します。 これらのフックの模範的な使用例は遅延ロック(lazy-lock)モードの 実装の中にあります。 GNU Emacs マニュアルを参照してください。
ウィンドウに別のバッファを表示する場合でも これらの関数が実行される。
これらの関数でwindow-end
(see 節 27.10 ウィンドウの開始位置)を使うには 注意が必要である。 更新された値が必要なときには、確実に更新値を得るために 引数updateを使う必要がある。
各関数はフレームを唯一の引数として受け取る。 当該フレームで大きさが変更されたウィンドウを探す直接的な方法や 正確な方法はない。 しかし、サイズ変更関数が呼ばれるたびに 既存のウィンドウとそれらの大きさを記録すれば、 現在の大きさと以前の大きさを比較できる。
ウィンドウを作成したり削除してもサイズ変更とみなすので、 これらの関数が呼び出される。 フレームの大きさが変わると既存のウィンドウの大きさも変わるので、 これもサイズ変更とみなす。
これらの関数でsave-window-excursion
(see 節 27.16 ウィンドウ構成)を使うのはよくない。 この関数はつねにサイズ変更とみなしこれらの関数を呼び出し、 これが繰り返されてしまうからである。 多くの場合、ここで必要なのはsave-selected-window
(see 節 27.4 ウィンドウの選択)である。
set-window-redisplay-end-trigger
で設定する。 フック関数は2つの引数、ウィンドウと終了トリガ位置で呼ばれる。 終了トリガ位置としてnil
を保存するとこの機能をオフにし、 フックを実行直後にトリガ値は自動的にnil
に再設定される。[ << ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] |