Когда вы вызываете функцию, которая может выполнять поиск, вам может потребоваться сохранить и восстановить данные совпадения вокруг этого вызова, если вы хотите сохранить данные совпадения из более раннего поиска для последующего использования. Вот пример, показывающий проблему, которая возникает, если вы не сохраните данные совпадения:
(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
… ; Безопасно изменить исходные данные совпадения.
(set-match-data data)))
Emacs автоматически сохраняет и восстанавливает данные совпадения при выполнении функций фильтрации процесса (см. Функции фильтрации процесса) и центрирующих функций процесса (см. Центрирующие функции: обнаружение изменений состояния процесса).