Next: Template for save-excursion, Up: save-excursion [Contents][Index]
しかし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-region、count-words-region、kill-region、print-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を参照)。