以前に行った検索にたいするマッチデータを後で使用するために保護する必要があるなら、検索を行うかもしれない関数の呼び出し時に呼び出しの前後でマッチデータの保存とリストアを行う必要があるでしょう。以下はマッチデータ保存に失敗した場合に発生する問題を示す例です:
(re-search-forward "The \\(cat \\)")
⇒ 48
(foo) ; foo
が他の検索を行うと
(match-end 0)
⇒ 61 ; 結果は期待する48と異なる!
save-match-data
でマッチデータの保存とリストアができます:
このマクロはbodyを実行して、その前後のマッチデータの保存とリストアを行う。リターン値はbody内の最後のフォームの値。
set-match-data
とmatch-data
を一緒に使用して、save-match-data
の効果を模倣することができます。以下はその方法です:
(let ((data (match-data)))
(unwind-protect
... ; 元のマッチデータを変更してもOK
(set-match-data data)))
プロセスフィルター関数(プロセスのフィルター関数を参照)、およびプロセスセンチネル(センチネル: プロセス状態の変更の検知を参照)の実行時には、Emacsが自動的にマッチデータの保存とリストアを行います。