28.12 Обмен текстом между двумя буферами

Специализированные режимы иногда должны позволять пользователю получать доступ из одного и того же буфера к нескольким совершенно разным типам текста. Например, вам может потребоваться отобразить сводку текста буфера, помимо предоставления пользователю доступа к самому тексту.

Это можно реализовать с помощью нескольких буферов (синхронизированных при редактировании текста) или с помощью сужения (см. Сужение). Но эти альтернативы иногда могут стать утомительными или непомерно дорогими, особенно если каждый тип текста требует дорогостоящих операций, глобальных для буфера, для обеспечения корректного отображения и команд редактирования.

Emacs предоставляет еще одну возможность для таких режимов: вы можете быстро обменять текст буфера между двумя буферами с помощью buffer-swap-text. Эта функция очень быстрая, потому что она не перемещает текст, а только изменяет внутренние структуры данных объекта буфера, чтобы они указывали на другой фрагмент текста. Используя ее, вы можете сделать вид, что группа из двух или более буферов на самом деле является одним виртуальным буфером, содержащим содержимое всех отдельных буферов вместе.

Функция: buffer-swap-text buffer

Эта функция меняет местами текст текущего буфера и текста указанного в аргументе buffer буфера. Она сигнализирует об ошибке, если один из двух буферов является непрямым буфером (см. Непрямые буферы) или является базовым буфером непрямого буфера.

Все свойства буфера, связанные с текстом буфера, также меняются местами: позиции курсора и маркера, все маркеры, наложения, свойства текста, список отмены, значение флага enable-multibyte-characters (см. enable-multibyte-characters) и т. д.

Предупреждение: Если эта функция вызывается внутри формы save-excursion, текущий буфер будет установлен в buffer после выхода из формы, поскольку маркер, используемый save-excursion для сохранения позиции и буфера, также будет поменяны местами.

Если вы используете buffer-swap-text для буфера, открывающего файл, вам следует настроить хук для сохранения исходного текста буфера, а не того, с чем он был поменяны местами. write-region-annotate-functions подходит для этой цели. Вам, вероятно, следует установить buffer-saved-size в −2 в буфере, чтобы изменения в тексте, с которым он был поменяны местами, не мешали автоматическому сохранению.