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


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

ウィンドウはそれぞれバッファー位置を追跡するために、バッファー内で表示を開始すべき位置を指定するマーカーを保守しています。この位置はそのウィンドウの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-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: 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 ----------

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

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

この関数は、window内のpositionが画面上カレントで可視のテキスト範囲内にある場合は、非nilをリターンし、positionが表示範囲のスクロール外にある場合は、nilをリターンする。partiallynilなら、部分的に不明瞭な位置は可視とは判断されない。引数positionのデフォルトは、window内のポイントのカレント位置で、windowのデフォルトは選択されたウィンドウである。positiontなら、それはwindowの最後に可視だった位置をチェックすることを意味する。

この関数は垂直スクロールだけを考慮する。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: 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は負となる。