検索エンジンから来た人に注意このマニュアルは、Emacs ver. 19.x 向けのマニュアルを Mule 2.x の開発にあたり邦訳したものを、 電脳外道学会がミラーリングしているものであり、旧版製品パラノイアであるところの椅子人の趣味によるものです。しかしながら、現在の Emacs の主流は ver. 20 以降であり、ver 19.x と ver 20.x とでは、仕様の違いが少なからずあります。 したがって、一般的な Emacs ユーザーにとっては、
このマニュアルと実機の動作とが符合しない場合があります。
|
この章では、Emacsのウィンドウに関連する、関数と変数のほぼすべてについて 述べます。ウィンドウ内でのテキスト表示のされ方については、section Emacsの表示 を参照してください。
Emacsにおけるウィンドウ(window)とは、バッファが表示される、画面上 の物理的な領域です。この用語はまた、Emacs Lispにおいて、画面領域を表現す るLispオブジェクトを参照するためにも使用されます。どちらを意味しているの かは前後関係により明らかなはずです。
Emacsは、ウィンドウをフレームへとグループ分けします。フレームは、Emacsが 使用可能な画面の領域を表現します。各フレームは、常に少なくとも一つのウィ ンドウを含みますが、それらをさらに複数のオーバーラップしないEmacsウィン ドウへと垂直、あるいは水平に分割することができます。
各フレームにおいては、常に唯一一つのウィンドウが、そのフレーム内で
選択された(selected within the frame)ものとして指示されています。そのウィ
ンドウ内にフレームのカーソルが現われます。常に一つのフレームが選択された
フレームであり、そのフレーム内で選択されているウィンドウが選択され
たウィンドウ(selected window)です。通常、選択されたウィンドウのバッファ
がカレント・バッファです(set-buffer
の使用中を除く)。See section カレント・バッファ。
実際上、ウィンドウは、フレーム内に表示されている間のみ存在します。いった んフレームから取り除かれると、たとえまだ他のLispオブジェクトから参 照されていても、そのウィンドウは事実上消去され、使われなくなります。保 存されたウィンドウ構成を復元することが、もはや画面上にないウィンドウを復 活させるための唯一の方法です(See section ウィンドウの消去)。
各ウィンドウは、以下の属性をもっています:
ユーザは、複数のウィンドウを生成することにより、同時にいくつかのバッファ を見ることができます。Lispライブラリはさまざまな目的で複数のウィンドウを 使用しますが、その最も多くは、互いに関係のある情報を表示するためです。た とえばRmailでは、片方のウィンドウ内のサマリ・バッファを動き回ることがで き、それと同時にもう一方のウィンドウが、一度に一つのメッセージを、それが 選択されるにしたがって表示します。
Emacsにおける"ウィンドウ"の意味は、Xのような汎用ウィンドウ・システムに おける意味と似ていますが、同一ではありません。Xウィンドウ・システムは、 画面上にXウィンドウ群を配置します。そしてEmacsは、一つ以上のXウィンドウ をフレームとして使用するのです。Emacsをキャラクタ端末で使用するとき、 Emacsは端末画面全体を一つのフレームとして扱います。
たいていのウィンドウ・システムは、任意に配置可能なオーバーラッピング・ウ インドウをサポートしています。対照的に、Emacsのウィンドウ群はタイル 張り(tile)されます。それらは決してオーバーラップせず、それら全部で画面 またはフレーム全体を満たします。Emacsが新しいウィンドウを生成したりリサ イズするための方法により、Emacsのフレーム上に、考えられるかぎりの数のウィ ンドウのタイルを配置することはできません。section ウィンドウの分割と See section ウィンドウのサイズ。
ウィンドウのバッファの内容が、どのようにそのウィンドウ内に表示されるのか については、See section Emacsの表示。
t
を返します。
以下で述べられている関数は、一つのウィンドウを二つに分割するために使用さ
れるプリミティブです。このうち二つの高水準関数、pop-to-buffer
と
display-buffer
は、ウィンドウを分割しないこともあります
(see section ウィンドウ内でのバッファの表示)。
以下で述べられている関数は、引数としてバッファを受け付けません。二つに分 割された"半分ずつ"のウィンドウは、最初、分割されたもとのウィンドウが表 示していたのと同じバッファを表示します。
horizontalが非nil
の場合、windowは、二つの横並びのウィ
ンドウへと分割されます。もとのウィンドウwindowは、その左端
size桁を維持し、残りの桁を新しいウィンドウに譲ります。
horizontalがnil
の場合、windowは上下に分割され、その上
部size行分を維持して残りの行を新しいウィンドウに譲ります。したがっ
て、もとのウィンドウは二つのうちの左側あるいは上に、新しいウィンドウは右
側あるいは下となります。
windowが省略されるかnil
の場合、選択されたウィンドウが分割さ
れます。sizeが省略されるかnil
の場合、windowは均等に二
つの部分に分割されます(もし端数の行があれば、それは新しいウィンドウに割
り当てられます)。split-window
が対話的に呼び出されたとき、すべての
引数はnil
となります。
以下の例では、高さ50行、幅80桁の画面上唯一のウィンドウから始めて、そのウィ ンドウを分割しています。
(setq w (selected-window)) => #<window 8 on windows.texi> (window-edges) ; 角(以下の順): => (0 0 80 50) ; 左--上--右--下 ;; 生成されたウィンドウを返す (setq w2 (split-window w 15)) => #<window 28 on windows.texi> (window-edges w2) => (0 15 80 50) ; 下のウィンドウ; ; 上端が15行目 (window-edges w) => (0 0 80 15) ; 上のウィンドウ
画面は以下のようになっています:
__________ | | 0行目 | w | |__________| | | 15行目 | w2 | |__________| 50行目 0桁目 80桁目
次に、上のウィンドウを水平に分割します:
(setq w3 (split-window w 35 t)) => #<window 32 on windows.texi> (window-edges w3) => (35 0 80 15) ; 左の角が35桁目に (window-edges w) => (0 0 35 15) ; 右の角が35桁目に (window-edges w2) => (0 15 80 50) ; 下のウィンドウは変化なし
ここで、画面は以下のようになっています:
35桁目 __________ | | | 0行目 | w | w3 | |___|______| | | 15行目 | w2 | |__________| 50行目 0桁目 80桁目
普通、Emacsは、二つの横並びのウィンドウの間にスクロール・バー(see section Xウインドウ・フレーム・パラメータ)か`|'文字を表示します。表示テーブルを 使えば、代わりのボーダー文字を指定することができます。section 表示テーブル参照。
この関数は、単にsplit-window
へのインタフェースとなっています。以
下に、その完全な関数定義を示します:
(defun split-window-vertically (&optional arg) "Split current window into two windows, one above the other." (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
なら、たとえミニバッファがアクティ
ブでもそれを数えないことを意味し、nil
ならアクティブなミニバッファ・
ウィンドウをウィンドウ数の合計に含めます。その合計が1と比較されます。
引数all-framesは、どのフレームについて考えるのかを指定します。以下 に、取り得る値とそれらの意味を示します:
nil
t
visible
ウィンドウは、ウィンドウを消去(delete)するための関数を呼び出して消 去しないかぎり、そのフレーム上で可視であり続けます。消去されたウィンドウ は画面上に現われることはできませんが、Lispオブジェクトとしては、それへの 参照がなくなるまで存在し続けます。保存したウィンドウ構成の復元以外に、ウィ ンドウの消去を取り消すための方法はありません(see section ウィンドウ構成)。ウィンドウ構成の復元はまた、その構成に含まれないウィン ドウをみんな消去してしまいます。
ウィンドウを消去するとき、それによって取り上げられる場所は、隣接する一個 の同胞ウィンドウ(sibling)に与えられます(Emacsバージョン18では、その場所 は、隣接するすべての同胞ウィンドウに均等に配分されていました)。
nil
を返し、そうでな
ければt
を返します。
警告!: 消去されたウィンドウをまだ生きているかのように使用した場 合、結果として誤った情報、あるいは致命的エラーが生じます。
delete-window
が呼び出さ
れたとき、ウィンドウが一つしか存在しなければエラーが通知されます。
この関数はnil
を返します。
delete-window
が対話的に呼び出されたとき、windowは選択された
ウィンドウをデフォルトとします。
nil
の場合、選択されたウィンドウがデフォルトとして使用されます。
この関数はnil
を返します。
delete-windows-on
は、フレーム単位で作用します。フレーム内に異なる
バッファを表示しているウィンドウがいくつかある場合、そのうちbuffer
を表示しているものが取り除かれ、その余白を満たすために他のウィンドウが広
がります。フレーム内のすべてのウィンドウがbufferを表示している場合
(ウィンドウが一つしか存在しない場合を含む)、そのフレームは、
other-buffer
で選択された別のバッファを表示する一個のウィンドウを
保持するようになります。See section バッファ・リスト。
引数frameは、どのフレームに作用するのかを制御します:
nil
の場合、選択されたフレームに作用します。
t
の場合、すべてのフレームに作用します。
visible
の場合、すべての可視フレームに作用します。
この関数は、常にnil
を返します。
ウィンドウが選択されたとき、そのウィンドウ内のバッファがカレント・バッファ となり、その中にカーソルが現われます。
戻り値はwindowです。
(setq w (next-window)) (select-window w) => #<window 65 on windows.texi>
以下の関数は、種々の選択基準をもとにして画面上のウィンドウの一つを選択し ます。
選択されたウィンドウが唯一のウィンドウである場合、それは最も昔に使用され たウィンドウにもなります。新たに生成されるウィンドウは、それが選択される まで、最も昔に使用されたウィンドウとなります。ミニバッファ・ウィンドウは 決してその候補にはなりません。
引数frameは、どのウィンドウ群について考えるのかを制御します。
nil
の場合、選択されたフレーム上のウィンドウについて考えます。
t
の場合、すべてのフレーム上のウィンドウについて考えます。
visible
の場合、すべての可視フレーム上のウィンドウについて考えます。
同じサイズのウィンドウが二つある場合、この関数は、選択されたウィンドウを 起点としてウィンドウの循環順序(次節を参照)をたどり、先に出てきたウィンド ウを返します。
引数frameは、どのウィンドウ集合について考えるのかを制御します。上
述のget-lru-window
参照。
次のウィンドウを選択するために、コマンドC-x o
(other-window
)を使用するとき、(訳注: 選択されるウィンドウは)画面
上のすべてのウィンドウを通じて一定の循環順序で移動します。与えられたどん
なウィンドウ構成に対しても、この順序は決して変わりません。これは、
ウィンドウの循環順序(cyclic ordering of windows)と呼ばれます。
一般に、この順序は上から下へ、また左から右へ進みます。ですがウィンドウが 分割された順序によっては、先に下へ、あるいは先に右へ進むかもしれません。
もし最初の分割が垂直(上下のウィンドウ)であり、その後それら子ウィンドウが 水平に分割されていたなら、その順序はフレームの上部において左から右、次に フレームの下部において左から右、というふうになります。もし最初の分割が水 平だったなら、その順序はまず左側において上から下、というふうになります。 一般にウインドウ・ツリー内のどの階層においても、各同胞ウィンドウ間では、 その順序は左から右、あるいは上から下となります。
引数minibufの値は、ウィンドウ順序にミニバッファを含めるか否かを決
定します。minibufがnil
の場合、もしミニバッファが現在アクティ
ブならばウィンドウ順序に含めます。これは、C-x oの挙動です(ミニバッ
ファの使用中、ミニバッファ・ウィンドウがアクティブとなります。
See section ミニバッファ)。
minibufがt
の場合、たとえアクティブでなくてもミニバッファ・
ウィンドウを循環順序に含めます。
minibufがt
でもnil
でもない場合、たとえアクティブでも
ミニバッファ・ウィンドウを循環順序に含めません。
引数all-framesは、どのフレームについて考えるのかを指定します。以下 に、取り得る値とそれらの意味を示します:
nil
t
visible
以下の例は、二つのウィンドウがあり、両方ともバッファ`windows.texi' を表示しているものと仮定しています:
(selected-window) => #<window 56 on windows.texi> (next-window (selected-window)) => #<window 52 on windows.texi> (next-window (next-window (selected-window))) => #<window 56 on windows.texi>
next-window
と同様に、どのウィンドウを
循環順序に含めるのかを指定するものです。
nil
を返します。
対話的な呼出しにおいては、countは、数値前置引数となります。
proc
を呼び出しながら、すべてのウィンドウを一周します。
オプション引数minibufとall-framesは、そのスキャンの対象に含
めるウィンドウ集合を指定します。詳細については、上述のnext-window
を参照。
この節では、ウィンドウを調べたり、厳密な制御のもとでウィンドウにバッファ を表示したりする低水準関数について述べます。 使用するウィンドウを(訳注: 自動的に)見つけ、指定したバッファの表示にそれ を使用する関数については、 次節を参照してください。 そこで述べられている関数はこれらよりも簡単に使用できますが、ウィンドウの 選択と生成において、ヒューリスティクスに頼る部分があります。完璧な制御を 必要とする場合は、以下の関数を使用します。
nil
を返します。
(set-window-buffer (selected-window) "foo") => nil
(window-buffer) => #<buffer windows.texi>
nil
を返します。該当するウィンドウがいくつもある場合、
この関数は、選択されたウィンドウを起点としてウィンドウの循環順序をたどり、
先に出てきたウィンドウを返します。See section ウィンドウの循環順序。
引数all-framesは、どのウィンドウ群について考えるのかを制御します。
nil
の場合、選択されたフレーム上のウィンドウについて考えます。
t
の場合、すべてのフレーム上のウィンドウについて考えます。
visible
の場合、すべての可視フレーム上のウィンドウについて考えます。
この節では、ウィンドウを自動的に選択して、指定したバッファの表示にそれを 使用してくれる便利な関数について述べます。これらの関数は、特定の状況にお いて、既存のウィンドウを分割することがあります。ここではまた、ウィンドウ の選択に要するヒューリスティクスを特性づける変数についても述べます。 より厳密な制御を可能とする低水準関数については、 前節を参照してください。
あるバッファを、Lispプログラムがアクセスあるいは変更できるようするためだ
けにカレントにする場合は、この節の関数群を使用しないでください。これらは、
無条件にウィンドウ内のバッファの表示を変更してユーザを驚かしてしまうため、
その用途には強烈すぎるのです。代わりに、ウィンドウ内のバッファの表示に影
響を与えず、プログラムによるアクセスのためにバッファをカレントに指示でき
る、set-buffer
(see section カレント・バッファ)とsave-excursion
(see section 脱線)を使用してください。
set-buffer
と比べてみると、set-buffer
は
buffer-or-nameをカレント・バッファにはしますが、それを選択されたウィ
ンドウに表示しません。See section カレント・バッファ。
buffer-or-nameが既存のいずれのバッファにも一致しない場合、その名前
の新しいバッファが生成されます。新しいバッファの主モードは、変数
default-major-mode
にしたがって設定されます。See section 主モードの自動選択の仕組み。
指定されたバッファは、普通、バッファ・リストの先頭に置かれます。これは
other-buffer
の動作に影響します。ですがnorecordが非
nil
の場合は、そのかぎりではありません。See section バッファ・リスト。
switch-to-buffer
関数は、しばしばキー・バインドC-x bとして対
話的に使用されます。また、プログラム中でも頻繁に使用されます。常に
nil
を返します。
switch-to-buffer
と同じです。
現在選択されているウィンドウは、絶対にこの処理に使用されることはありませ ん。もしそれが唯一のウィンドウであれば、この処理用に別個のウィンドウを作 るために、そのウィンドウが分割されます。選択されたウィンドウがすでにその バッファを表示している場合、それはそのままですが、それでもなお、そのバッ ファを表示するための別のウィンドウがさらに獲得されます。
変数pop-up-frames
が非nil
の場合、pop-to-buffer
は、す
でにそのバッファを表示している可視フレーム内のウィンドウを探します。該当
するウィンドウがあればそれを返し、そのフレーム内での選択されたウィンドウ
とします。なければ新しいフレームを生成し、その中にbuffer-or-nameを
表示します。
pop-up-frames
がnil
の場合、pop-to-buffer
は、もっぱら
選択されたフレーム内で動作します(選択されたフレームがミニバッファのみを
保持している場合、pop-to-buffer
は、最も最近に選択されていた、ミニ
バッファだけではないフレーム内で動作します)。
変数pop-up-windows
が非nil
の場合、もとのウィンドウとは別の
新しいウィンドウを生成するために、ウィンドウが分割されることがあります。
詳細についてはsection 表示に用いるウィンドウの選択を参照してください。
other-windowが非nil
の場合、pop-to-buffer
は、たとえ選
択されたウィンドウですでにbuffer-or-nameが表示されていても、別のウィ
ンドウを探すか生成します。そのため結果として、buffer-or-nameが二つ
のウィンドウに表示されるかもしれません。一方、選択されたウィンドウですで
にbuffer-or-nameが表示されており、かつother-windowが
nil
の場合、buffer-or-nameの表示としては選択されたウィンドウ
で十分とみなされ、よって何もする必要がありません。
display-buffer
に影響するすべての変数は、同様に
pop-to-buffer
にも影響します。See section 表示に用いるウィンドウの選択。
buffer-or-nameが既存のバッファ名以外を示す文字列の場合、その名前の
バッファが生成されます。新しいバッファの主モードは、変数
default-major-mode
にしたがって設定されます。See section 主モードの自動選択の仕組み。
other-buffer
で選択
されるバッファです。この関数の通常の利用においては、別のバッファとしてど
れが使用されるのかを気にしないで、bufferがもはや表示されないことだ
けを期待してください。
この関数はnil
を返します。
この節では、バッファを表示するためにウィンドウを選択する、という基本的な
機能を、display-buffer
に関して述べます。すべての高水準関数とコマ
ンドはこのサブルーチンを使用します。以下に、display-buffer
の使用
法とカスタマイズ方法を述べます。
pop-to-buffer
のように、buffer-or-nameをいず
れかのウィンドウで見えるようにしますが、そのウィンドウを選択せず、またそ
のバッファをカレントにもしません。選択されたウィンドウの同一性(identity)
が、この関数によって変更されることはありません。
not-this-windowが非nil
の場合、それは、たとえ指定されたバッ
ファが選択されたウィンドウですでに表示されていても、それを別のウィンドウ
に表示することを意味します。このため、そのバッファが同時に二つのウィンド
ウで見えるようになることがあります。not-this-windowがnil
の
場合、buffer-or-nameがすでにいずれかのウィンドウで表示されていれば
それで十分であり、よってこの関数は何もしません。
display-buffer
は、buffer-or-nameの表示のために選択したウィ
ンドウを返します。
display-buffer
が、厳密にはどのようにウィンドウを探し生成するのか
は、以下に述べる変数に依存しています。
display-buffer
が新しいウィンドウを作るか否かを制御し
ます。これが非nil
で、かつウィンドウが一つしかない場合、そのウィン
ドウが分割されます。nil
の場合、display-buffer
は一つのウィ
ンドウを分割はしませんが、その全体を使用します。
display-buffer
がウィンドウを分割できるのかを決定します
(20)。
最大のウィンドウが少なくともこの行数分ある場合、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 section フレーム。
pop-up-frames
が非nil
の場合に、どうやって新し
いフレームを作るのかを指定します。
その値は、引数をもたない関数です。display-buffer
が新しいフレーム
を作るとき、一個のフレームを返すこの関数を呼び出すことによって、その処理
を行ないます。この変数のデフォルト値は、pop-up-frame-alist
内のパ
ラメータを用いてフレームを生成する関数です。
display-buffer
が新しいフレームを作る際に使用する、フ
レーム・パラメータを指定したalistを保持します。フレーム・パラメータに関
するより多くの情報については、See section フレーム・パラメータ。
display-buffer
は、そのバッファを特別に扱い
ます。
デフォルトでは、特別な表示とは、そのバッファに専用のフレームを与えること を意味します。
もし、その要素が文字列でなくリストなら、そのリストのCARはバッファ名 で、残りはそのフレームをどうやって生成するのかを表わします。リストの残り としては二通りの可能性があります。それは、フレーム・パラメータを指定する alistでもあり得るし、あるいは関数とそれに与える引数(21)を含むこともできます(その関数 の第一引数は表示対象のバッファです。第二引数以下に、このリストで与える引 数がきます)。
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
と同じ二つの
引数を受け付けるものです。そして、ウィンドウを選択あるいは生成して指定さ
れたバッファを表示し、そのウィンドウを返します。
このフックは、前述した他のオプションやフックすべてに優先します。
ウィンドウは、そのバッファ"専用"としてマークづけされ得ます。そうすると
display-buffer
は、そのウィンドウの使用を試みるのをやめます。
t
を返し、そ
うでなければnil
を返します。
nil
であればwindowを専用としてマー
クし、そうでなければ非専用とします。
各ウィンドウは、同じバッファを表示している別のウィンドウのそれとは独立し た、自分自身のポイント値をもっています。これは、一つのバッファを表示する 複数のウィンドウをもつ際に役立ちます。
ユーザが目にするかぎりでは、ポイントはカーソルの位置であり、ユーザが他の バッファへ切り替えるとき、カーソルはそのバッファのポイントの位置へジャン プします。
windowが選択されたウィンドウであり、かつそのバッファがカレント・バッ ファである場合、返される値はそのバッファのポイントと同じです。
厳密にいえば、save-excursion
形式の外における"トップレベル"のポ
イント値を返すのがより正しい仕様でしょう。ですが、その値を見つけるのは困
難なのです。
各ウィンドウは、バッファ内のどこから表示を開始すべきかを示す"バッファ内 位置"の追跡に使用する、マーカをもっています。この位置は、ウィンドウの 表示開始(display-start)位置(あるいは単に開始(start))と呼ばれ ます。この位置の直後の文字が、そのウィンドウの左上角に現われる文字です。 必然ではありませんが、これは一般にテキスト行の行頭に位置します。
nil
の場合、選択されたウィンドウが使用されます。例えば、
(window-start) => 7058
ウィンドウを生成するとき、あるいはその中に別のバッファを表示するとき、そ の表示開始位置には、その同じバッファで以前に使用されていた表示開始位置か、 バッファがそれをもっていなければ1が設定されます。
現実的な例については、section テキスト行単位での移動のcount-lins
の記述を参照し
てください。
nil
の場合、選択されたウィンドウが使用されます。
単に、バッファのテキストの変更やポイントの移動をしても、
window-end
が返す値は更新されません。その値は、Emacsが再表示を行なっ
て実際に再表示が完了したときにのみ更新されます。
もし、windowの最後の再表示が横取りされ完了していなければ、Emacsに
はそのウィンドウの表示終了位置がわかりません。その場合、この関数は間違っ
た値を返します。将来のバージョンにおいては、window-end
は、この場
合nil
を返すでしょう。
表示ルーチン群は、バッファを表示する際、ポイントの位置が可視となることを
強要します。普通、それらのルーチンは、ポイントを可視とするために必要なら
常に表示開始位置を変更(つまりウィンドウをスクロール)します。しかしながら、
この関数でnoforceにnil
を用いて開始位置を指定する場合、それ
は、たとえポイントの位置が画面の外に置かれることになっても、
positionの位置からの表示開始を要求することを意味します。これにより、
もしポイントが画面の外に置かれる場合、表示ルーチンはポイントをそのウィン
ドウの真ん中の行の左端に移動させます。
たとえばポイントが1で、ウィンドウの開始位置を2に設定する場合、ポイントは ウィンドウの上端の"さらに上"となるでしょう。再表示が生じたときにポイン トがまだ1なら、表示ルーチンは自動的にポイントを移動させます。以下に例を 示します:
;; 以下はset-window-start
式を実行する前の ;; `foo'の様子。 ---------- Buffer: foo ---------- -!-This is the contents of buffer foo. 2 3 4 5 6 ---------- Buffer: foo ---------- (set-window-start (selected-window) (1+ (window-start))) => 2 ;; 以下はset-window-start
式を実行した後の ;; `foo'の様子。 ---------- Buffer: foo ---------- his is the contents of buffer foo. 2 3 -!-4 5 6 ---------- Buffer: foo ----------
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
関数は垂直スクロールについてのみ考えます。
もしpositionが、windowが水平にスクロールされていることのみに
よって可視な範囲の外にあるなら、pos-visible-in-window-p
はt
を返します。See section 水平スクロール。
垂直スクロールとは、ウィンドウ内でのテキストの上下移動を意味します。これ
は、ウィンドウの表示開始位置の値を変更することによって機能します。垂直ス
クロールはまた、表示開始位置を画面上に保つためにwindow-point
の値
を変更することがあります。
コマンドscroll-up
とscroll-down
において、その方向"up"と
"down"は、ウィンドウを通して見ているバッファ内のテキストの動き(訳注:
ウィンドウの動きではなく)を指しています。長い一巻きの紙に書かれたテキス
トと、その紙を上下に動かすスクロール・コマンドを想像してください。このた
め、もしバッファの途中のテキストを見ていて繰り返しscroll-down
を呼
び出してゆくと、やがてはバッファの先頭が見えてくるでしょう。
一部の人々は、これとは反対の約束が用いられることを主張しています。彼らは、 決まった場所にとどまるテキストの上をウィンドウが移動する、と考えています。 その場合、"down"コマンドがあなたをバッファの末尾に連れてゆくことでしょ う。この見方は、ウィンドウとバッファ内のテキストとの実際の関係によく調和 していますが、ユーザが目にするものとはあまり似通っていません。端末上のウィ ンドウの位置は移動しないし、簡単なスクロール・コマンドは画面上で明らかに テキストを上下に動かします。私たちは、ユーザの視点に合った名前を選択した のです。
スクロール関数(scroll-other-window
を除く)は、カレント・バッファと、
選択されたウィンドウで表示されるバッファとが異なる場合、予測できない結果
となります。See section カレント・バッファ。
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 section ミニバッファそのほか。
ミニバッファがアクティブなとき、選択されたウィンドウが右下角のものならミ
ニバッファが次のウィンドウとなります。この場合、
scroll-other-window
は、ミニバッファをスクロールするよう試みます。
もしミニバッファがただ1行しか含んでいなければ、スクロールすべきところが
ないため、エコー領域が"Beginning of buffer"というメッセージをしばらく
表示した後、その行が再現します。
nil
の場合、それは、scroll-other-window
にどのバッ
ファをスクロールすべきかを伝えます。
nil
でのscroll-up
は、そのウィンドウの下端に
あるこの行数分の行が、代わりに上端に現われるようにスクロールします。デフォ
ルト値は2
です。
countが非負の数の場合、ポイントのある行をそのウィンドウの上端から
count行下に置きます。countが負の数の場合、-1がそのウィ
ンドウで使用可能な最下行を表わすようにして、そのウィンドウの下端から上向
きに数えます。countが非nil
のリストなら、それはそのウィンド
ウの真ん中の行を表わします。
countがnil
の場合、recenter
は、ポイントのある行をウィ
ンドウの真ん中に置き、選択されたフレーム全体ををクリアして再表示します。
recenter
が対話的に呼ばれるとき、countはそのままの前置引数
(22)です。そのため、前置
キーとしての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)
私たちは英語を、基本的には上から下に向かって、そのうえで左から右に向かっ
て読むため、水平スクロールは垂直スクロールとは少し違います。垂直スクロー
ルは表示対象のテキストの途中一部分の選択をするだけですが、水平スクロール
は各行の一部を画面の外に追いやってしまいます(23)。したがって水平ス
クロールの量は、バッファ内の位置ではなく桁数で指定されます。水平スクロー
ルは、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)))))
Emacsのウィンドウは矩形であり、そのサイズ情報は、高さ(行数)と幅(各行に置 かれる文字数)から成ります。モード行は高さに含まれます。ですが幅は、スク ロール・バーや、横並びのウィンドウを分離する`|'文字の桁を数えません。
以下の三つの関数は、ウィンドウに関するサイズ情報を返します:
frame-height
の値よりも小さいものとなります(最後の行は常にミニバッ
ファ用に予約されているため)。
windowがnil
の場合、この関数は、選択されたウィンドウを使用し
ます。
(window-height) => 23 (split-window-vertically) => #<window 4 on windows.texi> (window-height) => 11
frame-width
の値と等しくな
ります。その幅は、そのウィンドウのスクロール・バーや、横並びのウィンドウ
を分離する`|'文字の桁を含みません。
windowがnil
の場合、この関数は、選択されたウィンドウを使用し
ます。
(window-width) => 80
nil
の場合、選択されたウィンドウが使用されます。
そのリストの順序は(left top right bottom)
で、すべての要素はそのフレームの左上角を0、0とする相対値です。その値の
rightの要素は、windowによって使用される最も右の桁よりも大き
く、bottomの要素もwindowによって使用される最も下の行やモード
行よりも大きくなります。
横並びのウィンドウがあるとき、右側に隣接ウィンドウがある方のウィンドウ (訳注: 左側のウィンドウ)の右の角の値は、そのウィンドウと隣接ウィンドウと のセパレータの幅を含みます。このセパレータは、`|'文字の桁、あるいは スクロール・バーとなります。ウィンドウの幅はこのセパレータを含まないため、 その幅はこの場合、左右の角の差とは等しくなりません。
以下に、ただ一つのウィンドウをもった、典型的な24行端末上で得られる結果を 示します:
(window-edges (selected-window)) => (0 0 80 23)
最後の行はエコー領域であるため、下の角は23行目にあたります。
windowがそのフレームの左上角にある場合、bottomは
(window-height)
の値と等しく、rightはほぼ
(window-width)
の値と等しく(24)、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
ウィンドウ・サイズ関数は、ウィンドウのサイズを変更する高水準コマンドと、 ウィンドウ・サイズを入手する低水準関数の二種類に分けられます。Emacsは、 ウィンドウのオーバーラップやウィンドウ間のギャップを許していないため、あ るウィンドウのリサイズは、他のウィンドウに影響を与えます。
window-min-height
行未満に縮むと、そのウィンドウは消え
てしまいます。
horizontalが非nil
の場合、この関数は、行ではなく桁を奪いなが
らwindowをsize桁だけ横に広げます。もし、桁が奪われる側のウィ
ンドウがwindow-min-width
桁未満に縮むと、そのウィンドウは消えてし
まいます。
要求されたサイズがそのウィンドウのフレームからはみ出す場合、この関数は、 そのウィンドウがフレームの高さ(あるいは幅)全体を占有するようにします。
sizeが負の場合、この関数は、ウィンドウを-size行あるい
は-size桁だけ縮めます。これによってウィンドウが最小サイズ
(window-min-height
とwindow-min-width
)よりも小さくなる場合、
enlarge-window
はそのウィンドウを消去します。
enlarge-widnow
はnil
を返します。
(defun enlarge-window-horizontally (columns) (enlarge-window columns t))
enlarge-window
に似ていますが、他のウィンドウに行(ある
いは桁)を譲ることによって選択されたウィンドウを小さくし、引数size
分を打ち消します。そのウィンドウは、window-min-height
か
window-min-width
未満に縮むと消えてしまいます。
sizeが負の場合、そのウィンドウは、-size行あるいは -size桁だけ広げられます。
(defun shrink-window-horizontally (columns) (shrink-window columns t))
以下の二つの変数は、ウィンドウ・サイズ変更関数(window-size-changing functions)に、最小の高さと幅を強要します。
window-min-height
よりも小さく
すると、自動的に消去され、これよりも低い高さのウィンドウを生成することは
できません。絶対的な最低高は2です(モード行のための1行と、バッファ表示の
ための1行が許されます)。この値が2よりも小さい場合、ウィンドウサイズを変
更する動作は、この変数を2にリセットします。デフォルト値は4です。
window-min-width
よりも小さくすると、自
動的に消去され、これよりも狭いウィンドウを生成することはできません。絶対
的な最小幅は1です。これ未満の値は無視されます。デフォルト値は10です。
各関数は、単独の引数としてそのフレームを受け取ります。どのウィンドウのサ イズが、あるいは厳密にどのように変更されたのかを見つけ出す直接的な方法は ありません。しかしながら、あなたのサイズ変更関数(size-change function)が、 あなたが関心があるウィンドウを各変更のたびに追跡すれば、古いサイズ情報を 新しいもの比較することによって、何が変更されたのかを割り出すことができま す。
ウィンドウの生成や消去はサイズの変更とみなし、したがってこれらの関数の呼 出しを引き起こします。フレーム・サイズの変更も既存のウィンドウのサイズを 変更するため、同様にみなされます。
これらの関数の内部で、save-window-excursion
を使用するのはよくあり
ません。なぜなら、それは常にサイズの変更とみなされ、これらの関数が繰り返
し呼び出されてしまうからです。多くの場合、ここで必要とされているのは
save-selected-window
でしょう。
この節では、画面の座標とウィンドウが、どのように関連しているのかを述べま す。
window-at
はnil
を返します。
frameを省略した場合、選択されたフレームが使用されます。
引数coordinatesは、この形式のコンスセルです:
(x . y)
座標xとyは文字数で計られ、画面あるいはフレームの左上角から数 えられます。
その座標がwindowの内側なら、coordinates-in-window-p
の値は非
nil
となります。その値はまた、その位置が、ウィンドウのどの部分にあ
たるのかを以下のように示します:
(relx . rely)
mode-line
vertical-split
nil
関数coordinates-in-window-p
は、常に、windowがあるフレームを
使用するため、引数としてはフレームを要求しません。
ウィンドウ構成(window configuration)は、フレーム全体の配置(全ウィ ンドウ、それらのサイズ、それらがどのバッファを含んでいるか、各バッファの 表示されている部分、そしてポイントとマークの値)を記録します。以前に保存 されたウィンドウ構成を復元することによって、以前の配置全体を回復させるこ とができます。
ただ一つのフレームだけでなく、すべてのフレームについて記録したい場合は、 ウィンドウ構成の代わりにフレーム構成を使用します。See section フレーム構成。
current-window-configuration
によって返された値でなくてはなりませ
ん。
この関数は、常にウィンドウ・サイズの変更とみなされ、
window-size-change-functions
の実行を引き起こします(この関数は、新
しいウィンドウ構成が、実際に古いものと異なるのか否かを見分ける手段を備え
ていません)。
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) => #<window 25 on control.texi> (setq w (selected-window)) => #<window 19 on control.texi> (save-window-excursion (delete-other-windows w) (switch-to-buffer "foo") 'do-something) => do-something ;; ここで再び画面が分割されます。
t
を返します。
ウィンドウ構成の内部を見るためのプリミティブは、理にかなってはいますが、 実装はされていません。それらが、実装に値するほど十分便利かどうかが明らか ではないのです。
Go to the first, previous, next, last section, table of contents.