次: , 前: Text Lines, 上: Motion


29.2.5 スクリーン行分の移動

前節の行単位の関数は、改行文字で区切られたテキスト行だけを数えます。 対照的に、これらの関数は、スクリーン上にどのようにテキストが現れるかで 定義されるスクリーン上の行を数えます。 テキスト行が選択されているウィンドウの幅に収まるだけ短ければ、 1テキスト行は1スクリーン行ですが、 しかし、それ以外では1テキスト行は複数のスクリーン行を占めます。

テキスト行を複数のスクリーン行に継続せずに スクリーン上で切り詰める場合もあります。 このような場合、vertical-motionは、 forward-lineによく似たポイントの移動を行います。 See Truncation

与えられた文字列の幅は、各文字の見ためを制御するフラグに依存するので、 vertical-motionは、 テキストを収めたバッファや選択されているウィンドウ (その幅や切り詰めフラグ、ウィンドウごとに異なりうる表示テーブルが あるため)に依存して、特定のテキスト部分に対して異なったふるまいをします。 See Usual Display

これらの関数は、スクリーン行がどこで区切れるかを決定するためにテキストを走査 するので、走査する量に比例して時間がかかります。 読者がこれらを多用する意図があるときには、 読者のコードの効率を改善するキャッシュをEmacsが提供します。 See cache-long-line-scans

— 機能: vertical-motion count &optional window

この関数は、ポイントを含むスクリーン行から countスクリーン行数だけ下向きにポイントを移動する。 countが負であると上向きに移動する。

vertical-motionは、ポイントを移動したスクリーン行数を返す。 バッファの先頭や末尾に達すると、 この値は絶対値ではcountより小さい。

ウィンドウwindowは、 幅、水平スクロール、表示テーブルなどのパラメータを得るために使われる。 しかし、windowに別のバッファが表示されているとしても、 vertical-motionはつねにカレントバッファに作用する。

— コマンド: move-to-window-line count

この関数は、選択されているウィンドウに現在表示されているテキストに 基づいてポイントを移動する。 ウィンドウの先頭からcountスクリーン行の先頭にポイントを移動する。 countが負であると、底(あるいはバッファの末尾がスクリーンの 底より上にある場合にはバッファの最終行)から数えて −countスクリーン行位置を指定する。

countnilであると、 ウィンドウの中央の行の先頭にポイントを移動する。 count の絶対値がウィンドウのサイズよりも大きいときには、 ウィンドウに十分な高さがあった場合に移動するであろう スクリーン行の箇所にポイントを移動する。 そのため、スクロールして当該箇所がスクリーンに現れるように再表示する。

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

戻り値は、ウィンドウの先頭行を0と数えて、移動先の行のウィンドウ行番号である。

— 機能: compute-motion from frompos to topos width offsets window

この関数は、スクリーン上での位置を計算しながらカレントバッファを走査する。 バッファ内位置fromがスクリーン座標fromposに対応すると仮定して、 fromから前方へ向けてtotoposのどちらかに 達するまでバッファを走査する。 バッファ内の終了位置とスクリーン座標を返す。

座標引数frompostoposは、 (hpos . vpos)の形のコンスセルである。

引数widthは、テキストを表示できるコラム数であり、 これは継続行の扱いに影響する。 読者が選んだウィンドウに対してwindow-widthが返した値、 つまり、通常、(window-width window)を使う。

引数offsetsは、nilであるか、 (hscroll . tab-offset)の形のコンスセルである。 ここで、hscrollは左端に表示されていないコラム数であり、 多くの場合はwindow-hscrollを呼び出して得た値を使う。 一方、tab-offsetはスクリーン上でのコラム番号と バッファ内でのコラム番号の差である。 この値は、継続行においてまえのスクリーン行の幅がtab-widthで終らない 場合に0以外になる。 継続しない行ではつねに0である。

ウィンドウwindowは、使用する表示テーブルを指定するためだけに使われる。 windowに表示されているバッファに関わらず、 compute-motionはつねにカレントバッファに作用する。

戻り値は、5要素のリストである。

          (pos vpos hpos prevhpos contin)
     

ここで、posは走査を終えたバッファ内位置であり、 vposは垂直方向のスクリーン位置、 hposは水平方向のスクリーン位置である。

結果のprevhposは、posから1文字分戻った箇所の水平位置である。 この文字のあとで最終行が継続しているときには、 結果のcontintである。

たとえば、あるウィンドウのlineスクリーン行のcolコラムに 対応するバッファ内位置を探すには、 fromとしてウィンドウの表示開始位置、 fromposとしてウィンドウの左上隅の座標を渡します。 toにはバッファの(point-max)を渡して 走査をバッファの参照可能部分のみに制限し、 toposとしてlinecolを渡す。 つぎのように呼び出す。

          (defun coordinates-of-position (col line)
            (car (compute-motion (window-start)
                                 '(0 . 0)
                                 (point-max)
                                 (cons col line)
                                 (window-width)
                                 (cons (window-hscroll) 0)
                                 (selected-window))))
     

ミニバッファに対してcompute-motionを使うときには、 minibuffer-prompt-widthを使って 最初のスクリーン行の先頭の水平位置を得る必要がある。 see Minibuffer Misc