GNU Emacs 32.0.50 (9008bf64c3) のマニュアルを PLaMo 翻訳で機械翻訳したものです。誤訳を含むことがあります。原文: https://www.gnu.org/software/emacs/manual/html_node/elisp/Window-Start-and-End.html ・ emacs-doc.conao3.com

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

各ウィンドウは、バッファ表示のどこから開始するかを指定するバッファ位置を追跡するためのマーカーを保持しています。この位置は、ウィンドウのdisplay-start位置(または単にstart)と呼ばれます。この位置の直後の文字が、ウィンドウの左上隅に表示されます。通常、これはテキスト行の先頭に位置しますが、必ずしもそうとは限りません。

ウィンドウやバッファを切り替えた後、あるいはその他のいくつかのケースにおいて、ウィンドウの開始位置が行の途中にある場合、Emacsはウィンドウの開始位置を行頭に調整します。これにより、特定の操作によってウィンドウの開始位置が行内の意味のない位置に残るのを防ぎます。この機能は、Lispモードのコマンドを用いてLispコードを実行してテストする際に、この再調整がトリガーされるため、テストの妨げになる場合があります。このようなコードをテストするには、それをコマンドに組み込み、そのコマンドをキーにバインドしてください。

関数: window-start &optional window

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

ウィンドウを作成したり、その中に別のバッファを表示したりすると、display-start 位置には、同じバッファで最近使用された display-start 位置が設定されます。バッファに設定がない場合は point-min となります。

再表示を行うと、ウィンドウ開始位置が更新されます(前回の再表示以降、明示的に指定していない場合)—これにより、ポイントが画面に表示されるようになります。再表示以外にウィンドウ開始位置を自動的に変更するものはありません。ポイントを移動させても、次の再表示が行われるまで、それに応じてウィンドウ開始位置が変化することはありません。

関数: window-group-start &optional window

この関数は window-start と同様ですが、window がウィンドウグループ(ウィンドウグループ を参照)の一部である場合、window-group-start はグループ全体の開始位置を返します。この条件は、バッファローカル変数 window-group-start-function に関数が設定されている場合に成立します。この場合、window-group-start は単一の引数 window を指定してその関数を呼び出し、その結果を返します。

関数: window-end &optional window update

この関数は、window におけるバッファの表示終了位置を返します。window のデフォルトは選択中のウィンドウです。

バッファのテキストを変更したりポイントを移動させたりしただけでは、window-end が返す値は更新されません。値が更新されるのは、Emacs が再表示を行い、その再表示が中断されることなく完了したときのみです。

window の前回の再表示がプリエンプトされ、完了しなかった場合、Emacs はそのウィンドウにおける表示終了位置を把握できません。その場合、この関数は nil を返します。

update が nil でない場合、window-end は常に現在の window-start の値に基づき、表示終了位置の最新値を返します。その位置に以前に保存された値が依然として有効な場合は、window-end はその値を返します。そうでない場合は、バッファテキストをスキャンして正しい値を算出します。

update が nil でない場合でも、point が画面外に移動しても、window-end は実際の再表示時のようにディスプレイをスクロールさせようとはしません。また、window-start の値を変更することもありません。実質的に、スクロールが不要な場合に表示テキストがどこで終わるかを報告します。なお、返される位置は一部しか表示されていない可能性がある点に注意してください。

関数: window-group-end &optional window update

この関数は window-end と同様ですが、window がウィンドウグループ(ウィンドウグループ を参照)の一部である場合、window-group-end はグループ全体の終端位置を返します。この条件は、バッファローカル変数 window-group-end-function に関数が設定されている場合に成立します。この場合、window-group-end は2つの引数 window と update を指定してその関数を呼び出し、その結果を返します。引数 update の意味は window-end と同様です。

関数: set-window-start window position &optional noforce

この関数は、windowのバッファにおいてwindowの表示開始位置をpositionに設定します。戻り値はpositionです。

表示ルーチンは、バッファが表示される際にポイントの位置が可視となるように動作します。通常、ポイントを可視にするため、内部ロジックに基づいて表示開始位置を選択し(必要に応じてウィンドウをスクロールし)ます。ただし、この関数で noforce に nil を指定して開始位置を定義した場合、たとえポイントの位置が画面外になったとしても、position から表示を開始させたいことを意味します。これによりポイントが画面外になった場合、表示ルーチンはポイントをウィンドウ内の中央行の左マージンに移動させようとします。

例えば、pointが 1で、ウィンドウの開始位置を次の行の開始位置である 37に設定した場合、pointはウィンドウの上端より上の位置になります。再表示時にpointが依然として1であれば、表示ルーチンが自動的にpointを移動させます。以下に例を示します。

;; Here is what ‘foo’ looks like before executing
;;   the set-window-start expression.

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

;; Here is what ‘foo’ looks like after executing
;;   the set-window-start expression.
---------- Buffer: foo ----------
2
3
∗4
5
6
---------- Buffer: foo ----------

ポイントを可視状態にする(すなわち、完全に視認可能な画面行に配置する)試みが失敗した場合、表示ルーチンは要求されたウィンドウ開始位置を無視し、いずれにせよ新たな位置を算出します。したがって、確実な結果を得るためには、この関数を呼び出すLispプログラムは常に、position を起点として表示されるウィンドウの内部にポイントを移動させる必要があります。

noforce が nil ではなく、次の再表示時に position によって point が画面外に位置する場合、再表示処理では point と整合する新たなウィンドウ開始位置を算出するため、position は使用されません。

関数: set-window-group-start window position &optional noforce

この関数は set-window-start と同様ですが、window がウィンドウグループ(ウィンドウグループ を参照)の一部である場合、set-window-group-start はグループ全体の開始位置を設定します。この条件は、バッファローカル変数 set-window-group-start-function に関数が設定されている場合に成立します。この場合、set-window-group-start は window、position、noforce の3つの引数を用いてその関数を呼び出し、その結果を返します。この関数における引数 position と noforce は、set-window-start におけるものと同じ意味を持ちます。

関数: pos-visible-in-window-p &optional position window partially

この関数は、position が window の画面上で現在表示されているテキストの範囲内にある場合、non-nil を返します。position が垂直方向にスクロールして表示範囲外にある場合は、nil を返します。部分的に隠れている位置は、partially が non-nil でない限り、表示されているとはみなされません。引数 position のデフォルト値は window における point の現在の位置であり、window のデフォルト値は選択中のウィンドウです。position が t である場合は、window の最後の画面行の最初の表示位置か、バッファ終端位置のいずれか早い方を確認することを意味します。

この関数は垂直スクロールのみを考慮します。window が水平方向にスクロールされたために position が表示範囲外になった場合でも、pos-visible-in-window-p はいずれにせよ nil 以外の値を返します。水平スクロール を参照してください。

position が表示されている場合、partially が nil であれば pos-visible-in-window-p は t を返し、partially が nil 以外であり、かつ position の次の文字が完全に表示されている場合は、(x y) の形式のリストを返します。ここで x と y はウィンドウの左上隅を基準としたピクセル座標です。それ以外の場合は、(x y rtop rbot rowh vpos) の形式の拡張リストを返します。ここで rtop と rbot は position の行の上下にあるウィンドウ外ピクセル数を指定し、rowh はその行の表示高さを、vpos はその行の垂直位置(0始まりの行番号)を指定します。

以下に例を示します。

;; If point is off the screen now, recenter it now.
(or (pos-visible-in-window-p
     (point) (selected-window))
    (recenter 0))
関数: pos-visible-in-window-group-p &optional position window partially

この関数は pos-visible-in-window-p と同様ですが、window がウィンドウグループ(ウィンドウグループ を参照)の一部である場合、pos-visible-in-window-group-p は単一の window だけでなく、グループ全体における pos の可視性を判定します。この条件は、バッファローカル変数 pos-visible-in-window-group-p-function に関数が設定されている場合に成立します。この場合、pos-visible-in-window-group-p は 3 つの引数 position、window、partially を指定してその関数を呼び出し、その結果を返します。引数 position と partially の意味は pos-visible-in-window-p と同様です。

関数: window-line-height &optional line window

この関数は、window におけるテキスト行 line の高さを返します。line が header-line または mode-line のいずれかである場合、window-line-height はウィンドウの対応する行に関する情報を返します。それ以外の場合、line は 0 から始まるテキスト行番号となります。負の数値はウィンドウの末尾から数えます。line のデフォルト値は window の現在の行であり、window のデフォルト値は選択中のウィンドウです。

表示が最新でない場合、window-line-height は nil を返します。その場合、関連情報を取得するために pos-visible-in-window-p を使用できます。

指定された line に対応する行が存在しない場合、window-line-height は nil を返します。それ以外の場合は、リスト (height vpos ypos offbot) を返します。ここで、height は行の可視部分の高さ(ピクセル単位)、vpos と ypos は最初のテキスト行の上端からの行およびピクセル単位の垂直位置、offbot はテキスト行の下部にあるウィンドウ外ピクセル数となります。(最初の)テキスト行の上部にウィンドウ外ピクセルがある場合、ypos は負の値となります。