Next: , Previous: , Up: Windows   [Contents][Index]


29.20 ウィンドウの開始位置と終了位置

ウィンドウはそれぞれバッファー位置を追跡するために、バッファー内で表示を開始すべき位置を指定するマーカーを保守しています。この位置はそのウィンドウのdisplay-start(表示開始)、または単にstart(開始)と呼ばれます。この位置の後の文字がウィンドウの左上隅に表示される文字となります。これは通常はテキスト行の先頭になりますが必須ではありません。

ウィンドウやバッファーの切り替え後やいくつかのケースにおいては、ウィンドウが行の途中で開始される場合にEmacsがィンドウの開始を行の開始に調整します。これは行中で無意味な位置のウィンドウ開始のまま特定の操作が行われるのを防ぐためです。この機能はLispモードのコマンドを使用して実行することによりある種のLispコードをテストする場合には、それらのコマンドがこの再調整を誘発してしまうので邪魔かもしれません。そのようなコードをテストするためには、それをコマンド内に記述して何らかのキーにバインドしてください。

Function: window-start &optional window

この関数はウィンドウwindowの表示開始位置をリターンする。windownilなら選択されたウィンドウが使用される。

ウィンドウを作成したり他のバッファーをウィンドウ内に表示する際、display-start位置は同じバッファーにたいしてもっとも最近に使用されたdisplay-start位置、そのバッファーがそれをもたなければpoint-minにセットされる。

ポイントがスクリーン上に確実に現れるように、再表示はwindow-start位置を更新する(前の再表示以降にwindow-start位置を明示的に指定していない場合)。再表示以外にwindow-start位置を自動的に変更するものはない。ポイントを移動した場合には、次の再表示後までポイントの移動に応じてwindow-startが変更されることを期待してはならない。

Function: window-group-start &optional window

この関数はwindow-startと同様だが、windowがウィンドウグループ(Window Groupを参照)の一部なら、window-group-startはグループ全体の開始位置をリターンする点が異なる。この条件はバッファーローカル変数window-group-start-functionに関数がセットされている際に保持される。この場合には、window-group-startはその関数を単一の引数windowで呼び出して結果をリターンする。

Function: window-end &optional window update

この関数はwindowのバッファーの最後を表示する位置をリターンする。windowにたいするデフォルトは選択されたウィンドウ。

バッファーテキストの単なる変更やポイントの移動ではwindow-endがリターンする値は更新されない。この値はEmacsが再表示を行って、妨害されることなく再表示が完了したときのみ更新される。

windowの最後の再表示が妨害されて完了しなかったら、Emacsはそのウィンドウ内の表示のend位置を知らない。関数はこの場合はnilをリターンする。

updateが非nilなら、window-endwindow-startのカレント値にもとづき、どこが表示のendなのか最新の値をリターンする。以前に保存された位置の値がまだ有効なら、window-endはその値をリターンする。それ以外はバッファーのテキストをスキャンして正しい値を計算する。

たとえupdateが非nilであっても、window-endはポイントが画面外に移動した場合に実際の再表示が行うような表示のスクロールを試みない。これはwindow-startの値を変更しない。これは実際にはスクロールが要求されない場合の表示されたテキストのendがどこかを報告する。リターンされる位置は部分的に可視なだけかもしれないことに注意。

Function: window-group-end &optional window update

この関数はwindow-endと同様だが、windowがウィンドウグループ(Window Groupを参照)の一部なら、window-group-endはグループ全体の終了位置をリターンする点が異なる。この条件はバッファーローカル変数window-group-end-functionに関数がセットされている際に保持される。この場合には、window-group-endはその関数を2つの引数windowupdateで呼び出して結果をリターンする。引数updatewindow-endの場合と同じ意味をもつ。

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

この関数はwindowのdisplay-start位置をwindowのバッファーのpositionにセットする。リターン値はposition

表示ルーチンはバッファーが表示されたときにポイント位置が可視になることを強要する。通常これらは内部ロジックに応じてポイントを可視にするためにdisplay-start位置を選択(および必要ならつまりウィンドウをスクロール)する。しかしこの関数でnoforcenilを使用してstart位置を指定した場合は、たとえポイントを画面外になるような場所に配置したとしても、positionでの表示開始を望んでいることを意味する。これによりポイントが画面外に配置されると、表示ルーチンはポイントをウィンドウ内の中央行の左マージンに移動しようと試みる。

たとえばポイントが1のときにウィンドウのstartを次行の開始37にセットすると、ポイントはウィンドウの最上端より上になるだろう。表示ルーチンは再表示が発生したときにポイントが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)
 (save-excursion
   (goto-char 1)
   (forward-line 1)
   (point)))
⇒ 37

;; 以下は式set-window-start実行後の
;;   foo’の様子
---------- Buffer: foo ----------
2
3
∗4
5
6
---------- Buffer: foo ----------

ポイントを可視(つまり完全に可視なスクリーン行内にポイントを配置)にする試みが失敗すると、表示ルーチンは要求されたwindow-start位置を無視して、とにかく新しい位置を計算する。したがってこの関数を呼び出すLispプログラムが信頼できる結果を得るためには、表示がpositionで始まるウィンドウ内部に常にポイントを移動すること。

noforceが非nilで、かつ次回の再表示でポイントが画面外に配される場合、再表示はポイントと協調して機能する位置となるような新たなwindow-startを計算するので、positionは使用されない。

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

この関数はset-window-startと同様だが、windowがウィンドウグループ(Window Groupを参照)の一部なら、set-window-group-startはグループ全体の開始位置をリターンする点が異なる。この条件はバッファーローカル変数set-window-group-start-functionに関数がセットされている際に保持される。この場合には、set-window-group-startはその関数を3つの引数windowpositionnoforceで呼び出して結果をリターンする。この関数の引数positionnoforceset-window-startの場合と同じ意味をもつ。

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

この関数はwindow内のpositionが画面上カレントで可視のテキスト範囲内にあれば非nilpositionが表示範囲のスクロール外にあればnilをリターンする。partiallynilなら部分的に不明瞭な位置は可視とは判断されない。引数positionのデフォルトはwindow内のポイントのカレント位置、windowのデフォルトは選択されたウィンドウ。positiontなら、それはwindowの最後に可視だった行の位置、またはEOB(end-of-buffer: バッファー終端位置のいずれか前方になる位置をチェックすることを意味する。

この関数は垂直スクロールだけを考慮する。positionが表示範囲外にある理由が、windowが水平にスクロールされただけなら、いずれにせよpos-visible-in-window-pは非nilをリターンする。Horizontal Scrollingを参照のこと。

positionが可視でpartiallynilなら、pos-visible-in-window-ptをリターンする。partiallyが非nilposition以降の文字が完全に可視なら、(x y)という形式のリストをリターンする。ここでxyはウィンドウの左上隅からの相対的なピクセル座標。position以降の文字が完全に可視ではなければ、拡張された形式のリスト(x y rtop rbot rowh vpos)をリターンする。ここでrtoprbotpositionでウィンドウ外となった上端と下端のピクセル数、rowhはその行の可視な部分の高さ、vposはその行の垂直位置(0基準の行番号)を示す。

以下は例:

;; ポイントが画面外ならrecenterする
(or (pos-visible-in-window-p
     (point) (selected-window))
    (recenter 0))
Function: pos-visible-in-window-group-p &optional position window partially

この関数はpos-visible-in-window-pと同様だが、windowがウィンドウグループ(Window Groupを参照)の一部なら、pos-visible-in-window-group-pwindow単独ではなく、グループ全体でposの可視性をテストする点が異なる。この条件はバッファーローカル変数pos-visible-in-window-group-p-functionに関数がセットされている際に保持される。この場合には、pos-visible-in-window-group-pはその関数を3つの引数positionwindowpartiallyで呼び出して結果をリターンする。この関数の引数positionpartiallypos-visible-in-window-pの場合と同じ意味をもつ。

Function: window-line-height &optional line window

この関数はwindow内のテキスト行lineの高さをリターンする。lineheader-linemode-linewindow-line-heightのいずれかなら、そのウィンドウの対応する行についての情報をリターンする。それ以外では、lineは0から始まるテキスト行番号。負数ならそのウィンドウのendから数える。lineにたいするデフォルトはwindow内のカレント行、windowにたいするデフォルトは選択されたウィンドウ。

表示が最新でなければwindow-line-heightnilをリターンする。その場合には関連する情報を入手するためにpos-visible-in-window-pを使用できる。

指定されたlineに対応する行がなければ、window-line-heightnilをリターンする。それ以外では、リスト(height vpos ypos offbot)をリターンする。ここでheightはその行の可視部分のピクセル高さ、vposyposは最初のテキスト行上端からのその行への相対的な垂直位置の行数とピクセル数、offbotはそのテキスト行下端のウィンドウ外のピクセル数。(最初の)テキスト行上端にウィンドウ外のピクセルがある場合にはyposは負となる。