Экскурсии
Часто бывает полезно временно переместить точку внутри локальной части программы. Это называется экскурсией, и она выполняется с помощью специальной формы save-excursion. Этот конструкт запоминает начальную идентичность текущего буфера и его значение точки, и восстанавливает их после завершения экскурсии. Это стандартный способ перемещения точки внутри одной части программы и предотвращения влияния на остальную часть программы, и используется тысячи раз в исходных кодах Lisp для Emacs.
Если вам нужно только сохранить и восстановить идентичность текущего буфера, используйте save-current-buffer или with-current-buffer вместо этого (см. Текущий буфер). Если вам нужно сохранить или восстановить конфигурации окон, см. формы, описанные в Конфигурации окон и в Конфигурации фреймов.
- Специальная форма: save-excursion body…
-
Эта специальная форма сохраняет идентичность текущего буфера и значение точки в нём, вычисляет body, а затем восстанавливает буфер и его сохранённое значение точки. Оба сохранённых значения восстанавливаются даже в случае аварийного выхода с помощью
throwили ошибки (см. Нелокальные выходы).Значение, возвращаемое
save-excursion, является результатом последней формы в body илиnil, если форм тела не было.
Поскольку save-excursion сохраняет только точку для буфера, который был текущим в начале экскурсии, любые изменения, внесённые в точку в других буферах во время экскурсии, останутся в силе после неё. Это часто приводит к непредвиденным последствиям, поэтому компилятор байт-кода предупреждает, если вы вызываете set-buffer во время экскурсии:
Warning: Use ‘with-current-buffer’ rather than
save-excursion+set-buffer
Чтобы избежать таких проблем, следует вызывать save-excursion только после установки желаемого текущего буфера, как в следующем примере:
(defun append-string-to-buffer (string buffer)
"Append STRING to the end of BUFFER."
(with-current-buffer buffer
(save-excursion
(goto-char (point-max))
(insert string))))
Аналогично, save-excursion не восстанавливает соответствия окно-буфер, изменённые функциями, такими как switch-to-buffer.
Предупреждение: Обычная вставка текста рядом сохранённым значением точки перемещает сохранённое значение, так же как и все маркеры. Более точно, сохранённое значение - это маркер с типом вставки nil. См. Типы вставки маркеров. Поэтому, когда сохранённое значение точки восстанавливается, оно обычно оказывается перед вставленным текстом.
- Макрос: save-mark-and-excursion body…
-
Этот макрос подобен
save-excursion, но также сохраняет и восстанавливает расположение метки иmark-active. Этот макрос делает то, чтоsave-excursionделал до Emacs 25.1.
Copyright © 1990-1996, 1998-2022 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Excursions.html