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


29.2.5 スクリーン行単位の移動

前のセクションの行関数は、改行文字で区切られたテキスト行だけを数えました。それらとは対照的に以下の関数はスクリーン行を数えます。スクリーン行はスクリーン上でテキストが表示される方法にしたがって定義されます。あるテキスト行1行が選択されたウィンドウの幅にフィット可能な程に十分短ければそれはスクリーン行で1行になりますが、それ以外は複数のスクリーン行になり得ます。

テキスト行が追加スクリーン行に継続されずに、そのスクリーンで切り詰められる(truncated)場合があります。そのような場合にはvertical-motionforward-lineのようにポイントを移動します。Truncationを参照してください。

文字列が与えられると、その幅は文字の外見を制御するフラグに依存するために与えられたテキスト断片にたいして、たとえそれが選択されたウィンドウ上でさえも(幅、切り詰めの有無、ディスプレイテーブルはウィンドウごとに異なり得るので)、そのテキストがあるバッファーに応じてvertical-motionの挙動は異なります。Usual Displayを参照してください。

以下の関数はスクリーン行のブレーク位置を判断するためにテキストをスキャンするために、スキャンする長さに比例して時間を要します。

Function: vertical-motion count &optional window cur-col

この関数はポイントのあるスクリーン行からスクリーン行でcount行下方に移動して、そのスクリーン行の先頭にポイントを移動する。countが負ならかわりに上方に移動する。

count引数には整数のかわりにコンスセル(cols . lines)を指定できる。その場合には関数はスクリーン行でlines行移動して、そのスクリーン行の視覚的な行頭(visual start)からcols列目にポイントを配置する。colsはその行の視覚的(visual)な開始から数えられることに注意。そのウィンドウが水平スクロール(Horizontal Scrollingを参照)されていれば、ポイントが配置される列は、スクロールされたテキストの列数が加えられるだろう。

リターン値はポイントが移動したスクリーン行の行数。バッファーの先頭か終端に到達していたら、この値は絶対値ではcountより小になるかもしれない。

ウィンドウwindowは幅、水平スクロール、ディスプレイテーブルのようなパラメーターの取得に使用される。しかしvertical-motionは、たとえwindowがカレントで他のバッファーを表示していたとしても、常にカレントバッファーにたいして処理を行う。

オプション引数cur-colはこの関数呼び出しの際のカレント列を指定する。これはそのフレームのデフォルトフェイスのフォント幅を単位として計測される、ウィンドウに相対的なポイントの水平座標でる。カレント列の判定のために戻る必要がないので、特に長い行における関数の高速化を提供する。cur-colも行の視覚的な開始から計数されることに注意。

Function: count-screen-lines &optional beg end count-final-newline window

この関数はbegからendのテキスト内のスクリーン行の行数をリターンする。スクリーン行数は行継続やディスプレイテーブル等により実際の行数とは異なるかもしれない。begendnil、または省略された場合のデフォルトは、そのバッファーのアクセス可能範囲の先頭と終端。

そのリージョンが改行で終わる場合には、オプションの第3引数count-final-newlinenilならそれは無視される。

オプションの第4引数windowは幅や水平スクロール等のパラメーターを取得するウィンドウを指定する。デフォルトは選択されたウィンドウのパラメーターを使用する。

vertical-motionと同じうように、count-screen-lineswindow内にどのバッファーが表示されていようと常にカレントバッファーを使用する。これによりバッファーが何らかのウィンドウにカレントで表示されているか否かにかかわらず、任意にバッファーにたいしてcount-screen-linesの使用が可能になる。

Command: move-to-window-line count

この関数は選択されたウィンドウ内にカレントで表示されているテキストに応じてポイントを移動する。これはウィンドウ上端からスクリーン行でcount行目の先頭にポイントを移動する。countが負なら、それはバッファー下端(バッファーが指定されたスクリーン位置の上で終わる場合はバッファーの最終行)から、-count行目の位置を指定する。

countnilならポイントはウィンドウ中央の行の先頭に移動する。countの絶対値がウィンドウサイズより大の場合には、ウィンドウが十分に高かったらそのスクリーン行は表示されていたであろう位置にポイントを移動する。これはおそらく次回の再表示の際に、その箇所がスクリーン上になるようなスクロールを発生させるだろう。

インタラクティブな呼び出しでは数プレフィクス引数がcountとなる。

リターン値はウィンドウ上端行の番号を0とする、ポイントが移動した先の行番号。

Function: move-to-window-group-line count

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

Function: compute-motion from frompos to topos width offsets window

この関数はカレントバッファーをスキャンしてスクリーン位置を計算する。これは位置fromがスクリーン座標fromposにあると仮定して、そこから位置toまたは座標toposのいずれか先に到達したほうまでバッファーを前方にスキャンする。これはスキャン終了のバッファー位置とスクリーン座標をリターンする。

座標引数frompostoposは、(hpos . vpos)という形式のコンスセル。

引数widthはテキストを表示するために利用可能な列数。これは継続行の処理に影響する。nilはそのウィンドウ内で使用可能な実際のテキスト列数であり、(window-width window)がリターンする値と等しい。

引数offsetsnil、または(hscroll . tab-offset)という形式のコンスセルのいずれかであること。ここでhscrollは左マージンのために表示されない列数であり、呼び出し側のほとんどはwindow-hscrollを呼び出すことによりこれを取得する。一方tab-offsetはスクリーン上の列数とバッファー内の列数の間のオフセットである。これは継続行において前のスクリーン行の幅がtab-widthの整数倍でないときは非0になる可能性がある。非継続行ではこれは常に0。

ウィンドウwindowの唯一の役割は使用するディスプレイテーブルの指定である。compute-motionwindow内に表示されているのがどのバッファーであろうとカレントバッファーを処理する。

リターン値は5つの要素をもつリストである:

(pos hpos vpos prevhpos contin)

ここでposはスキャンが停止したバッファー位置、vposは垂直スクリーン位置、hposは水平スクリーン位置である。

結果のprevhposposから1文字戻った水平位置、continは最後の行が前の文字の後(または中)から継続されていればtとなる。

たとえばあるウィンドウのスクリーン行lineの列colのバッファー位置を求めるには、そのウィンドウのdisplay-start(表示開始)位置をfrom、そのウィンドウの左上隅の座標をfromposとして渡す。スキャンをそのバッファーのアクセス可能範囲の終端に制限するために、バッファーの(point-max)tolinecoltoposに渡す。以下はこれを行う関数:

(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を使用する必要がある。