Next: , Up: save-excursion   [Contents][Index]


Point and Mark

しかしsave-excursionの議論に移る前に、まずはGNU Emacsにおけるポイントとマークについて概説しておくことは役に立つかもしれません。ポイント(point)とはカーソルのカレント(current: 現在、そのとき)の位置のことです。カーソルがどこにあろうと、そこがポイントです。正確に言うと、端末上において文字上にカーソルが表示されていたら、その文字の直前の位置がポイントです。Emacs Lispのポイントは整数です。あるバッファーにおいて最初の文字なら1、次の文字なら2、...となります。関数pointはカーソルのカレント位置を数値としてリターンします。バッファーはそれぞれが個別にポイントの値をもっています。

バッファー内での別の位置を表すのがマーク(mark)です。マークの値はC-SPC (set-mark-command)のようなコマンドによってセットできます。マークがセットされると、コマンドC-x C-x (exchange-point-and-mark)を使ってそのマークにカーソルをジャンプするとともに、前にポイントがあった位置にマークをセットすることができます。更に別のマークをセットすれば、前のマークの位置はマークリング(mark ring)に保存されるのです。この方法によって多くのマーク位置を保存できます。C-u C-SPCを1回以上タイプすることによって、保存されているマークにカーソルをジャンプすることができます。

ポイントとマークの間にあるバッファーの範囲はリージョン(region)と呼ばれるものです。center-regioncount-words-regionkill-regionprint-regionを含む多くのコマンドがリージョンにたいして機能します。

save-excursionはポイント位置の保存と、Lispインタープリターによって自身のbody内のコードが評価された後に、この保存した位置をリストア(復元)するスペシャルフォームです。したがって、あるテキスト片の先頭にポイントがあったときに、何らかのコードがポイントをバッファー終端に動かしたとすると、save-excursionは自身のbodyにある関数の評価を終えた後に、以前ポイントがあった位置にポイントを戻すのです。

Emacsではたとえユーザーが望んでいなかろうと、内部処理の一環として頻繁にポイントを移動する関数があります。たとえばcount-words-regionはポイントの移動を行います。(ユーザーの観点からは)予期せぬ不必要なジャンプによってユーザーを煩わせることを防ぎ、ユーザーが期待する位置にポイントを保つために頻繁に用いられるのがsave-excursionなのです。整理整頓を良好に行うためにsave-excursionを使うことができます。

たとえ内部にあるコードで何か不具合が起こった場合(適切な専門用語を用いてより詳細に言うと“異常終了(abnormal exit)した場合”)にも、室内を清潔に保つためにsave-excursionはポイント位置のリストアを行います。これは非常に役に立つ機能です。

ポイント位置の記録に加えて、save-excursionはカレントバッファーの追跡とリストアも行います。これはたとえばバッファーを変更するようなコードを記述しても、save-excursionで元のバッファーに戻れることを意味しています。append-to-bufferではこのような方法でsave-excursionが使用されています(The Definition of append-to-bufferを参照)。

This page has generated for branch:work/add_lispintr, commit:65845cf60c073f2f3182d1d07483530e9bbe1d96 to check Japanese translation.