水平スクロールとは、ウィンドウ内の画像を通常の文字幅の指定された倍数分だけ左右に移動させることを指します。各ウィンドウには水平スクロール位置があり、これは0以上の数値で表されます。この値は、内容を左にどれだけ移動させるかを指定します。ウィンドウの内容を左に移動させると、一般的に一部の文字の全部または一部が左側から消え、別の文字の全部または一部が右側に表示されます。通常の値は0です。
水平スクロール位置は、デフォルトフォントにおけるスペースの幅である「通常の文字幅」単位で計測されます。したがって、値が5の場合、ウィンドウの内容は通常の文字幅の5倍分だけ左にスクロールしていることを意味します。実際に左側にどれだけの文字数が消えるかは文字幅によって異なり、行ごとに変動する場合があります。
内側ループでは横方向に、外側ループでは縦方向に読み進めるため、水平スクロールの挙動はテキストスクロールや垂直スクロールとは異なります。テキストスクロールでは表示するテキストの一部を選択し、垂直スクロールではウィンドウの内容を連続的に移動させますが、水平スクロールでは各行の一部が画面外へとはみ出します。
通常、水平スクロールは適用されておらず、その場合、最左列はウィンドウの左端に位置します。この状態では、左端より左側に表示されるべきデータが存在しないため、右方向へのスクロールは意味をなさず、許可されません。左方向へのスクロールは許可されており、これによりテキストの先頭数列がウィンドウの外へとスクロールされ、それまで切り捨てられていた右側の追加列が表示されるようになります。ウィンドウにゼロ以外の左方向の水平スクロールが生じると、再び右方向へスクロールできますが、それは正味の水平スクロール量をゼロにする範囲に限られます。左方向へのスクロール量に制限はありませんが、最終的にはすべてのテキストが左端から消えてしまいます。
auto-hscroll-mode が設定されている場合、redisplay
はポイントが常に表示されるよう必要に応じてウィンドウの水平スクロールを自動的に変更します。ただし、水平スクロールの値を明示的に指定することも可能です。指定した値は自動スクロールの下限として機能します。つまり、自動スクロールによってウィンドウが指定した列より下の列までスクロールすることはありません。
auto-hscroll-mode のデフォルト値は t です。これを current-line
に設定すると、自動水平スクロールの一種が有効になります。この機能では、カーソルが表示されている行のみが水平方向にスクロールしてポイントが見えるようになり、ウィンドウの残りの部分は、スクロールされないか、あるいは後述の
scroll-left および scroll-right で設定された最小スクロール量に留まります。
この関数は、選択したウィンドウを左にcount列分(countが負の場合は右に)スクロールします。countのデフォルト値は、ウィンドウ幅から2を引いた値です。
戻り値は、変更後に適用されている左方向への水平スクロールの合計量です—ちょうどwindow-hscroll(以下)が返す値と同じです。
なお、基本方向が右から左である段落(双方向表示を参照)内のテキストは、逆方向に移動します。例えば、count に正の値を指定して scroll-left
を呼び出した場合、テキストは右方向に移動します。
ウィンドウを右端までスクロールさせ、左方向への総スクロール量がゼロになる通常の位置に戻すと、それ以上右にスクロールしようとしても効果はありません。
set-minimum が nil
以外の場合、新しいスクロール量は自動スクロールの下限となります。つまり、自動スクロールによってウィンドウがこの関数の戻り値よりも少ない列数までスクロールされることはありません。インタラクティブな呼び出しでは、set-minimum に nil 以外が渡されます。
この関数は、選択したウィンドウを右に count 列分(count が負の場合は左に)スクロールします。count
のデフォルト値は、ウィンドウ幅から 2 を引いた値です。スクロール方向を除けば、動作は scroll-left と同様です。
この関数は、windowの左方向への水平スクロール量の合計――つまり、windowのテキストが左マージンを越えて左にスクロールした列数――を返します。(右から左へ記述される段落では、代わりに右方向へのスクロール量の合計が返されます。)windowのデフォルト値は、選択中のウィンドウです。
戻り値が負になることはありません。window で水平スクロールが行われていない場合(通常はこのケースにあたります)は 0 になります。
(window-hscroll)
⇒ 0
(scroll-left 5)
⇒ 5
(window-hscroll)
⇒ 5
この関数は、window の水平スクロールを設定します。columns の値は、左マージン(右から左へ記述する段落の場合は右マージン)からの列数でスクロール量を指定します。引数 columns は 0 または正の値である必要があり、そうでない場合は 0 として扱われます。columns の小数値は現在のところサポートされていません。
なお、set-window-hscroll を単純に M-:
を呼び出してテストした場合、動作していないように見えることがあります。実際には、関数が水平スクロール値を設定して戻りますが、その後 redisplay
が point が表示されるように水平スクロールを調整し、これが関数の処理を上書きしてしまうためです。point
が左マージンから十分に離れており、表示されたままの状態であるときに関数を呼び出せば、その効果を確認できます。
返される値は columns です。
(set-window-hscroll (selected-window) 10)
⇒ 10
指定した位置 position が水平スクロールによって画面外にあるかどうかを判断する方法は以下の通りです。
(defun hscroll-on-screen (window position)
(save-excursion
(goto-char position)
(and
(>= (- (current-column) (window-hscroll window)) 0)
(< (- (current-column) (window-hscroll window))
(window-width window)))))