プログラムの局所的な部分で『一時的に』ポイントを移動したり、
一時的にバッファを切り替えられるとしばしば有用です。
これをエクスカージョン(excursion、周遊)と呼び、
スペシャルフォームsave-excursionで行います。
この構文は、カレントバッファとそのポイントやマーカの値を保存し、
エクスカージョンの完了後にそれらを復元します。
ウィンドウの構成を保存したり復元するフォームは、 別のところで述べてあります (Window Configurationsとsee Frame Configurations)。
スペシャルフォーム
save-excursionは、 カレントバッファの識別子とそのポイントやマーカの値を保存し、 formsを評価し、最後に、 バッファと保存しておいたポイントやマーカの値を復元する。throwやエラーによる異常脱出(see Nonlocal Exits)であっても、 これらの保存した値を復元する。スペシャルフォーム
save-excursionは、 プログラムの一部分だけでバッファやポイントを移動し プログラムの他の部分への影響を防ぐ標準的な方法である。 EmacsのLispソースでは4000回以上も使われている。
save-excursionは他のバッファのポイントやマークの値は保存しないので、 他のバッファでの変更はsave-excursionから抜けても持続する。同様に、
save-excursionは、switch-to-bufferなどの関数で変更された ウィンドウとバッファの対応関係は復元しない。 これらの対応関係や選択されているウィンドウを復元する1つの方法は、save-excursionの内側でsave-window-excursionを 使うことである(see Window Configurations)。
save-excursionの戻り値は、formsの最後の結果であるか、 formsを与えなければnilである。(save-excursion forms) == (let ((old-buf (current-buffer)) (old-pnt (point-marker)) (old-mark (copy-marker (mark-marker)))) (unwind-protect (progn forms) (set-buffer old-buf) (goto-char old-pnt) (set-marker (mark-marker) old-mark)))
警告: 保存されたポイント値の箇所に 普通にテキストを挿入すると、すべてのマーカを再配置するように 保存されたポイント値を再配置する。 したがって、保存されたポイント値が復元されると、 ポイントは挿入されたテキストのまえに普通どおりにくる。
save-excursionはマーカの位置を保存しますが、
バッファを変更する関数がdeactivate-markを行うことを防ぎませんから、
コマンドが終了するとマーカが不活性になってしまいます。
See The Mark。