プログラムの局所的な部分で『一時的に』ポイントを移動したり、
一時的にバッファを切り替えられるとしばしば有用です。
これをエクスカージョン(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。