Next: , Up: ディスプレイの制御   [Contents][Index]


15.1 スクロール

ウィンドウがバッファーのすべてのテキストを表示するには小さい場合、その一部だけが表示されます。スクロールコマンドは、バッファーで表示される部分を変更します。

前方(forward)または上(up)へのスクロールは、ウィンドウに表示される部分を先に進めます。これはウィンドウに表示されるバッファーのテキストを、上に移動させるのと同じです。後方(backward)または下(down)へのスクロールは、ウィンドウに表示される部分を前に戻します。これはウィンドウに表示されるバッファーのテキストを下に移動させます。

Emacsでのupとdownは、ウィンドウでテキストが移動する方向に基づいており、テキストにたいしてウィンドウが移動する方向ではありません。この用語は現在のscrolling upやscrolling downが広まる前に、Emacsで採用されました。そのためPageDownは、Emacs的には上(up)にスクロールするという、奇妙な結果となりました。

ウィンドウに表示されているバッファー部分には、常にポイントが含まれています。もしウィンドウの下端か上端を越えてポイントを移動させると、ポイントを画面に表示させるために自動的にスクロールが発生します(自動スクロールを参照してください)。以下のコマンドで明示的にスクロールができます:

C-v
PageDown
next

ウィンドウのほぼ全画面分、前方にスクロールします(scroll-up-command)。

M-v
PageUp
prior

後方にスクロールします(scroll-down-command)。

C-v (scroll-up-command)は、ウィンドウ全体の高さに近い量、前方にスクロールします。これにより下端の2行が上端になるようスクロールして、それに続く表示されていなかった行を表示します。ポイントが上端より上になってしまう場合、ウィンドウの新たな上端の行に移動します。The PageDown(またはnext)は、C-vと同じです。

M-v (scroll-down-command)は、同様の方法で後方にスクロールします。PageUp(またはprior)は、M-vと同じです。

スクロールコマンドでオーバーラップして表示される行数は、変数next-screen-context-linesで制御され、デフォルトは2です。数引数nを与えたときは、n行スクロールします。Emacsはポイントを変更しないよう試みるので、テキストとポイントは一緒に上または下に動きます。C-vに負の引数を与えると、M-vのように反対方向へスクロールします。

デフォルトでは、ウィンドウがバッファーの先頭または最後に到達していて、これ以上スクロールできない場合、これらのコマンドは(beep音をならしたり画面をフラッシュして)エラーをシグナルします。変数scroll-error-top-bottomtに変更すると、コマンドは可能な限り、つまりバッファーの先頭の文字または最後の文字にポイントを移動します。ポイントがすでにそこにあるときは、エラーをシグナルします。

スクロールしたとき、ポイントが同じスクリーン位置に留まることを好むユーザーもいます。そうすれば同じスクリーンにスクロールして戻ったとき、ポイントが元の位置にあると便利だからです。この動作は変数scroll-preserve-screen-positionを通じて利用可能です。変数の値がtのとき、スクロールコマンドによりポイントがウィンドウの外にでるような場合、Emacsはポイントを先頭行または最終行に移動させるのではなく、同じスクリーン位置にポイントを調整して、カーソルを維持します。その他の非nil値の場合、Emacsはスクロールコマンドによりポイントがウィンドウに残っている場合にも、この方法でポイントを調整します。この変数はこのセクションで説明するすべてのスクロールコマンド、同様にマウスホイールによるスクロール(編集のためのマウスコマンドを参照してください)に影響を与えます。一般的にいうと、この変数はscroll-commandプロパティが非nilのコマンドに影響を及ぼします。Property Lists in The Emacs Lisp Reference Manualを参照してください。インクリメンタル検索においてこのプロパティが非nilのコマンドが呼び出された際に、isearch-allow-scrollが非nilであればインクリメンタル検索を終了させないという効果もあります(インクリメンタル検索を終了させないを参照)。

ときどき、特にC-vM-vのようなキーを押したままにすると、キーボードのオートリピートがアクティブになり、要求された高レートのスクロール要求にEmacsが対応できなくなるときがあります。そのような場合、表示は更新されず、かなり長時間の間、Emacsが応答しなくなる可能性があります。変数fast-but-imprecise-scrollingを非nil値にセットすることにより、この状況に対処できます。これはスクロールコマンドにフォント表示化(Font Lockモードを参照してください)を行なわないように指示します。スクロールされるテキストは、それらがデフォルトフェイスをもつと仮定されなくなり、フォント表示化されなくなります。これにより、そのフェイスがすべて同じサイズのフォントを使用していない場合には、(たとえばオートリピートではない)1回のスクロールでも、Emacsが誤ったバッファー位置にスクロールするかもしれません。

fast-but-imprecise-scrollingをセットするかわりにJIT Lockによる遅延されたフォント表示化の有効化のほうが好ましいと思うかもしれません(Font Lockモードを参照)。これを行うにはjit-lock-defer-timeに0.25、タイプ速度が速い場合には0.1のように小さい正の数値をセットします。これによりC-v押下時のぎくしゃくしたスクロールが幾分改善されますが、バッファーの新たな部分へスクロールするようなアクション後のウィンドウのコンテンツは一時的に非フォント化されるでしょう。

最後にこれらの変数にかわる3つ目の選択肢がredisplay-skip-fontification-on-inputです。この変数が非nilなら、保留中の入力がある場合にはいくつかのフォント表示化をスキップします。いずれにせよ入力の保留中は再表示を完全にスキップするので通常なら表示に影響はありませんが、不要なフォント表示化を避けることでスクロールがスムーズになる可能性があります。

コマンドM-x scroll-upおよびM-x scroll-downは、scroll-up-commandおよびscroll-down-commandと同様に動作しますが、scroll-error-top-bottomを考慮しません。これらのコマンドは、Emacs 24以前ではスクロールアップおよびスクロールダウンのためのデフォルトでした。コマンドM-x scroll-up-lineおよびM-x scroll-down-lineは、現在のウィンドウを1行スクロールさせます。もしこれらのコマンドを使う場合は、それにキーバインドを割り当てたくなるでしょう(initファイル内でのキーのリバインドを参照してください)。

グラフィカルなディスプレイではスクロールバーを使ったウィンドウのスクロールも可能です。スクロールバーを参照してください。