[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端]

27. ウィンドウ

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=elisp21&node=Windows"
"texi/elisp21/ウィンドウ"へのコメント(無し)

本章では、Emacsのウィンドウに関したほとんどの関数と変数について述べます。 ウィンドウにどのようにテキストが表示されるかに関しては、 37. Emacsの画面表示を参照してください。



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端]

27.1 Emacsウィンドウの基本概念

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=elisp21&node=Basic%20Windows"
"texi/elisp21/Emacsウィンドウの基本概念"へのコメント(無し)

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の画面表示

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



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端]

27.2 ウィンドウの分割

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=elisp21&node=Splitting%20Windows"
"texi/elisp21/ウィンドウの分割"へのコメント(無し)

ここで述べる関数は、ウィンドウを2つに分割するための基本関数です。 上位レベルの2つの関数、pop-to-bufferdisplay-bufferも ウィンドウを分割しますが、 つねに分割するとは限りません(see 節 27.7 ウィンドウへのバッファの表示)。

ここに述べる関数は、引数にはバッファを受け付けません。 分割されたウィンドウの2つの『部分』には、分割前に表示されていたのと 同じバッファが始めは表示されます。

コマンド: split-window &optional window size horizontal
この関数はwindowを2つのウィンドウに分割する。 もとのウィンドウwindowは、選択されているウィンドウであり続けるが、 以前のスクリーン領域の一部を占めるだけである。 残りの部分は新たに作成されたウィンドウが占め、 そのウィンドウがこの関数の値として返される。

horizontalnil以外であると、windowは左右に分かれる。 もとのウィンドウwindowは左端のsizeコラムに留まり、 残りのコラムは新たなウィンドウに与えられる。 さもなければ、ウィンドウは上下に分かれ、 windowは上側のsize行に留まり、 残りの行は新たなウィンドウに与えられる。 したがって、もとのウィンドウは左側か上側にあり、 新たなウィンドウは右側か下側にある。

windowを省略したりnilであると、 選択されているウィンドウを分割する。 sizeを省略したりnilであると、 windowを均等に分ける。 (余分な行は新たなウィンドウに与える。) split-windowが対話的に呼び出されると、 すべての引数はnilである。

つぎの例では、50行×80コラムのスクリーン上の1つのウィンドウを分割する。

 
(setq w (selected-window))
     => #
(window-edges)          ; 順に
     => (0 0 80 50)     ;   左端--上端--右端--下端

;; 作成したウィンドウを返す
(setq w2 (split-window w 15))
     => #
(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-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 節 Scroll Bars)か 文字`|'で表す。 表示テーブルで境界に別の文字を指定できる。 37.14 表示テーブルを参照。

コマンド: split-window-vertically size
この関数は、選択されているウィンドウを上下に2つに分割する。 上側が選択されているウィンドウのままで、size行の大きさになる。 (sizeが負であると、下側のウィンドウが- size行になり、 上側のウィンドウは残りになる。 しかし、それでも上側が選択されているウィンドウである。)

この関数は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-horizontally size
この関数は、選択されているウィンドウを左右に2つに分割し、 選択されているウィンドウには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
この関数は、ウィンドウがたった1つしかなければnil以外を返す。 引数no-mininil以外であると、 ミニバッファが活性であってもそれを数えないことを意味する。 さもなければ、ミニバッファが活性であればそれも総ウィンドウ個数に数えて 1と比較する。

引数all-framesは、どのフレームを対象にするかを指定する。 指定できる値とその意味はつぎのとおりである。

nil
選択されているフレームのウィンドウに加えて、 ミニバッファがどこに置かれていようと 当該フレームが使っているミニバッファを数える。

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

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

0
すべての可視フレームやアイコンになっているフレームの すべてのウィンドウを数える。

その他
選択されているフレームだけでウィンドウを正確に数える。



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端]

27.3 ウィンドウの削除

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=elisp21&node=Deleting%20Windows"
"texi/elisp21/ウィンドウの削除"へのコメント(無し)

ウィンドウを削除するある種の関数を呼び出して ウィンドウを削除しない限り、 ウィンドウはそのフレームに表示され続けます。 削除されたウィンドウがスクリーンに現れることはありませんが、 それを参照するものがある限りLispオブジェクトととしては 存在し続けます。 保存したウィンドウ構成(see 節 27.16 ウィンドウ構成)を復元する以外には、 ウィンドウの削除は取り消せません。 ウィンドウ構成を復元すると、 その構成に含まれないウィンドウはすべて削除されます。

ウィンドウを削除すると、それが使っていた場所は 近接する兄弟ウィンドウの1つに与えられます。

Function: window-live-p window
この関数は、windowが削除されているとnilを返し、 さもなければtを返す。

警告: 削除されたウィンドウを正しいものとして使うと、 誤った情報や重大なエラーを引き起こす。

コマンド: delete-window &optional window
この関数は、ディスプレイからwindowを取りさり、nilを返す。 windowを省略すると、選択されているウィンドウを削除する。 delete-windowを呼び出したときにたった1つのウィンドウしかないと エラーを通知する。

コマンド: delete-other-windows &optional window
この関数は、windowのフレームにある他のウィンドウを削除して windowを当該フレームで唯一のウィンドウにする。 windowを省略したりnilであると、 選択されているウィンドウをデフォルトで使う。

これはnilを返す。

コマンド: delete-windows-on buffer &optional frame
この関数は、bufferを表示しているすべてのウィンドウを削除する。 bufferを表示しているウィンドウがなければなにもしない。

delete-windows-onはフレームを1つ1つ処理する。 フレームに異なるバッファを表示しているウィンドウが複数ある場合、 それらのうちでbufferを表示しているものを削除し、 他のものは空いた領域を埋めるために拡張される。 あるフレームのすべてのウィンドウ(たった1つのウィンドウである場合も含む) がbufferを表示している場合、当該フレームは、 other-bufferで選ばれる別のバッファを表示する 1つのウィンドウだけになる。 see 節 26.8 バッファリスト (2003/10/30)

引数frameは、どのフレームを対象にするかを指定する。 この関数は、すべてのウィンドウを走査する他の関数と同じようには frameを使わない。 特に、tnilの値の意味は他の関数とは逆である。 以下に詳細を示す。

この関数はつねにnilを返す。



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端]

27.4 ウィンドウの選択

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=elisp21&node=Selecting%20Windows"
"texi/elisp21/ウィンドウの選択"へのコメント(無し)

ウィンドウを選択すると、当該ウィンドウのバッファがカレントバッファになり、 カーソルがそのウィンドウに現れます。

Function: selected-window
この関数は、選択されているウィンドウを返す。 カーソルが表示され多くのコマンドが作用するウィンドウがそれである。

Function: select-window window
この関数は、windowを選択されているウィンドウにする。 すると、カーソルは(再表示すると)windowに現れる。 windowに表示されているバッファがただちにカレントバッファになる。

戻り値はwindowである。

 
(setq w (next-window))
(select-window w)
     => #

Macro: save-selected-window forms...
このマクロは、選択されているウィンドウを記録して、 formsを順に実行し、 もとの選択されているウィンドウに戻す。

このマクロは、ウィンドウサイズ、配置、内容に関して いっさいなにも保存したり復元しないので、 formsがそれらを変更するとその変更は持続する。

ある時点で、各フレームにはフレームの選択されているウィンドウがある。 このマクロは、選択されているウィンドウだけを保存し、 他のフレームについてはなにも保存しない。 formsが別のフレームを選択して そのフレームの選択されているウィンドウを変更すると、その変更は持続する。

以下の関数は、さまざま条件でスクリーン上のウィンドウの1つを選びます。

Function: get-lru-window &optional frame
この関数は、もっとも昔に『使われた』 (つまり選択されていた)ウィンドウを返す。 選択されているウィンドウはつねにもっとも最近に使われたウィンドウである。

ウィンドウがたった1つであると、 選択されているウィンドウが もっとも昔に使われたウィンドウであることもありうる。 新たに作成されたウィンドウは、選択されるまではもっとも昔に 使われたウィンドウになる。 ミニバッファ用ウィンドウは候補にはならない。

引数frameは、どのウィンドウを対象とするかを制御する。

Function: get-largest-window &optional frame
この関数は、もっとも大きな領域(高さ×幅)のウィンドウを返す。 左右に並んだウィンドウがなければ、 これがもっとも行数を持つウィンドウである。 ミニバッファ用ウィンドウは候補にはならない。

同じ大きさのウィンドウが2つある場合、 この関数は、選択されているウィンドウから始めて ウィンドウの巡回順序(次節参照)で最初のウィンドウを返す。

引数frameは、ウィンドウのどのような集まりを対象にするかを指定する。 うえのget-lru-windowを参照。



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端]

27.5 ウィンドウの巡回順序

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=elisp21&node=Cyclic%20Window%20Ordering"
"texi/elisp21/ウィンドウの巡回順序"へのコメント(無し)

つぎのウィンドウを選択するためにコマンドC-x oother-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 節 19. ミニバッファ。)

minibuftであると、 ミニバッファが活性でなくても巡回順序にミニバッファ用ウィンドウを含める。

minibuftでもnilでもないと、 活性であってもミニバッファ用ウィンドウを含めない。

引数all-framesは、どのフレームを対象にするかを指定する。 可能な値とその意味を以下に示す。

nil
windowのフレームのすべてのウィンドウに加えて、 ミニバッファがどこに置かれていようと 当該フレームが使っているミニバッファを対象にする。

t
既存のすべてのフレームのすべてのウィンドウを対象にする。

visible
すべての可視フレームのすべてのウィンドウを対象にする。 (結果が有用であるためには、可視フレームにwindowがあること)

0
すべての可視フレームやアイコンになっているフレームの すべてのウィンドウを対象にする。

その他
windowのフレームだけのウィンドウを正確に対象にする。

つぎの例では、2つのウィンドウがあり、 どちらもバッファ`windows.texi'を表示していると仮定する。

 
(selected-window)
     => #
(next-window (selected-window))
     => #
(next-window (next-window (selected-window)))
     => #

Function: previous-window &optional window minibuf all-frames
この関数は、ウィンドウの巡回順序においてwindowのまえの ウィンドウを返す。 他の引数は、next-windowと同様に、 どのようなウィンドウを巡回に含めるかを指定する。

コマンド: other-window count
この関数は、ウィンドウの巡回順序においてcount番目うしろの ウィンドウを選択する。 countが負であると、巡回順序において -count番目まえのウィンドウに戻る。 この関数はnilを返す。

対話的に呼び出すと、countは数値前置引数である。

Function: walk-windows proc &optional minibuf all-frames
この関数は、各ウィンドウごとに当該ウィンドウを唯一の引数として procを呼び出してすべてのウィンドウを巡る。

省略可能な引数minibufall-framesは、 走査するウィンドウの集まりを指定する。 詳しくは上記のnext-windowを参照。



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端]

27.6 バッファとウィンドウ

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=elisp21&node=Buffers%20and%20Windows"
"texi/elisp21/バッファとウィンドウ"へのコメント(無し)

本節では、ウィンドウを調べたり、 正確に制御してウィンドウにバッファを表示する低レベルの関数について述べます。 使用するウィンドウを探したりそれにバッファを指定する関連する関数については、 See 節 27.7 ウィンドウへのバッファの表示。 そこに述べた関数は本節の関数より簡単に使えますが、 それらはウィンドウを選んだり作ったりするときに発見的手法を使います。 完全に制御する必要があるときには、本節の関数を使います。

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)
     => #

Function: get-buffer-window buffer-or-name &optional all-frames
この関数は、現在buffer-or-nameを表示しているウィンドウを返す。 そのようなウィンドウがなければnilを返す。 そのようなウィンドウが複数ある場合、 ウィンドウの巡回順序において選択されているウィンドウから始めて 最初にみつかったウィンドウを返す。 see 節 27.5 ウィンドウの巡回順序

引数all-framesは、どのウィンドウを対象とするかを制御する。

Function: get-buffer-window-list buffer-or-name &optional minibuf all-frames
この関数は、現在buffer-or-nameを表示している すべてのウィンドウのリストを返す。

省略可能な2つの引数は、next-window(see 節 27.5 ウィンドウの巡回順序)の 省略可能な引数と同様に働き、 get-buffer-windowの省略可能な単一の引数と同じではないget-buffer-windowを他の関数と互換性があるように 将来変更すべきなのであろう。

引数all-framesは、どのウィンドウを対象とするかを制御する。

Variable: buffer-display-time
この変数は、バッファがウィンドウで見えるようになった最後の時刻を記録する。 この変数は各バッファでつねにバッファローカルであり、 set-window-bufferは、呼ばれるたびに 指定されたバッファのこの変数に(current-time)を設定する (see 節 39.5 時刻)。 バッファが初めて作られると、buffer-display-timeは値nilで始まる。



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端]

27.7 ウィンドウへのバッファの表示

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=elisp21&node=Displaying%20Buffers"
"texi/elisp21/ウィンドウへのバッファの表示"へのコメント(無し)

本節では、ウィンドウを自動的に選びそれに指定したバッファを表示する 便利な関数について述べます。 これらの関数は、ある状況では、既存のウィンドウを分割します。 ウィンドウを選ぶ際の発見的手法を制御する変数についても述べます。 より正確に制御するための低レベルの関数については、 See 節 27.6 バッファとウィンドウ。 これらの関数はすべてset-window-bufferを呼び出して動作します。

バッファをカレントバッファにしてLispプログラムで参照したり変更できるように するためには、本節の関数を使わないでください。 これらはその目的には強力すぎます。 ウィンドウのバッファの表示をユーザーにとっては迷惑で驚くようなものに 変更してしまうからです。 そのかわりに、ウィンドウのバッファの表示には影響せずに バッファをプログラムから参照するためにカレントバッファにする set-buffersave-current-buffer(see 節 26.2 カレントバッファ (2003/10/30))を 使います。

コマンド: switch-to-buffer buffer-or-name &optional norecord
この関数は、buffer-or-nameをカレントバッファにし、 さらに、選択されているウィンドウに当該バッファを表示する。 つまり、人間が当該バッファを見ることができるようになり、 以降のキーボードコマンドは当該バッファに適用される。 buffer-or-nameをカレントバッファにするが 選択されているウィンドウには表示しないset-bufferと比較してほしい。 see 節 26.2 カレントバッファ (2003/10/30)

buffer-or-nameが既存のバッファを指定しなければ、 その名前の新たなバッファが作成される。 新たなバッファのメジャーモードは変数default-major-modeに 従って設定される。 see 節 22.1.3 メジャーモードの選択方法

通常、指定したバッファはバッファリスト (選択されているフレームのバッファリストとフレーム独立のバッファリストの 両方)の先頭に置かれる。 これは、other-bufferの動作に影響する。 しかし、norecordnil以外であると、これを行わない。 see 節 26.8 バッファリスト (2003/10/30)

関数switch-to-bufferは、しばしば、 C-x bにバインドされて対話的に使われる。 プログラムでも多用される。 つねにnilを返す。

コマンド: switch-to-buffer-other-window buffer-or-name &optional norecord
この関数は、buffer-or-nameをカレントバッファにし、 現在選択されていないウィンドウに当該バッファを表示する。 そして当該ウィンドウを選択する。 バッファの扱い方はswitch-to-bufferと同じである。

現在選択されているウィンドウは、この処理には絶対に使わない。 それが唯一のウィンドウである場合には、この目的のために ウィンドウを分割して別のウィンドウを作る。 選択されているウィンドウがすでに当該バッファを表示している場合には、 当該ウィンドウはそのまま表示し続けるが、それにも関わらず、 表示するために別のウィンドウを探す。

この関数は、norecordnilであると、 switch-to-bufferのようにバッファリストを更新する。

Function: pop-to-buffer buffer-or-name &optional other-window norecord
この関数は、buffer-or-nameをカレントバッファにし、 以前には選択されていない別のウィンドウで当該バッファに切り替える。 そのウィンドウがそのフレームの選択されているウィンドウになる。

変数pop-up-framesnil以外であると、 pop-to-bufferは、可視フレームから 当該バッファをすでに表示しているウィンドウを探す。 そのようなウィンドウがあれば、そのウィンドウを返すとともに、 そのウィンドウをそのフレームの選択されているウィンドウにする。 そのようなウィンドウがなければ、新たなフレームを作成し それにバッファを表示する。

pop-up-framesnilであると、 pop-to-bufferは選択されているフレーム内だけで処理を行う。 (選択されているフレームがミニバッファのみであるときには、 pop-to-bufferは、ミニバッファのみでない もっとも最近に選択されたフレーム内で処理する。)

変数pop-up-windowsnil以外であると、 もとのウィンドウとは異なる新たなウィンドウを作成するために ウィンドウを分割することがある。 詳しくは、27.8 表示ウィンドウを選ぶを参照。

other-windownil以外であると、 選択されているウィンドウにbuffer-or-nameがすでに表示されていても、 pop-to-bufferは別のウィンドウを探したり作成する。 そのため、buffer-or-nameは2つのウィンドウに表示されることになる。 一方で、buffer-or-nameが選択されているウィンドウに すでに表示されていて、かつ、other-windownilであると、 選択されているウィンドウはbuffer-or-nameの表示には十分であるとみなし、 なにも行わない。

display-bufferに影響するすべての変数は、 pop-to-bufferにも影響する。 see 節 27.8 表示ウィンドウを選ぶ

buffer-or-nameが文字列であり既存のバッファを指定しない場合、 その名前のバッファを作成する。 新たなバッファのメジャーモードは変数default-major-modeに 従って設定される。 see 節 22.1.3 メジャーモードの選択方法

この関数は、norecordnilであると、 switch-to-bufferのようにバッファリストを更新する。

コマンド: replace-buffer-in-windows buffer
この関数は、bufferを表示しているすべてのウィンドウにおいて bufferを別のバッファに切り替える。 別のバッファはother-bufferで選ぶ。 この関数の普通の用途は、別のバッファがどれになるか気にしない場合である。 つまり、bufferが表示されていないことを保証したい場合である。

この関数はnilを返す。



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端]

27.8 表示ウィンドウを選ぶ

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=elisp21&node=Choosing%20Window"
"texi/elisp21/表示ウィンドウを選ぶ"へのコメント(無し)

本節では、バッファを表示するためのウィンドウを選ぶための基本的な機能、 display-bufferについて述べます。 上位レベルの関数やコマンドはすべてこのサブルーティンを使います。 ここでは、display-bufferの使い方とカスタマイズ方法を説明します。

コマンド: display-buffer buffer-or-name &optional not-this-window frame
このコマンドは、pop-to-bufferのように、 buffer-or-nameをあるウィンドウに表示するが、 そのウィンドウを選択しないので当該バッファもカレントバッファにならない。 この関数は、選択されているウィンドウを変えない。

not-this-windownil以外であると、 指定したバッファが選択されているウィンドウにすでに表示されていても、 別のウィンドウに当該バッファを表示することを意味する。 これにより、当該バッファが同時に2つのウィンドウに表示される。 さもなければ、buffer-or-nameがウィンドウにすでに表示されていると、 それで十分とみなしこの関数はなにもしない。

display-bufferは、buffer-or-nameを表示するために 選んだウィンドウを返す。

引数framenil以外であると、 バッファがすでに表示されているかどうかを検査するときに どのフレームを対象とするかを指定する。 それらのフレームのどれかのウィンドウに当該バッファがすでに表示されていると、 display-bufferは単にそのウィンドウを返す。 frameの可能な値はつぎのとおりである。

display-bufferがウィンドウを作成したり探す詳しい手順は、 以下に述べる変数に依存する。

User Option: pop-up-windows
この変数は、display-bufferが新たにウィンドウを作るかどうかを制御する。 nil以外であり、かつ、ウィンドウがたった1つである場合、 そのウィンドウを分割する。 nilであると、display-bufferは 単一のウィンドウを分割せずにそれ全体を使う。

User Option: split-height-threshold
この変数は、ウィンドウが複数ある場合に display-bufferがどの時点でウィンドウを分割するかを決定する。 display-bufferは、最大ウィンドウの行数が この変数による指定行数より大きければ、最大ウィンドウをつねに分割する。 最大ウィンドウがこれだけ大きくない場合には、 それが唯一のウィンドウであり、かつ、pop-up-windowsnil以外 の場合にのみ最大ウィンドウを分割する。

User Option: pop-up-frames
この変数は、display-bufferが新たなフレームを作るかどうかを制御する。 nil以外であると、display-bufferは、 すべての可視フレームから指定されたバッファをすでに表示している 既存のウィンドウを探す。 そのようなウィンドウがあれば、そのウィンドウを返す。 さもなければ、新たなフレームを作る。 変数pop-up-framesnil以外であると、 変数pop-up-windowssplit-height-thresholdは影響しない。

pop-up-framesnilであると、 display-bufferはウィンドウを分割するか再利用する。

詳しくは、see 節 28. フレーム

Variable: pop-up-frame-function
この変数は、pop-up-framesnil以外であるときに どのように新たなフレームを作るかを指定する。

その値は引数なしの関数であること。 display-bufferが新たにフレームを作るとき、 フレームを返すこの関数を呼び出す。 この変数のデフォルト値は、 pop-up-frame-alistのパラメータを使って新たなフレームを作る関数である。

Variable: pop-up-frame-alist
この変数は、display-bufferが新たにフレームを作るときに 使用するフレームパラメータを指定する連想リストを保持する。 フレームパラメータに関して詳しくは、 see 節 28.3 フレームパラメータ

User Option: special-display-buffer-names
特別に表示すべきバッファのバッファ名のリスト。 バッファ名がこのリストにあると、 display-bufferは当該バッファを特別に扱う。

デフォルトでは、特別に表示するとは、 専用のフレームにバッファを表示することである。

リストの要素が文字列でなくリストであると、 リストのCARがバッファ名であり、 リストの残りはフレームの作成方法を指定する。 それは、フレームパラメータを指定する連想リストであるか、 関数とそれに渡す引数である。 (関数の第1引数はつねに表示すべきバッファである。 そのあとにリスト内の引数が続く。)

User Option: 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がフレームを作るときに 使用するフレームパラメータを保持する。

User Option: same-window-buffer-names
選択されているウィンドウに表示すべきバッファのバッファ名のリスト。 バッファ名がこのリストにあると、 display-bufferは選択されているウィンドウで当該バッファに切り替える。

User Option: same-window-regexps
選択されているウィンドウに表示すべきバッファを指定する正規表現のリスト。 バッファ名がこのリストのいずれかの正規表現に一致すると、 display-bufferは選択されているウィンドウで当該バッファに切り替える。

Variable: display-buffer-function
この変数は、display-bufferのふるまいをカスタマイズする もっとも柔軟な方法である。 nil以外であると、display-bufferが処理を依頼するために 呼び出す関数であること。 その関数は、display-bufferが受け取るのと同じ2つの引数を受け付けること。 その関数は、ウィンドウを選ぶか作成し、指定されたバッファを表示し、 当該ウィンドウを返すこと。

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

ウィンドウにはそのバッファ『専用』と印を付けられます。 そうすると、display-bufferは他のバッファを表示するために 当該ウィンドウを使わないようにします。

Function: window-dedicated-p window
この関数は、windowに専用と印が付いていればtを返し、 さもなければnilを返す。

Function: set-window-dedicated-p window flag
この関数は、flagnil以外であるとwindowに専用の印を付け、 さもなければ専用の印を消す。



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端]

27.9 ウィンドウとポイント

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=elisp21&node=Window%20Point"
"texi/elisp21/ウィンドウとポイント"へのコメント(無し)

各ウィンドウには、同じバッファを表示している 別のウィンドウのポイントの値とは独立な独自のポイントの値があります。 これにより、あるバッファを複数のウィンドウに表示しても有用なのです。

ユーザーにとっては、ポイントとはカーソルが置かれた箇所であり、 別のバッファに切り替えるとそのバッファのポイント位置に カーソルが移動します。

Function: window-point window
この関数は、windowの現在のポイント位置を返す。 選択されていないウィンドウでは、 当該ウィンドウを選択したときになるであろう (ウィンドウのバッファの)ポイント値である。

windowが選択されているウィンドウであり、かつ、 そのバッファがカレントバッファであれば、 戻り値は当該バッファのポイントと同じである。

厳密にいえば、すべてのフォームsave-excursionの外側での 『トップレベル』のポイントの値を返すほうがより正確である。 しかし、そのような値を探すのは困難である。

Function: set-window-point window position
この関数は、windowのバッファ内の位置positionwindowのポイント位置とする。



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端]

27.10 ウィンドウの開始位置

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=elisp21&node=Window%20Start"
"texi/elisp21/ウィンドウの開始位置"へのコメント(無し)

各ウィンドウには、バッファのどの箇所から表示を始めるかを指定する バッファ内位置を追跡するために使うマーカがあります。 この位置をウィンドウの表示開始(display-start)位置 (あるいは単に開始(start)位置)と呼びます。 この位置の直後にある文字が、ウィンドウの左上隅に現れます。 この位置は、通常、テキスト行の先頭にありますが、必須ではありません。

Function: window-start &optional window
この関数は、ウィンドウwindowの表示開始位置を返す。 windownilであると、 選択されているウィンドウを使う。 たとえばつぎのとおりである。

 
(window-start)
     => 7058

新たにウィンドウを作成したり異なるバッファをウィンドウに表示すると、 表示開始位置は、当該バッファの最近に使われた表示開始位置になるか、 バッファに表示開始位置がなければ1になる。

再表示するとウィンドウ開始位置は (それ以前の再表示で明示的に位置を指定していなければ)、 ポイントがスクリーンに現れるように更新される。 再表示以外には、ウィンドウ開始位置を自動的に変更しない。 ポイントを移動しても、つぎの再表示までは、 連動してウィンドウ開始位置が変更されると期待しないこと。

window-startを使った実際的な例は、 29.2.4 テキスト行単位の移動count-linesの記述を参照。

Function: window-end &optional window update
この関数は、ウィンドウwindowの表示の末尾の位置を返す。 windownilであると、選択されているウィンドウを使う。

バッファのテキストを変更したりポイントを移動しただけでは、 window-endが返す値は更新されない。 この値は、Emacsが再表示を実行し途中で止めることなく 最後まで終了した場合にのみ更新される。

windowの最後の再表示が途中で止められて完了していないと、 当該ウィンドウの表示の末尾の位置はEmacsにはわからない。

updatenil以外であると、 window-endはウィンドウの末尾の更新値をつねに返す。 保存しておいた値が正しければwindow-endはそれを返す。 さもなければ、バッファのテキストを走査して正しい値を計算する。

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 ----------

noforcenil以外であって positionにするとつぎの再表示時にポイントがスクリーンからはみ出す 場合には、再表示ではポイントが収まるように新たなウィンドウ開始位置を 計算し、positionを使わない。

Function: pos-visible-in-window-p &optional position window
この関数は、window内の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-ptを返す。 see 節 27.12 水平スクロール



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端]

27.11 垂直スクロール

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=elisp21&node=Vertical%20Scrolling"
"texi/elisp21/垂直スクロール"へのコメント(無し)

垂直スクロールとは、ウィンドウ内のテキストを上向きや下向きに動かすことです。 ウィンドウの表示開始位置の値を変更することで動作します。 ポイントがスクリーン内に留まるようにwindow-pointの 値を変更することもあります。

コマンドscroll-upscroll-downの 方向を示す『up』(上向き)と『down』(下向き)は、 ウィンドウを見ているときのバッファ内のテキストの移動方向を表します。 テキストは縦に長い紙に(横書きで)書いてあり、 スクロールコマンドはその紙を上下に動かすと想像してください。 したがって、バッファの中ほどのテキストを見ているときに scroll-downを繰り返し呼び出すと、 最終的にはバッファの先頭を見ることになります。

逆の慣習の名前を使うべきだと主張する人々もいます。 彼らは、固定されたテキストのうえをウィンドウが動いていると想像するのです。 すると、『下向き』のコマンドはバッファの末尾に移動することになります。 この見方は、ウィンドウとバッファ内のテキストとの実際の関係に よく適合しているのですが、ユーザーはそのように考えないようです。 端末上ではウィンドウは動きませんし、スクロールコマンドは 明らかにテキストをスクリーン上で上下に動かしています。 ユーザーの視点に合う名称を選んだのです。

カレントバッファと選択されているウィンドウに 表示されているバッファとが異なる場合には、 (scroll-other-window以外の)スクロール関数の結果は予測できません。 See 節 26.2 カレントバッファ (2003/10/30)

コマンド: scroll-up &optional count
この関数は、選択されているウィンドウのテキストを 上向きにcount行だけスクロールする。 countが負であると、実際のスクロール方向は下向きである。

countnil(あるいは省略)であると、 スクロール量は、ウィンドウの(モード行を数えない)利用可能な高さより next-screen-context-linesだけ少なくなる。

scroll-upnilを返す。

コマンド: scroll-down &optional count
この関数は、選択されているウィンドウのテキストを 下向きにcount行だけスクロールする。 countが負であると、実際のスクロール方向は上向きである。

countnil(あるいは省略)であると、 スクロール量は、ウィンドウの(モード行を数えない)利用可能な高さより next-screen-context-linesだけ少なくなる。

scroll-downnilを返す。

コマンド: scroll-other-window &optional count
この関数は、別のウィンドウのテキストを上向きに count行だけスクロールする。 countの値が負であったりnilであると、 scroll-upと同様に扱う。

変数other-window-scroll-bufferで、スクロールするバッファを指定できる。 選択されているウィンドウがミニバッファ用であるときには、 つぎのウィンドウは、通常、もっとも左上隅にあるウィンドウである。 変数minibuffer-scroll-windowで、 スクロールする別のウィンドウを指定できる。 別のウィンドウが選択されている場合には、この変数の効果はない。 see 節 19.9 ミニバッファに関するその他

ミニバッファが活性であると、 右下隅のウィンドウが選択されているウィンドウであるときには、 つぎのウィンドウはミニバッファ用ウィンドウである。 この場合、scroll-other-windowはミニバッファをスクロールしようとする。 ミニバッファにたった1行しか入っていなければスクロールできず、 エコー領域に『Beginning of buffer』と短時間表示されたあとで、 ミニバッファの行が再度現れる。

Variable: other-window-scroll-buffer
この変数がnil以外であると、 scroll-other-windowがスクロールするバッファを指定する。

User Option: scroll-margin
このオプションは、スクロール時の余白の大きさ、 つまり、ポイントとウィンドウの上端や下端とのあいだにある最低行数を指定する。 ウィンドウの上端や下端からこの行数以内にポイントが移動するたびに、 (可能ならば)ウィンドウを自動的にスクロールして、 ポイントを余白の外側でウィンドウの中央近くに移動する。

User Option: scroll-conservatively
この変数は、ポイントがスクリーンからはみ出したとき (あるいはスクロール時の余白に入ったとき)に どのように自動的にスクロールするかを制御する。 値が0であると、ウィンドウの縦方向でポイントが中央にくるように テキストをスクロールして再表示する。 値が正の整数nであると、 ウィンドウをどちらかの方向に最大n行だけスクロールすると ポイントが見えるようになるときには、そのようにスクロールして再表示する。 さもなければ、ポイントが中央にくるようにする。 デフォルト値は0である。

User Option: scroll-step
この変数は、scroll-conservativelyの古い変種である。 違いは、値がnであると正確にn行だけのスクロールを許すことである。 この機能はscroll-marginでは働かない。 デフォルト値は0である。

User Option: scroll-preserve-screen-position
このオプションがnil以外であると、 スクロール関数は、可能ならばカーソルの垂直方向の位置を 変えないようにポイントを移動する。

User Option: next-screen-context-lines
この変数の値は、1画面分スクロールしたときに連続して残っている行数である。 たとえば、引数nilscroll-upは、 ウィンドウの下端にあるこの行数だけの行が上端にくるようにスクロールする。 デフォルト値は2である。

コマンド: recenter &optional count
この関数は、選択されているウィンドウをスクロールして ポイント位置にあるテキストがウィンドウ内の垂直方向の指定位置にくるようにする。

countが非負の数であると、ポイント位置にある行を ウィンドウの上端からcount行下にくるようにする。 countが負の数であると、ウィンドウの下端から数え、 -1はウィンドウの使用可能な最後の行を表す。 countnil以外のリストであると、 ウィンドウの中央の行を表す。

countnilであると、recenterは、 ポイント位置にある行がウィンドウの中央にくるようにして、 選択されているフレーム全体をクリアして再表示する。

recenterが対話的に呼び出されると、countは生の前置引数である。 したがって、前置引数としてC-uと打つと countnil以外のリストになり、 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 ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端]

27.12 水平スクロール

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=elisp21&node=Horizontal%20Scrolling"
"texi/elisp21/水平スクロール"へのコメント(無し)

英文は『内側のループ』では左から右へ『外側のループ』では上から下へと読むので、 水平スクロールは垂直スクロールには似ていません。 垂直スクロールでは表示するテキストの連続部分を選びますが、 水平スクロールでは各行の一部がスクリーンからはみ出すことになります。 そのため、水平スクロールの量は、バッファ内の位置ではなく、 コラム数で指定します。 これは、window-startが返す表示開始位置とはなんの関係もありません。

通常、水平スクロールは行われません。 つまり、左端のコラムはウィンドウの左端にあります。 この状態で右向きにスクロールしても、 それによって見えてくるスクリーンの左側にはなにもないので意味がありません。 ですから、これは禁止されます。 左向きへのスクロールは許されて、 テキストの先頭コラムはウィンドウの端からはみ出し、 それまで切り詰められていた右側のコラムが見えるようになります。 左向きの水平スクロール量が0でなければ、 右向きへスクロールして戻せますが、 これは全体としての水平スクロール量が0になるまでです。 左向きスクロールの限界はありませんが、 最終的にはテキストすべてが左端からはみ出してしまいます。

コマンド: scroll-left count
この関数は、選択されているウィンドウをcountコラムだけ 左向きに(countが負ならば右向きに)スクロールする。 戻り値は、変更後の左向き水平スクロール量の総量であり、 window-hscroll(下記参照)が返す値と同じである。

コマンド: 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のスクロールされている左端からのコラム数を columnsの値とする。 引数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 ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端]

27.13 ウィンドウサイズ

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=elisp21&node=Size%20of%20Window"
"texi/elisp21/ウィンドウサイズ"へのコメント(無し)

Emacsのウィンドウは矩形であり、そのサイズ情報は 高さ(行数)と幅(各行の文字数)から成ります。 モード行は高さに含みます。 しかし、スクロールバーや左右のウィンドウを隔てる文字`|'のコラムは 幅には含みません。

つぎの3つの関数は、ウィンドウのサイズ情報を返します。

Function: window-height &optional window
この関数は、モード行を含むwindowの行数を返す。 windowがフレーム全体を占める場合、この値は典型的には、 当該フレームにおけるframe-heightの値より1小さい (最後の行はミニバッファ用につねに確保してあるため)。

windownilであると、この関数は選択されているウィンドウを使う。

 
(window-height)
     => 23
(split-window-vertically)
     => #
(window-height)
     => 11

Function: window-width &optional window
この関数は、windowのコラム数を返す。 windowがフレーム全体を占める場合、この値は、 当該フレームにおけるframe-widthの値と同じである。 この幅には、ウィンドウのスクロールバーや 左右のウィンドウを隔てる文字`|'のコラムは含まない。

windownilであると、この関数は選択されているウィンドウを使う。

 
(window-width)
     => 80

Function: window-edges &optional window
この関数は、windowの四隅の座標から成るリストを返す。 windownilであると、選択されているウィンドウを使う。

list内の順番は(left top right bottom) (つまり、左端、上端、右端、下端)であり、 フレームの左上隅を0としてすべての要素は0を基準とする。 要素rightwindowが使用する右端のコラムより1大きく、 bottomwindowが使用する下端より1大きく モード行と同じである。

左右に隣り合ったウィンドウがある場合、 右隣にウィンドウがあるウィンドウの右端の値には、 ウィンドウを隔てる区切りの幅が含まれる。 この区切りは、文字`|'のコラムであるかスクロールバーである。 ウィンドウの幅にはこの区切りは含まないため、 この場合、左端と右端の差は幅に等しくない。

典型的な24行の端末でウィンドウが1つの場合に得られる結果を示す。

 
(window-edges (selected-window))
     => (0 0 80 23)

下端が23行目であるのは、最下行はエコー領域だからである。

windowがフレームの左上隅にあると、 bottom(window-height)の値に等しく、 right(window-width)の値にほぼ等しく (9)、 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 ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端]

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

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=elisp21&node=Resizing%20Windows"
"texi/elisp21/ウィンドウサイズの変更"へのコメント(無し)

ウィンドウサイズ関数は2つに大別できます。 ウィンドウサイズを変える上位レベルのコマンドと ウィンドウサイズを調べる下位レベルの関数です。 Emacsでは重なり合ったウィンドウやウィンドウのあいだに隙間を許さないので、 1つのウィンドウの大きさを変えると別のウィンドウにも影響します。

コマンド: enlarge-window size &optional horizontal
この関数は、隣り合うウィンドウから場所を奪って、 選択されているウィンドウをsize行高くする。 1つのウィンドウから場所を奪い取り、奪い尽くすと別のウィンドウから取る。 場所を奪われたウィンドウがwindow-min-height行未満になると、 そのウィンドウは消える。

horizontalnil以外であると、 この関数は、隣り合うウィンドウから場所を奪って、 選択されているウィンドウをsizeコラム広くする。 場所を奪われたウィンドウがwindow-min-widthコラム未満になると、 そのウィンドウは消える。

指定した大きさがウィンドウのフレームの大きさを超える場合、 この関数は、ウィンドウがフレームの高さ(あるいは幅)全体を占めるようにする。

sizeが負であると、この関数は-size行/コラムだけ ウィンドウを縮める。 ウィンドウが(window-min-heightwindow-min-widthの) 最小サイズより小さくなると、enlarge-windowは 当該ウィンドウを削除する。

enlarge-windownilを返す。

コマンド: enlarge-window-horizontally columns
この関数は、選択されているウィンドウをcolumnsコラム広くする。

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

コマンド: shrink-window size &optional horizontal
この関数はenlarge-windowに似ているが引数sizeの符号を変えて、 選択されているウィンドウを縮めて指定行数(コラム数)を 他のウィンドウに与える。 ウィンドウがwindow-min-heightwindow-min-width未満に縮むと、 そのウィンドウは消える。

sizeが負であると、ウィンドウは -size行/コラムだけ伸びる。

コマンド: shrink-window-horizontally columns
この関数は、選択されているウィンドウをcolumnsコラム狭くする。 つぎのように定義できる。

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

コマンド: shrink-window-if-larger-than-buffer window
このコマンドは、バッファの全内容を表示するに十分なだけの大きさに windowを縮めるが、window-min-height行未満にはしない。

しかし、バッファの全テキストを表示するにはウィンドウが小さすぎる場合や、 内容の一部がスクロールでスクリーンからはみ出している場合や、 ウィンドウの幅がフレームの幅と同じでない場合や、 ウィンドウがフレームの唯一のウィンドウである場合には、 このコマンドはなにもしない。

つぎの2つの変数は、ウィンドウサイズを変える関数に最小の高さと幅を課します。

User Option: window-min-height
この変数の値は、ウィンドウが自動的に削除されるまでに どの程度までウィンドウが短くなりうるかを決定する。 ウィンドウをwindow-min-height行未満に小さくすると自動的に削除され、 これより短いウィンドウは作成できない。 絶対的な最小の高さは2行(モード行に1行、バッファの表示に1行)である。 ウィンドウサイズを変える処理では、この変数が2未満であると2に設定し直す。 デフォルト値は4である。

User Option: window-min-width
この変数の値は、ウィンドウが自動的に削除されるまでに どの程度までウィンドウが狭くなりうるかを決定する。 ウィンドウをwindow-min-widthコラム未満に小さくすると自動的に削除され、 これより狭いウィンドウは作成できない。 絶対的な最小の幅は1であり、それ未満は無視する。 デフォルト値は10である。



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端]

27.15 座標とウィンドウ

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=elisp21&node=Coordinates%20and%20Windows"
"texi/elisp21/座標とウィンドウ"へのコメント(無し)

本節では、スクリーン座標をウィンドウに関連付ける方法を述べます。

Function: window-at x y &optional frame
この関数は、フレームframeにおいて指定したカーソル位置を含んでいる ウィンドウを返す。 座標xyは、フレームの左上隅から文字単位で数える。 座標が範囲外であるとwindow-atnilを返す。

frameを省略すると、選択されているフレームを使う。

Function: coordinates-in-window-p coordinates window
この関数は、指定したフレーム位置がウィンドウwindowの中に 入るかどうかを検査する。

引数coordinatesは、(x . y)の形のコンスセルである。 座標xyは、スクリーンやフレームの左上隅から文字単位で数える。

coordinates-in-window-pが返す値がnil以外であると、 当該座標はwindowの内側にある。 つぎのように、この値はウィンドウ内での位置も表す。

(relx . rely)
当該座標はwindowの内側である。 数relxrelyは、指定位置に対応するウィンドウ相対の座標であり、 ウィンドウの左上隅を0として数えたものである。

mode-line
当該座標はwindowのモード行の内側である。

vertical-split
当該座標はwindowと右隣のウィンドウのあいだの垂直行である。 ウィンドウにスクロールバーがない場合に限って、この値になる。 スクロールバーはウィンドウの外側であるとみなす。

nil
当該座標はwindowのどこでもない。

関数coordinates-in-window-pは、 windowのフレームをつねに使うため、引数にフレームを必要としない。



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端]

27.16 ウィンドウ構成

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=elisp21&node=Window%20Configurations"
"texi/elisp21/ウィンドウ構成"へのコメント(無し)

ウィンドウ構成(window configuration)は、 1つのフレームの全体の配置、つまり、 すべてのウィンドウ、それらの大きさ、表示しているバッファ、 各バッファの表示位置、ポイントとマークの値を記録します。 保存しておいたウィンドウ構成を復元すれば、 まえとまったく同じ配置に戻せます。

1つのフレームではなくすべてのフレームを記録するには、 ウィンドウ構成のかわりにフレーム構成を使います。 See 節 28.12 フレーム構成

Function: current-window-configuration
この関数は、選択されているフレームの現在のウィンドウ構成を表す 新たなオブジェクトを返す。 ウィンドウ構成には、ウィンドウの個数、それらの大きさとカレントバッファ、 どのウィンドウが選択されているウィンドウであるか、 各ウィンドウが表示しているバッファ、表示開始位置、 ポイントとマークの位置が含まれる。 window-min-heightwindow-min-widthminibuffer-scroll-windowの値も含む。 例外はカレントバッファのポイントであり、その値は保存されない。

Function: set-window-configuration configuration
この関数は、configurationで指定される ウィンドウとバッファの構成に復元する。 引数configurationは、 current-window-configurationが返した値であること。 configurationを作成したフレームにおいて、 そのフレームが選択されているかどうかに関わらず、この構成を復元する。 set-window-configurationは、新たな構成が古いものと 実際に異なるのかどうか識別する方法を知らないため、 ウィンドウサイズの変更とつねにみなして window-size-change-functions(see 節 27.17 ウィンドウのスクロールとサイズ変更向けのフック)の 実行を引き起こす。

configurationを保存したフレームがなくなっていると、 この関数は、3つの変数、window-min-heightwindow-min-widthminibuffer-scroll-windowを 復元するだけである。

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)
     => #
(setq w (selected-window))
     => #
(save-window-excursion
  (delete-other-windows w)
  (switch-to-buffer "foo")
  'do-something)
     => do-something
     ;; スクリーンはここでふたたび分割される

Function: window-configuration-p object
この関数は、objectがウィンドウ構成であればtを返す。

Function: compare-window-configurations config1 config2
この関数は、ウィンドウの構造を基に2つのウィンドウ構成を比較する。 ポイントとマークの値、保存されたスクロール位置は無視するので、 それらが異なっていてもtを返す。

関数equalでも2つのウィンドウ構成を比較できるが、 保存されたポイントやマークが違うだけであっても異なる部分があると、 等しくない構成とみなす。

ウィンドウ構成の内部を調べる基本関数には意味があるでしょうが、 実装してありません。 実装するだけの価値があるほど有用なのかはっきりしないのです。



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端]

27.17 ウィンドウのスクロールとサイズ変更向けのフック

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=elisp21&node=Window%20Hooks"
"texi/elisp21/ウィンドウのスクロールとサイズ変更向けのフック"へのコメント(無し)

本節では、ウィンドウにバッファの別の部分を表示したり 別のバッファを表示するたびに、 Lispプログラムが動作する方法を述べます。 変更できる動作は3種類、ウィンドウをスクロールするとき、 ウィンドウでバッファを切り替えるとき、 ウィンドウサイズを変えるときです。 最初の2つの動作ではwindow-scroll-functionsを実行し、 3つ目はwindow-size-change-functionsを実行します。 これらのフックの模範的な使用例は遅延ロック(lazy-lock)モードの 実装の中にあります。 GNU Emacs マニュアルを参照してください。

Variable: window-scroll-functions
この変数は、スクロールによりウィンドウを再表示するまえに Emacsが呼び出すべき関数のリストを保持する。 各関数はウィンドウと新たな表示開始位置の2つの引数で呼ばれるため、 これはノーマルフックではない。

ウィンドウに別のバッファを表示する場合でも これらの関数が実行される。

これらの関数でwindow-end(see 節 27.10 ウィンドウの開始位置)を使うには 注意が必要である。 更新された値が必要なときには、確実に更新値を得るために 引数updateを使う必要がある。

Variable: window-size-change-functions
この変数は、いかなる理由であれウィンドウサイズが変わるときに 呼び出される関数のリストを保持する。 関数は、再表示のたびにサイズ変更が起きたフレームごとに呼ばれる。

各関数はフレームを唯一の引数として受け取る。 当該フレームで大きさが変更されたウィンドウを探す直接的な方法や 正確な方法はない。 しかし、サイズ変更関数が呼ばれるたびに 既存のウィンドウとそれらの大きさを記録すれば、 現在の大きさと以前の大きさを比較できる。

ウィンドウを作成したり削除してもサイズ変更とみなすので、 これらの関数が呼び出される。 フレームの大きさが変わると既存のウィンドウの大きさも変わるので、 これもサイズ変更とみなす。

これらの関数でsave-window-excursion (see 節 27.16 ウィンドウ構成)を使うのはよくない。 この関数はつねにサイズ変更とみなしこれらの関数を呼び出し、 これが繰り返されてしまうからである。 多くの場合、ここで必要なのはsave-selected-window (see 節 27.4 ウィンドウの選択)である。

Variable: redisplay-end-trigger-functions
このアブノーマルフックは、ウィンドウの再表示において、 指定された終了トリガ位置を超えて伸びるテキストを使うたびに実行される。 終了トリガ位置は関数set-window-redisplay-end-triggerで設定する。 フック関数は2つの引数、ウィンドウと終了トリガ位置で呼ばれる。 終了トリガ位置としてnilを保存するとこの機能をオフにし、 フックを実行直後にトリガ値は自動的にnilに再設定される。

Function: set-window-redisplay-end-trigger window position
この関数は、windowの終了トリガ位置をpositionとする。

Function: window-redisplay-end-trigger window
この関数は、windowの現在の終了トリガ位置を返す。

Variable: window-configuration-change-hook
このノーマルフックは、 既存のフレームのウィンドウの構成を変更するたびに呼び出される。 これには、ウィンドウの分割や削除、ウィンドウサイズの変更、 ウィンドウに別のバッファを表示することが含まれる。 このフックを実行するときには、 ウィンドウの構成が変更されたフレームが選択されているフレームである。

[ << ] [ >> ]           [表紙] [目次] [索引] [検索] [上端 / 下端]