前節で説明した関数は、改行文字のみで区切られたテキスト行をカウントします。これに対し、これらの関数は、画面上のテキストの表示方法によって定義される画面行をカウントします。テキスト行は、選択したウィンドウの幅に収まるほど短ければ単一の画面行となりますが、そうでない場合は複数の画面行にまたがることがあります。
場合によっては、テキスト行が追加の行に継続されず、画面上で切り捨てられます。このような場合、vertical-motionはforward-lineと同様にポイントを移動させます。切り捨てを参照してください。
特定の文字列の幅は、一部の文字の表示を制御するフラグに依存するため、vertical-motion
の挙動は、同一のテキストであっても、それが配置されているバッファや、選択したウィンドウ(ウィンドウによって幅、切り捨てフラグ、表示テーブルが異なる場合があるため)によって異なります。一般的な表示規約を参照してください。
これらの関数はテキストを走査して画面行の区切り位置を判定するため、走査距離に比例した時間がかかります。
この関数は、ポイントを、ポイントを含む画面行からcount行分下の画面行の先頭に移動します。countが負の場合、代わりに上に移動します。countが0の場合、ポイントは現在の画面行の視覚的な先頭に移動します。
引数 count には、整数の代わりにコンスセル (cols . lines)
を指定できます。この場合、関数は前述の count で説明した通りに lines 画面行分移動し、ポイントをその画面行の視覚的な開始位置から cols 列先に配置します。cols
の値は浮動小数点数を指定でき、フレームの正準文字幅(フレームフォント
を参照)単位で解釈されます。これにより、対象の画面行で可変フォントが使用されている場合でも、ポイントの正確な水平位置を指定できます。なお、cols は行の視覚的な開始位置からカウントされます。ウィンドウが水平方向にスクロールされている場合(水平スクロール
を参照)、ポイントが終了する列は、テキストがスクロールした列数に加算されます。また、対象の行が継続行である場合、その最左列は列0とみなされます(列指向の関数とは異なります。列のカウント を参照)。
戻り値は、ポイントが移動した画面行数です。バッファの先頭または末尾に達した場合、この値の絶対値は count よりも小さくなることがあります。
ウィンドウ window
は、幅や水平スクロール、表示テーブルなどのパラメータを取得するために使用されます。一方、vertical-motion は、たとえ window
が現在別のバッファを表示していたとしても、常に現在のバッファに対して動作します。
オプション引数 cur-col は、関数呼び出し時の現在の列を指定します。これは、フレームのデフォルトフェイスのフォント幅を単位とした、ポイントのウィンドウ相対的な水平座標です。これを指定すると、特に非常に長い行において、現在の列を判定するためにバッファを遡る必要がなくなるため、関数の処理が高速化されます。なお、cur-col も行の視覚的な開始位置からカウントされる点に注意してください。
この関数は、begからendまでのテキストに含まれる画面行数を返します。画面行数は、行の継続や表示テーブルなどの影響により、実際の行数とは異なる場合があります。begおよびendがnilであるか、あるいは省略されている場合は、それぞれバッファのアクセス可能な領域の先頭と末尾がデフォルトとなります。
リージョンが改行で終わる場合、オプションの第3引数 count-final-newline が nil 以外でない限り、その改行は無視されます。
省略可能な第4引数 window は、幅や水平スクロールなどのパラメータを取得するためのウィンドウを指定します。デフォルトでは、選択されたウィンドウのパラメータが使用されます。
vertical-motionと同様に、count-screen-linesはwindowにどのバッファが表示されていても、常に現在のバッファを使用します。これにより、count-screen-linesを、現在いずれかのウィンドウに表示されているかどうかにかかわらず、任意のバッファで使用することが可能になります。
この関数は、選択中のウィンドウに現在表示されているテキストを基準としてポイントを移動します。ポイントを、ウィンドウ上部からcount行分の画面行の先頭に移動します。ここで0は最上行を意味します。countが負の値の場合、それは下部から−count行分の位置(または、バッファが指定された画面位置より上で終了している場合はバッファの最終行)を指定します。したがって、countが−1の場合、ウィンドウ内で完全に表示されている最後の画面行が指定されます。
count が nil
の場合、ポイントはウィンドウ中央の行の先頭に移動します。count
の絶対値がウィンドウサイズより大きい場合、ポイントは、ウィンドウが十分に高ければその画面行に表示される位置へ移動します。これにより、次回の再表示時に、その位置が画面内に来るようにスクロールが行われると思われます。
インタラクティブコールにおいて、countは数値のプレフィックス引数です。
返される値は、ウィンドウの最上行を基準として、pointが移動した画面行番号です。
この関数は move-to-window-line
と同様ですが、選択されたウィンドウがウィンドウグループ(ウィンドウグループ を参照)の一部である場合、move-to-window-group-line
は単一のウィンドウだけでなく、グループ全体に対する相対位置へ移動します。この条件は、バッファローカル変数 move-to-window-group-line-function
に関数が設定されている場合に成立します。この場合、move-to-window-group-line
は引数 count を指定してその関数を呼び出し、その結果を返します。
この関数は現在のバッファを走査し、画面位置を算出します。位置 from(画面座標 frompos にあると想定)から位置 to または座標 topos のいずれか早い方まで、バッファを前方に走査します。そして、終了したバッファ位置と画面座標を返します。
座標引数 frompos と topos は、(hpos . vpos) 形式のコンスセルです。
引数 width はテキスト表示に利用可能な列数であり、これは継続行の処理に影響します。nil はウィンドウ内で実際に使用可能なテキスト列数を表し、(window-width window) が返す値と同等です。
引数 offsets は、nil または (hscroll . tab-offset) 形式のコンスセルのいずれかです。ここで hscroll は左マージンに表示されない列数であり、ほとんどの呼び出し元は window-hscroll を呼び出すことでこの値を取得します。一方、tab-offset
は画面上の列番号とバッファ内の列番号とのオフセットです。継続行において、直前の画面行の幅の合計が tab-width の倍数にならない場合、この値は 0 以外になることがあります。継続行でない場合は、常に 0
となります。
ウィンドウ window
は、どのディスプレイテーブルを使用するかを指定するためだけに用いられます。compute-motion は、window
にどのバッファが表示されていても、常に現在のバッファに対して動作します。
戻り値は5つの要素からなるリストです:
(pos hpos vpos prevhpos contin)
ここで、posはスキャンが停止したバッファ位置、vposは画面の垂直位置、hposは画面の水平位置です。
結果 prevhpos は、pos
から1文字戻った水平位置となります。結果 contin
は、最終行が直前の文字の後(または内部)で継続されていた場合の t となります。
例えば、あるウィンドウの画面行 line の列 col
のバッファ位置を求めるには、ウィンドウの表示開始位置を from として、ウィンドウの左上座標を frompos として渡します。バッファの (point-max) を to
として渡すことで、スキャン範囲をバッファのアクセス可能な領域の末尾までに制限し、line と col を topos
として渡します。これを実現する関数を以下に示します。
(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 を使用する必要があります。ミニバッファの内容を参照してください。