[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

25. ウィンドウ

この章では、Emacsのウィンドウに関連する、関数と変数のほぼすべてについて 述べます。ウィンドウ内でのテキスト表示のされ方については、Emacsの表示 を参照してください。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

25.1 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のフレーム上に、考えられるかぎりの数のウィ ンドウのタイルを配置することはできません。ウィンドウの分割と See section ウィンドウのサイズ

ウィンドウのバッファの内容が、どのようにそのウィンドウ内に表示されるのか については、See section Emacsの表示

Function: windowp object

この関数は、objectがウィンドウであればtを返します。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

25.2 ウィンドウの分割

以下で述べられている関数は、一つのウィンドウを二つに分割するために使用さ れるプリミティブです。このうち二つの高水準関数、pop-to-bufferdisplay-bufferは、ウィンドウを分割しないこともあります (see section ウィンドウ内でのバッファの表示)。

以下で述べられている関数は、引数としてバッファを受け付けません。二つに分 割された"半分ずつ"のウィンドウは、最初、分割されたもとのウィンドウが表 示していたのと同じバッファを表示します。

Command: split-window &optional window size horizontal

この関数は、windowを二つのウィンドウへと分割します。もとのウィンド ウwindowは選択されたウィンドウであり続けますが、以前の画面領域の一 部分のみを占めます。その残りは、この関数の値として返される、新たに生成さ れたウィンドウによって占められます。

horizontalが非nilの場合、windowは、二つの横並びのウィ ンドウへと分割されます。もとのウィンドウwindowは、その左端 size桁を維持し、残りの桁を新しいウィンドウに譲ります。 horizontalnilの場合、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 Scroll Bars)か`|'文字を表示します。表示テーブルを 使えば、代わりのボーダー文字を指定することができます。表示テーブル参照。

Command: split-window-vertically size

この関数は、選択されたウィンドウにsize行を残しつつ、そのウィンドウ を上下二つのウィンドウへと分割します。

この関数は、単に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))))
Command: split-window-horizontally size

この関数は、選択されたウィンドウにsize桁を残しつつ、そのウィンドウ を二つの横並びのウィンドウへと分割します。

この関数は、単に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))
Function: one-window-p &optional no-mini all-frames

この関数は、ウィンドウが一つしか存在しない場合に非nilを返します。 引数no-miniは、もし非nilなら、たとえミニバッファがアクティ ブでもそれを数えないことを意味し、nilならアクティブなミニバッファ・ ウィンドウをウィンドウ数の合計に含めます。その合計が1と比較されます。

引数all-framesは、どのフレームについて考えるのかを指定します。以下 に、取り得る値とそれらの意味を示します:

nil

選択されたフレーム内のウィンドウと、たとえ別のフレーム内にあっても、その フレームが使用しているミニバッファを数えます。

t

既存のすべてのフレーム内のすべてのウィンドウを数えます。

visible

すべての可視フレーム内のすべてのウィンドウを数えます。

0

すべての可視フレームとアイコン化されたフレーム内の、すべてのウィンドウを 数えます。

その他

選択されたフレーム内のウィンドウをきっかり数え、その他は数えません。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

25.3 ウィンドウの消去

ウィンドウは、ウィンドウを消去(delete)するための関数を呼び出して消 去しないかぎり、そのフレーム上で可視であり続けます。消去されたウィンドウ は画面上に現われることはできませんが、Lispオブジェクトとしては、それへの 参照がなくなるまで存在し続けます。保存したウィンドウ構成の復元以外に、ウィ ンドウの消去を取り消すための方法はありません(see section ウィンドウ構成)。ウィンドウ構成の復元はまた、その構成に含まれないウィン ドウをみんな消去してしまいます。

ウィンドウを消去するとき、それによって取り上げられる場所は、隣接する一個 の同胞ウィンドウ(sibling)に与えられます(Emacsバージョン18では、その場所 は、隣接するすべての同胞ウィンドウに均等に配分されていました)。

Function: window-live-p window

この関数は、もしwindowが消去されていればnilを返し、そうでな ければtを返します。

警告!: 消去されたウィンドウをまだ生きているかのように使用した場 合、結果として誤った情報、あるいは致命的エラーが生じます。

Command: delete-window &optional window

この関数は、windowを表示から取り除きます。windowが省略された 場合、選択されたウィンドウが消去されます。delete-windowが呼び出さ れたとき、ウィンドウが一つしか存在しなければエラーが通知されます。

この関数はnilを返します。

delete-windowが対話的に呼び出されたとき、windowは選択された ウィンドウをデフォルトとします。

Command: delete-other-windows &optional window

この関数は、フレーム内の他のウィンドウを消去することにより、window をそのフレームでの唯一のウィンドウにします。windowが省略されるか nilの場合、選択されたウィンドウがデフォルトとして使用されます。

この関数はnilを返します。

Command: delete-windows-on buffer &optional frame

この関数は、bufferを表示しているすべてのウィンドウを消去します。 bufferを表示しているウィンドウがなければ何もしません。

delete-windows-onは、フレーム単位で作用します。フレーム内に異なる バッファを表示しているウィンドウがいくつかある場合、そのうちbuffer を表示しているものが取り除かれ、その余白を満たすために他のウィンドウが広 がります。フレーム内のすべてのウィンドウがbufferを表示している場合 (ウィンドウが一つしか存在しない場合を含む)、そのフレームは、 other-bufferで選択された別のバッファを表示する一個のウィンドウを 保持するようになります。See section バッファ・リスト

引数frameは、どのフレームに作用するのかを制御します:

この関数は、常にnilを返します。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

25.4 ウィンドウの選択

ウィンドウが選択されたとき、そのウィンドウ内のバッファがカレント・バッファ となり、その中にカーソルが現われます。

Function: selected-window

この関数は、選択されたウィンドウを返します。これは、カーソルが現われるウィ ンドウであり、多くのコマンドが適用されるウィンドウでもあります。

Function: select-window window

この関数は、windowを選択されたウィンドウにします。その後、 window内にカーソルが現われます(再表示において)。window内に表 示されているバッファは、直ちにカレント・バッファとして指示されます。

戻り値はwindowです。

 
(setq w (next-window))
(select-window w)
     ⇒ #<window 65 on windows.texi>
Macro: save-selected-window forms…

このマクロは、選択されたウィンドウを記録してformsを次々に実行した 後、はじめに選択されていたウィンドウを復元します。ウィンドウのサイズや配 置、内容については保存も復元もしません。したがって、formsがそれら を変更すると、その変更は永久的なものとなります。

以下の関数は、種々の選択基準をもとにして画面上のウィンドウの一つを選択し ます。

Function: get-lru-window &optional frame

この関数は、最も昔に"使用された"(つまり選択された)ウィンドウを返します。 選択されたウィンドウは、常に、最も最近に使用されたウィンドウとなります。

選択されたウィンドウが唯一のウィンドウである場合、それは最も昔に使用され たウィンドウにもなります。新たに生成されるウィンドウは、それが選択される まで、最も昔に使用されたウィンドウとなります。ミニバッファ・ウィンドウは 決してその候補にはなりません。

引数frameは、どのウィンドウ群について考えるのかを制御します。

Function: get-largest-window &optional frame

この関数は、最も広い面積(高さ×幅)を占めるウィンドウを返します。横並びの ウィンドウがない場合、最も行数の多いウィンドウがこれにあたります。ミニバッ ファ・ウィンドウは決してその候補にはなりません。

同じサイズのウィンドウが二つある場合、この関数は、選択されたウィンドウを 起点としてウィンドウの循環順序(次節を参照)をたどり、先に出てきたウィンド ウを返します。

引数frameは、どのウィンドウ集合について考えるのかを制御します。上 述のget-lru-window参照。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

25.5 ウィンドウの循環順序

次のウィンドウを選択するために、コマンドC-x o (other-window)を使用するとき、(訳注: 選択されるウィンドウは)画面 上のすべてのウィンドウを通じて一定の循環順序で移動します。与えられたどん なウィンドウ構成に対しても、この順序は決して変わりません。これは、 ウィンドウの循環順序(cyclic ordering of windows)と呼ばれます。

一般に、この順序は上から下へ、また左から右へ進みます。ですがウィンドウが 分割された順序によっては、先に下へ、あるいは先に右へ進むかもしれません。

もし最初の分割が垂直(上下のウィンドウ)であり、その後それら子ウィンドウが 水平に分割されていたなら、その順序はフレームの上部において左から右、次に フレームの下部において左から右、というふうになります。もし最初の分割が水 平だったなら、その順序はまず左側において上から下、というふうになります。 一般にウインドウ・ツリー内のどの階層においても、各同胞ウィンドウ間では、 その順序は左から右、あるいは上から下となります。

Function: next-window &optional window minibuf all-frames

この関数は、ウィンドウの循環順序の中でwindowの次にあたるウィンドウ を返します。これは、windowが選択されているときに、C-x oの打 鍵によって選択されるウィンドウです。windowが唯一の可視ウィンドウで ある場合、この関数はwindowを返します。省略された場合、window は選択されたウィンドウをデフォルトとします。

引数minibufの値は、ウィンドウ順序にミニバッファを含めるか否かを決 定します。minibufnilの場合、もしミニバッファが現在アクティ ブならばウィンドウ順序に含めます。これは、C-x oの挙動です(ミニバッ ファの使用中、ミニバッファ・ウィンドウがアクティブとなります。 See section ミニバッファ)。

minibuftの場合、たとえアクティブでなくてもミニバッファ・ ウィンドウを循環順序に含めます。

minibuftでもnilでもない場合、たとえアクティブでも ミニバッファ・ウィンドウを循環順序に含めません。

引数all-framesは、どのフレームについて考えるのかを指定します。以下 に、取り得る値とそれらの意味を示します:

nil

windowのフレーム内のすべてのウィンドウと、たとえ別のフレーム内にあっ ても、そのフレームが使用しているミニバッファについて考えます。

t

既存のすべてのフレーム内のすべてのウィンドウについて考えます。

visible

すべての可視フレーム内のすべてのウィンドウについて考えます(有用な結果を 得るには、windowが可視フレーム内にあることが保証されなくてはなりま せん)。

0

すべての可視フレームとアイコン化されたフレーム内の、すべてのウィンドウに ついて考えます。

その他

厳密にwindowのフレーム内のウィンドウについてのみ考え、その他につい ては考えません。

以下の例は、二つのウィンドウがあり、両方ともバッファ`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>
Function: previous-window &optional window minibuf all-frames

この関数は、ウィンドウの循環順序の中でwindowの前にあたるウィンドウ を返します。その他の引数は、next-windowと同様に、どのウィンドウを 循環順序に含めるのかを指定するものです。

Command: other-window count

この関数は、循環順序の中でcount番目後ろにあたるウィンドウを選択し ます。countが負の場合、count番目前のウィンドウを選択します。 nilを返します。

対話的な呼出しにおいては、countは、数値前置引数となります。

Function: walk-windows proc &optional minibuf all-frames

この関数は、各ウィンドウに対して一度ずつ、そのウィンドウを単独の引数にし てprocを呼び出しながら、すべてのウィンドウを一周します。

オプション引数minibufall-framesは、そのスキャンの対象に含 めるウィンドウ集合を指定します。詳細については、上述のnext-window を参照。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

25.6 バッファとウィンドウ

この節では、ウィンドウを調べたり、厳密な制御のもとでウィンドウにバッファ を表示したりする低水準関数について述べます。 使用するウィンドウを(訳注: 自動的に)見つけ、指定したバッファの表示にそれ を使用する関数については、 そこで述べられている関数はこれらよりも簡単に使用できますが、ウィンドウの 選択と生成において、ヒューリスティクスに頼る部分があります。完璧な制御を 必要とする場合は、以下の関数を使用します。

Function: set-window-buffer window buffer-or-name

この関数は、windowに対し、その内容としてbuffer-or-nameを表示 させます。nilを返します。

 
(set-window-buffer (selected-window) "foo")
     ⇒ nil
Function: window-buffer &optional window

この関数は、windowが表示しているバッファを返します。windowが 省略された場合、この関数は、選択されたウィンドウのバッファを返します。

 
(window-buffer)
     ⇒ #<buffer windows.texi>
Function: get-buffer-window buffer-or-name &optional all-frames

この関数は、現在buffer-or-nameを表示しているウィンドウか、あるいは それがなければnilを返します。該当するウィンドウがいくつもある場合、 この関数は、選択されたウィンドウを起点としてウィンドウの循環順序をたどり、 先に出てきたウィンドウを返します。See section ウィンドウの循環順序

引数all-framesは、どのウィンドウ群について考えるのかを制御します。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

25.7 ウィンドウ内でのバッファの表示

この節では、ウィンドウを自動的に選択して、指定したバッファの表示にそれを 使用してくれる便利な関数について述べます。これらの関数は、特定の状況にお いて、既存のウィンドウを分割することがあります。ここではまた、ウィンドウ の選択に要するヒューリスティクスを特性づける変数についても述べます。 より厳密な制御を可能とする低水準関数については、

あるバッファを、Lispプログラムがアクセスあるいは変更できるようするためだ けにカレントにする場合は、この節の関数群を使用しないでください。これらは、 無条件にウィンドウ内のバッファの表示を変更してユーザを驚かしてしまうため、 その用途には強烈すぎるのです。代わりに、ウィンドウ内のバッファの表示に影 響を与えず、プログラムによるアクセスのためにバッファをカレントに指示でき る、set-buffer (see section カレント・バッファ)とsave-excursion (see section 脱線)を使用してください。

Command: switch-to-buffer buffer-or-name &optional norecord

この関数は、buffer-or-nameをカレント・バッファにし、選択されたウィ ンドウにそのバッファを表示します。これは、そのバッファを人間が見ることが でき、また以降のキーボード・コマンドがそこへ適用されることを意味していま す。set-bufferと比べてみると、set-bufferbuffer-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を返します。

Command: switch-to-buffer-other-window buffer-or-name

この関数は、buffer-or-nameをカレント・バッファにし、選択されていな いウィンドウに表示します。その後、そのウィンドウを選択します。バッファに 関する操作はswitch-to-bufferと同じです。

現在選択されているウィンドウは、絶対にこの処理に使用されることはありませ ん。もしそれが唯一のウィンドウであれば、この処理用に別個のウィンドウを作 るために、そのウィンドウが分割されます。選択されたウィンドウがすでにその バッファを表示している場合、それはそのままですが、それでもなお、そのバッ ファを表示するための別のウィンドウがさらに獲得されます。

Function: pop-to-buffer buffer-or-name &optional other-window

この関数は、buffer-or-nameをカレント・バッファにし、できるだけその 直前に選択されていたウィンドウを避けて、いずれかのウィンドウにそのバッファ を表示します。その、"pop"されるウィンドウは、それ自身のフレーム内での 選択されたウィンドウとなります。

変数pop-up-framesが非nilの場合、pop-to-bufferは、す でにそのバッファを表示している可視フレーム内のウィンドウを探します。該当 するウィンドウがあればそれを返し、そのフレーム内での選択されたウィンドウ とします。なければ新しいフレームを生成し、その中にbuffer-or-nameを 表示します。

pop-up-framesnilの場合、pop-to-bufferは、もっぱら 選択されたフレーム内で動作します(選択されたフレームがミニバッファのみを 保持している場合、pop-to-bufferは、最も最近に選択されていた、ミニ バッファだけではないフレーム内で動作します)。

変数pop-up-windowsが非nilの場合、もとのウィンドウとは別の 新しいウィンドウを生成するために、ウィンドウが分割されることがあります。 詳細については表示に用いるウィンドウの選択を参照してください。

other-windowが非nilの場合、pop-to-bufferは、たとえ選 択されたウィンドウですでにbuffer-or-nameが表示されていても、別のウィ ンドウを探すか生成します。そのため結果として、buffer-or-nameが二つ のウィンドウに表示されるかもしれません。一方、選択されたウィンドウですで にbuffer-or-nameが表示されており、かつother-windownilの場合、buffer-or-nameの表示としては選択されたウィンドウ で十分とみなされ、よって何もする必要がありません。

display-bufferに影響するすべての変数は、同様に pop-to-bufferにも影響します。See section 表示に用いるウィンドウの選択

buffer-or-nameが既存のバッファ名以外を示す文字列の場合、その名前の バッファが生成されます。新しいバッファの主モードは、変数 default-major-modeにしたがって設定されます。See section 主モードの自動選択の仕組み

Command: replace-buffer-in-windows buffer

この関数は、bufferを表示しているすべてのウィンドウにおいて、それを 別のバッファで置き換えます。別のバッファとは、other-bufferで選択 されるバッファです。この関数の通常の利用においては、別のバッファとしてど れが使用されるのかを気にしないで、bufferがもはや表示されないことだ けを期待してください。

この関数はnilを返します。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

25.8 表示に用いるウィンドウの選択

この節では、バッファを表示するためにウィンドウを選択する、という基本的な 機能を、display-bufferに関して述べます。すべての高水準関数とコマ ンドはこのサブルーチンを使用します。以下に、display-bufferの使用 法とカスタマイズ方法を述べます。

Command: display-buffer buffer-or-name &optional not-this-window

このコマンドは、pop-to-bufferのように、buffer-or-nameをいず れかのウィンドウで見えるようにしますが、そのウィンドウを選択せず、またそ のバッファをカレントにもしません。選択されたウィンドウの同一性(identity) が、この関数によって変更されることはありません。

not-this-windowが非nilの場合、それは、たとえ指定されたバッ ファが選択されたウィンドウですでに表示されていても、それを別のウィンドウ に表示することを意味します。このため、そのバッファが同時に二つのウィンド ウで見えるようになることがあります。not-this-windownilの 場合、buffer-or-nameがすでにいずれかのウィンドウで表示されていれば それで十分であり、よってこの関数は何もしません。

display-bufferは、buffer-or-nameの表示のために選択したウィ ンドウを返します。

display-bufferが、厳密にはどのようにウィンドウを探し生成するのか は、以下に述べる変数に依存しています。

User Option: pop-up-windows

この変数は、display-bufferが新しいウィンドウを作るか否かを制御し ます。これが非nilで、かつウィンドウが一つしかない場合、そのウィン ドウが分割されます。nilの場合、display-bufferは一つのウィ ンドウを分割はしませんが、その全体を使用します。

User Option: split-height-threshold

この変数は、複数のウィンドウがあるとき、どんな場合に display-bufferがウィンドウを分割できるのかを決定します (20)。 最大のウィンドウが少なくともこの行数分ある場合、display-bufferは、 常にそれを分割します。最大のウィンドウがこの高さに満たない場合は、それが 単独のウィンドウでかつpop-up-windowsが非nilのときにのみ、 そのウィンドウを分割します。

User Option: pop-up-frames

この変数は、display-bufferが新しいフレームを作るか否かを制御しま す。非nilの場合、display-bufferは、すでにいずれかの可視フ レーム上で所望のバッファを表示している既存のウィンドウを探します。もし見 つかれば、そのウィンドウを返します。見つからなければ、新しいフレームを作 ります。pop-up-framesが非nilの場合、変数 pop-up-windowssplit-height-thresholdは無視されます。

pop-up-framesnilの場合、display-bufferは、ウィン ドウを分割するか再利用します。

より多くの情報については、See section フレーム

Variable: pop-up-frame-function

この変数では、pop-up-framesが非nilの場合に、どうやって新し いフレームを作るのかを指定します。

その値は、引数をもたない関数です。display-bufferが新しいフレーム を作るとき、一個のフレームを返すこの関数を呼び出すことによって、その処理 を行ないます。この変数のデフォルト値は、pop-up-frame-alist内のパ ラメータを用いてフレームを生成する関数です。

Variable: pop-up-frame-alist

この変数は、display-bufferが新しいフレームを作る際に使用する、フ レーム・パラメータを指定したalistを保持します。フレーム・パラメータに関 するより多くの情報については、See section フレーム・パラメータ

Variable: special-display-buffer-names

特別に表示されるべきバッファの、バッファ名のリストです。もしバッファ名が このリスト中にあれば、display-bufferは、そのバッファを特別に扱い ます。

デフォルトでは、特別な表示とは、そのバッファに専用のフレームを与えること を意味します。

もし、その要素が文字列でなくリストなら、そのリストのCARはバッファ名 で、残りはそのフレームをどうやって生成するのかを表わします。リストの残り としては二通りの可能性があります。それは、フレーム・パラメータを指定する alistでもあり得るし、あるいは関数とそれに与える引数(21)を含むこともできます(その関数 の第一引数は表示対象のバッファです。第二引数以下に、このリストで与える引 数がきます)。

Variable: special-display-regexps

特別に表示されるべきバッファを指定する、正規表現のリストです。もしバッファ 名がこのリスト中のいずれかの正規表現に一致すれば、display-buffer は、そのバッファを特別に扱います。

デフォルトでは、特別な表示とは、そのバッファに専用のフレームを与えること を意味します。

もし、その要素が文字列でなくリストなら、そのリストのCARは正規表現で、 残りはそのフレームをどうやって生成するのかを表わします。上述の special-display-buffer-namesの下を参照。

Variable: special-display-function

この変数は、バッファを特別に表示するために呼び出される関数を保持します。 その関数とは、引数としてバッファを受け取り、そのバッファの表示に使用した ウィンドウを返すものです。

この変数のデフォルト値は、special-display-popup-frameです。

Function: special-display-popup-frame buffer

この関数は、bufferを、それ専用のフレームの中で可視にします。 bufferが、すでにいずれかのフレーム内のウィンドウに表示されていれば、 そのウィンドウを使用すべく、そのフレームを可視化して上昇させます。そうで ない場合、buffer専用のフレームを生成します。

この関数は、bufferがそれ専用のフレームで表示されているか否かにかか わらず、そのバッファを表示している既存のウィンドウを使用します。とはいえ bufferが生成されるより前、つまり自分の初期化ファイルで上述の変数群 を設定しておけば、おそらくそのウィンドウは、この関数によって前もって作ら れるでしょう。

User Option: special-display-frame-alist

この変数は、special-display-popup-frameがフレームを生成する際に使 用する、フレーム・パラメータを保持します。

Variable: same-window-buffer-names

選択されたウィンドウに表示されるべきバッファの、バッファ名のリストです。 もしバッファ名がこのリスト中にあれば、display-bufferは、そのバッ ファを選択されたウィンドウに表示するよう扱います。

Variable: same-window-regexps

選択されたウィンドウに表示されるべきバッファを指定する、正規表現のリスト です。もしバッファ名がこのリスト中のいずれかの正規表現に一致すれば、 display-bufferは、そのバッファを選択されたウィンドウに表示するよ う扱います。

Variable: display-buffer-function

この変数は、display-bufferの挙動をカスタマイズする最も柔軟な手段 です。非nilの場合、それは、display-bufferがその処理を行な うために呼び出す関数です。その関数は、display-bufferと同じ二つの 引数を受け付けるものです。そして、ウィンドウを選択あるいは生成して指定さ れたバッファを表示し、そのウィンドウを返します。

このフックは、前述した他のオプションやフックすべてに優先します。

ウィンドウは、そのバッファ"専用"としてマークづけされ得ます。そうすると display-bufferは、そのウィンドウの使用を試みるのをやめます。

Function: window-dedicated-p window

この関数は、windowが専用としてマークされていればtを返し、そ うでなければnilを返します。

Function: set-window-dedicated-p window flag

この関数は、flagが非nilであればwindowを専用としてマー クし、そうでなければ非専用とします。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

25.9 ウィンドウとポイント

各ウィンドウは、同じバッファを表示している別のウィンドウのそれとは独立し た、自分自身のポイント値をもっています。これは、一つのバッファを表示する 複数のウィンドウをもつ際に役立ちます。

ユーザが目にするかぎりでは、ポイントはカーソルの位置であり、ユーザが他の バッファへ切り替えるとき、カーソルはそのバッファのポイントの位置へジャン プします。

Function: window-point window

この関数は、windowの現在のポイント位置を返します。選択されていない ウィンドウに対しては、これは、そのウィンドウが選択された場合に(そのウィ ンドウのバッファにおいて)ポイントが取るであろう値となります。

windowが選択されたウィンドウであり、かつそのバッファがカレント・バッ ファである場合、返される値はそのバッファのポイントと同じです。

厳密にいえば、save-excursion形式の外における"トップレベル"のポ イント値を返すのがより正しい仕様でしょう。ですが、その値を見つけるのは困 難なのです。

Function: set-window-point window position

この関数は、windowのポイントを、windowのバッファ内の位置 positionに位置させます。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

25.10 ウィンドウ開始位置

各ウィンドウは、バッファ内のどこから表示を開始すべきかを示す"バッファ内 位置"の追跡に使用する、マーカをもっています。この位置は、ウィンドウの 表示開始(display-start)位置(あるいは単に開始(start))と呼ばれ ます。この位置の直後の文字が、そのウィンドウの左上角に現われる文字です。 必然ではありませんが、これは一般にテキスト行の行頭に位置します。

Function: window-start &optional window

この関数は、ウィンドウwindowの表示開始位置を返します。windownilの場合、選択されたウィンドウが使用されます。例えば、

 
(window-start)
     ⇒ 7058

ウィンドウを生成するとき、あるいはその中に別のバッファを表示するとき、そ の表示開始位置には、その同じバッファで以前に使用されていた表示開始位置か、 バッファがそれをもっていなければ1が設定されます。

現実的な例については、テキスト行単位での移動count-linsの記述を参照し てください。

Function: window-end &optional window

この関数は、ウィンドウwindowにおける、表示の終了位置を返します。 windownilの場合、選択されたウィンドウが使用されます。

単に、バッファのテキストの変更やポイントの移動をしても、 window-endが返す値は更新されません。その値は、Emacsが再表示を行なっ て実際に再表示が完了したときにのみ更新されます。

もし、windowの最後の再表示が横取りされ完了していなければ、Emacsに はそのウィンドウの表示終了位置がわかりません。その場合、この関数は間違っ た値を返します。将来のバージョンにおいては、window-endは、この場 合nilを返すでしょう。

Function: set-window-start window position &optional noforce

この関数は、windowの表示開始位置として、windowのバッファ内の 位置positionを設定します。positionを返します。

表示ルーチン群は、バッファを表示する際、ポイントの位置が可視となることを 強要します。普通、それらのルーチンは、ポイントを可視とするために必要なら 常に表示開始位置を変更(つまりウィンドウをスクロール)します。しかしながら、 この関数でnoforcenilを用いて開始位置を指定する場合、それ は、たとえポイントの位置が画面の外に置かれることになっても、 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は使用されません。

Function: pos-visible-in-window-p &optional position window

この関数は、positionが、windowの画面上で現在可視なテキストの 範囲内にあれば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-pt を返します。See section 水平スクロール


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

25.11 垂直スクロール

垂直スクロールとは、ウィンドウ内でのテキストの上下移動を意味します。これ は、ウィンドウの表示開始位置の値を変更することによって機能します。垂直ス クロールはまた、表示開始位置を画面上に保つためにwindow-pointの値 を変更することがあります。

コマンドscroll-upscroll-downにおいて、その方向"up"と "down"は、ウィンドウを通して見ているバッファ内のテキストの動き(訳注: ウィンドウの動きではなく)を指しています。長い一巻きの紙に書かれたテキス トと、その紙を上下に動かすスクロール・コマンドを想像してください。このた め、もしバッファの途中のテキストを見ていて繰り返しscroll-downを呼 び出してゆくと、やがてはバッファの先頭が見えてくるでしょう。

一部の人々は、これとは反対の約束が用いられることを主張しています。彼らは、 決まった場所にとどまるテキストの上をウィンドウが移動する、と考えています。 その場合、"down"コマンドがあなたをバッファの末尾に連れてゆくことでしょ う。この見方は、ウィンドウとバッファ内のテキストとの実際の関係によく調和 していますが、ユーザが目にするものとはあまり似通っていません。端末上のウィ ンドウの位置は移動しないし、簡単なスクロール・コマンドは画面上で明らかに テキストを上下に動かします。私たちは、ユーザの視点に合った名前を選択した のです。

スクロール関数(scroll-other-windowを除く)は、カレント・バッファと、 選択されたウィンドウで表示されるバッファとが異なる場合、予測できない結果 となります。See section カレント・バッファ

Command: scroll-up &optional count

この関数は、選択されたウィンドウ内のテキストをcount行だけ上向きに スクロールします。countが負の場合、スクロールは実際には下向きとな ります。

countnilの場合(あるいは省略された場合)、スクロールの量は、 そのウィンドウが使用できる高さ(モード行は数えない)よりも next-screen-context-lines行分少なくなります。

scroll-upnilを返します。

Command: scroll-down &optional count

この関数は、選択されたウィンドウ内のテキストをcount行だけ下向きに スクロールします。countが負の場合、スクロールは実際には上向きとな ります。

countが省略されるかnilの場合、スクロールの量は、そのウィン ドウが使用できる高さ(モード行は数えない)よりも next-screen-context-lines行分少なくなります。

scroll-downnilを返します。

Command: scroll-other-window &optional count

この関数は、他のウィンドウ内のテキストを、count行だけ上向きにスク ロールします。countが負の値かnilの場合、scroll-upと 同じように扱います。

スクロールさせるバッファは、変数other-window-scroll-bufferで指定 することができます。選択されたウィンドウがミニバッファである場合、普通、 次のウィンドウは左上角のウィンドウです。ミニバッファにいながら別のウィン ドウをスクロールさせる場合は、変数minibuffer-scroll-windowで指定 します。この変数は、その他のウィンドウが選択されているときには何ら影響し ません。See section ミニバッファそのほか

ミニバッファがアクティブなとき、選択されたウィンドウが右下角のものならミ ニバッファが次のウィンドウとなります。この場合、 scroll-other-windowは、ミニバッファをスクロールするよう試みます。 もしミニバッファがただ1行しか含んでいなければ、スクロールすべきところが ないため、エコー領域が"Beginning of buffer"というメッセージをしばらく 表示した後、その行が再現します。

Variable: other-window-scroll-buffer

この変数が非nilの場合、それは、scroll-other-windowにどのバッ ファをスクロールすべきかを伝えます。

User Option: scroll-step

この変数は、ポイントが画面の外に出てしまうとき、自動的にどれだけスクロー ルするかを制御します。その値が0なら、再表示は、ポイントがそのウィンドウ の垂直方向の中央にくるようにスクロールします。その値が正の整数nな ら、再表示は、どちらかの方向にn行スクロールすることによって、もし 可能ならポイントを画面上に呼び戻します。だめならポイントを中央にもってき ます。デフォルト値は0です。

User Option: next-screen-context-lines

この変数の値は、画面いっぱいスクロールするときに残す、つなぎの行数です。 たとえば、引数がnilでのscroll-upは、そのウィンドウの下端に あるこの行数分の行が、代わりに上端に現われるようにスクロールします。デフォ ルト値は2です。

Command: recenter &optional count

この関数は、ポイントがある位置のテキストを、そのウィンドウ内の指定された 垂直位置に置くよう、選択されたウィンドウをスクロールします。

countが非負の数の場合、ポイントのある行をそのウィンドウの上端から count行下に置きます。countが負の数の場合、-1がそのウィ ンドウで使用可能な最下行を表わすようにして、そのウィンドウの下端から上向 きに数えます。countが非nilのリストなら、それはそのウィンド ウの真ん中の行を表わします。

countnilの場合、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)  

[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

25.12 水平スクロール

私たちは英語を、基本的には上から下に向かって、そのうえで左から右に向かっ て読むため、水平スクロールは垂直スクロールとは少し違います。垂直スクロー ルは表示対象のテキストの途中一部分の選択をするだけですが、水平スクロール は各行の一部を画面の外に追いやってしまいます(23)。したがって水平ス クロールの量は、バッファ内の位置ではなく桁数で指定されます。水平スクロー ルは、window-startによって返される表示開始位置とはまったく無関係 です。

通常、水平スクロールは行なわれていません。したがって最も左の桁はウィンド ウの左端に位置しています。この状態では、右へのスクロールによって現われる データが画面の左側にないため、そのスクロールは意味をもたず、よって許され てもいません。左へのスクロールは可能です。これは、テキストの第一桁をウィ ンドウの端より外へスクロールし、以前に切り詰められていた右側の桁を表示し ます。ウィンドウがいったん左への非0の水平スクロール量を持つと、それを右 へ戻すようスクロールすることができますが、正味の水平スクロールを0に縮め るまでだけです。左へスクロールできる量に制限はありませんが、やがてはテキ スト全体が左端に隠れてしまうでしょう。

Command: scroll-left count

この関数は、選択されたウィンドウをcount桁左へ(あるいはcount が負なら右へ)スクロールします。戻り値は、その変更後に実際に左側にスクロー ルされている合計の量、つまりwindow-hscroll (以下参照)によって返さ れる値と同じです。

Command: scroll-right count

この関数は、選択されたウィンドウをcount桁右へ(あるいはcount が負なら左へ)スクロールします。戻り値は、その変更後に実際に左側にスクロー ルされている合計の量、つまりwindow-hscroll (以下参照)によって返さ れる値と同じです。

いったん、行けるだけ右へスクロールしてしまうと、左側への合計のスクロール 量が0となる通常の位置へ戻り、さらに右へのスクロールの試みは何の効果もも たらしません。

Function: window-hscroll &optional window

この関数は、windowの左側への合計の水平スクロール量、つまり window内のテキストが左端を越えて左側にスクロールされている桁数を返 します。

その値は、決して負にはなりません。window内で水平スクロールが行なわ れていないときは0です(普段の場合)。

windownilの場合、選択されたウィンドウが使用されます。

 
(window-hscroll)
     ⇒ 0
(scroll-left 5)
     ⇒ 5
(window-hscroll)
     ⇒ 5
Function: set-window-hscroll window columns

この関数は、windowがスクロールされる左端からの桁数として、 columnの値を設定します。引数columnsは0以上です。そうでない場 合は0として取られます。

返される値は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 ] [ >> ]         [Top] [Contents] [Index] [ ? ]

25.13 ウィンドウのサイズ

Emacsのウィンドウは矩形であり、そのサイズ情報は、高さ(行数)と幅(各行に置 かれる文字数)から成ります。モード行は高さに含まれます。ですが幅は、スク ロール・バーや、横並びのウィンドウを分離する`|'文字の桁を数えません。

以下の三つの関数は、ウィンドウに関するサイズ情報を返します:

Function: window-height &optional window

この関数は、モード行を含む、window内の行数を返します。window がフレーム全体を占めている場合、これはそのフレーム上での frame-heightの値よりも小さいものとなります(最後の行は常にミニバッ ファ用に予約されているため)。

windownilの場合、この関数は、選択されたウィンドウを使用し ます。

 
(window-height)
     ⇒ 23
(split-window-vertically)
     ⇒ #<window 4 on windows.texi>
(window-height)
     ⇒ 11
Function: window-width &optional window

この関数は、window内の桁数を返します。windowがフレーム全体を 占めている場合、これはそのフレーム上でのframe-widthの値と等しくな ります。その幅は、そのウィンドウのスクロール・バーや、横並びのウィンドウ を分離する`|'文字の桁を含みません。

windownilの場合、この関数は、選択されたウィンドウを使用し ます。

 
(window-width)
     ⇒ 80
Function: window-edges &optional window

この関数は、windowの角の座標のリストを返します。windownilの場合、選択されたウィンドウが使用されます。

そのリストの順序は(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)topleftは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 ] [ >> ]         [Top] [Contents] [Index] [ ? ]

25.14 ウィンドウのサイズの変更

ウィンドウ・サイズ関数は、ウィンドウのサイズを変更する高水準コマンドと、 ウィンドウ・サイズを入手する低水準関数の二種類に分けられます。Emacsは、 ウィンドウのオーバーラップやウィンドウ間のギャップを許していないため、あ るウィンドウのリサイズは、他のウィンドウに影響を与えます。

Command: enlarge-window size &optional horizontal

この関数は、選択されたウィンドウをsize行高くし、隣接するウィンドウ から行を奪います。まず、一つのウィンドウからそのウィンドウが使い果たされ るまで行を取り、その後別のウィンドウから取ります。もし、行が奪われる側の ウィンドウがwindow-min-height行未満に縮むと、そのウィンドウは消え てしまいます。

horizontalが非nilの場合、この関数は、行ではなく桁を奪いなが らwindowsize桁だけ横に広げます。もし、桁が奪われる側のウィ ンドウがwindow-min-width桁未満に縮むと、そのウィンドウは消えてし まいます。

要求されたサイズがそのウィンドウのフレームからはみ出す場合、この関数は、 そのウィンドウがフレームの高さ(あるいは幅)全体を占有するようにします。

sizeが負の場合、この関数は、ウィンドウを-size行あるい は-size桁だけ縮めます。これによってウィンドウが最小サイズ (window-min-heightwindow-min-width)よりも小さくなる場合、 enlarge-windowはそのウィンドウを消去します。

enlarge-widnownilを返します。

Command: enlarge-window-horizontally columns

この関数は、選択されたウィンドウをcolumnsだけ横に広げます。これは 以下のように定義されます:

 
(defun enlarge-window-horizontally (columns)
  (enlarge-window columns t))
Command: shrink-window size &optional horizontal

この関数は、enlarge-windowに似ていますが、他のウィンドウに行(ある いは桁)を譲ることによって選択されたウィンドウを小さくし、引数size 分を打ち消します。そのウィンドウは、window-min-heightwindow-min-width未満に縮むと消えてしまいます。

sizeが負の場合、そのウィンドウは、-size行あるいは -size桁だけ広げられます。

Command: shrink-window-horizontally columns

この関数は、選択されたウィンドウをcolumnsだけ狭くします。これは以 下のように定義されます:

 
(defun shrink-window-horizontally (columns)
  (shrink-window columns t))

以下の二つの変数は、ウィンドウ・サイズ変更関数(window-size-changing functions)に、最小の高さと幅を強要します。

User Option: window-min-height

この変数の値は、ウィンドウが自動的に消去されるまでにその高さがどのくらい 低くなるかを決定します。ウィンドウをwindow-min-heightよりも小さく すると、自動的に消去され、これよりも低い高さのウィンドウを生成することは できません。絶対的な最低高は2です(モード行のための1行と、バッファ表示の ための1行が許されます)。この値が2よりも小さい場合、ウィンドウサイズを変 更する動作は、この変数を2にリセットします。デフォルト値は4です。

User Option: window-min-width

この変数の値は、ウィンドウが自動的に消去されるまでにどのくらい狭くなるか を決定します。ウィンドウをwindow-min-widthよりも小さくすると、自 動的に消去され、これよりも狭いウィンドウを生成することはできません。絶対 的な最小幅は1です。これ未満の値は無視されます。デフォルト値は10です。

Variable: window-size-change-functions

この変数は、何らかの理由でいずれかのウィンドウのサイズが変わる際に呼ばれ る、関数のリストを保持します。この関数群は再表示のたびに一度だけ呼ばれ、 またフレームのサイズ変更が生じた際にもその各フレームに対して一度だけ呼ば れます。

各関数は、単独の引数としてそのフレームを受け取ります。どのウィンドウのサ イズが、あるいは厳密にどのように変更されたのかを見つけ出す直接的な方法は ありません。しかしながら、あなたのサイズ変更関数(size-change function)が、 あなたが関心があるウィンドウを各変更のたびに追跡すれば、古いサイズ情報を 新しいもの比較することによって、何が変更されたのかを割り出すことができま す。

ウィンドウの生成や消去はサイズの変更とみなし、したがってこれらの関数の呼 出しを引き起こします。フレーム・サイズの変更も既存のウィンドウのサイズを 変更するため、同様にみなされます。

これらの関数の内部で、save-window-excursionを使用するのはよくあり ません。なぜなら、それは常にサイズの変更とみなされ、これらの関数が繰り返 し呼び出されてしまうからです。多くの場合、ここで必要とされているのは save-selected-windowでしょう。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

25.15 座標とウィンドウ

この節では、画面の座標とウィンドウが、どのように関連しているのかを述べま す。

Function: window-at x y &optional frame

この関数は、フレームframeにおいて、指定されたカーソル位置を含んで いるウィンドウを返します。座標xyは文字数で計られ、そのフレー ムの左上角から数えられます。それらがもしフレームの範囲外なら、 window-atnilを返します。

frameを省略した場合、選択されたフレームが使用されます。

Function: coordinates-in-window-p coordinates window

この関数は、フレーム内の特定の位置が、ウィンドウwindowの範囲内か否 かを調べます。

引数coordinatesは、この形式のコンスセルです:

 
(x . y)

座標xyは文字数で計られ、画面あるいはフレームの左上角から数 えられます。

その座標がwindowの内側なら、coordinates-in-window-pの値は非 nilとなります。その値はまた、その位置が、ウィンドウのどの部分にあ たるのかを以下のように示します:

(relx . rely)

その座標は、windowの内側にあります。数字relxrelyは、 指定された位置をそのウィンドウの左上角にあたる0から数えた、ウィンドウ相 対座標(window-relative coordinates)と等価です。

mode-line

その座標は、windowのモード行の上にあります。

vertical-split

その座標は、windowとその右側に隣接するウィンドウとの間の、垂直線の 上にあります。この値は、そのウィンドウがスクロール・バーをもたないときに のみあり得ます。スクロール・バー上の位置は、そのウィンドウの外側と考えら れるためです。

nil

その座標は、windowのいずれの部分にもあたりません。

関数coordinates-in-window-pは、常に、windowがあるフレームを 使用するため、引数としてはフレームを要求しません。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

25.16 ウィンドウ構成

ウィンドウ構成(window configuration)は、フレーム全体の配置(全ウィ ンドウ、それらのサイズ、それらがどのバッファを含んでいるか、各バッファの 表示されている部分、そしてポイントとマークの値)を記録します。以前に保存 されたウィンドウ構成を復元することによって、以前の配置全体を回復させるこ とができます。

ただ一つのフレームだけでなく、すべてのフレームについて記録したい場合は、 ウィンドウ構成の代わりにフレーム構成を使用します。See section フレーム構成

Function: current-window-configuration

この関数は、Emacsの現在のウィンドウ構成(すなわちウィンドウの数、それらの サイズとカレント・バッファ、どのウィンドウが選択されたウィンドウか、各ウィ ンドウにおいて表示されているバッファ、表示開始位置、そしてポイントとマー クの位置)を表現する、新たなオブジェクト返します。カレント・バッファ内の ポイントについては例外で、その値は保存されません。

Function: set-window-configuration configuration

この関数は、Emacsのウィンドウとバッファの構成を、configurationによっ て指定された状態に復元します。引数configurationは、以前に 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)))
Special Form: save-window-excursion forms…

この特殊形式は、ウィンドウ構成を記録してformsを次々に実行した後、 はじめのウィンドウ構成を復元します。そのウィンドウ構成には、ポイント値と バッファの可視の部分が含まれます。また、選択されたウィンドウも含まれます。 しかしながら、カレント・バッファ内のポイント値は含まれません。これを保護 したい場合は、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
     ;; ここで再び画面が分割されます。
Function: window-configuration-p object

この関数は、objectがウィンドウ構成であればtを返します。

ウィンドウ構成の内部を見るためのプリミティブは、理にかなってはいますが、 実装はされていません。それらが、実装に値するほど十分便利かどうかが明らか ではないのです。


[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

This document was generated by Yasutaka SHINDOH on September, 29 2006 using texi2html 1.76.