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
を参照)。