Next: , Previous: Motion, Up: Positions


29.3 エクスカージョン

プログラムの局所的な部分で『一時的に』ポイントを移動したり、 一時的にバッファを切り替えられるとしばしば有用です。 これをエクスカージョン(excursion、周遊)と呼び、 スペシャルフォームsave-excursionで行います。 この構文は、カレントバッファとそのポイントやマーカの値を保存し、 エクスカージョンの完了後にそれらを復元します。

ウィンドウの構成を保存したり復元するフォームは、 別のところで述べてあります (Window Configurationsとsee Frame Configurations)。

— Special Form: save-excursion forms...

スペシャルフォーム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