33.23 Замена текста буфера

Вы можете использовать следующую функцию для замены текста одного буфера текстом другого буфера:

Команда: replace-buffer-contents source &optional max-secs max-costs

Эта функция заменяет доступную часть текущего буфера доступной частью буфера source. source может быть либо объектом буфера, либо именем буфера. Когда replace-buffer-contents выполняется успешно, текст доступной части текущего буфера будет равен тексту доступной части буфера source.

Эта функция пытается сохранить позицию курсора, маркеры, свойства текста и наложения в текущем буфере. Один потенциальный случай, когда это поведение является полезным, — это внешние программы форматирования кода: они обычно записывают отформатированный текст во временный буфер или файл, и использование delete-region и insert-buffer-substring уничтожило бы эти свойства. Однако последнее сочетание обычно быстрее (см. Удаление текста и Вставка текста).

Для своей работы replace-buffer-contents необходимо сравнить содержимое исходного буфера с содержимым source, что является операцией, требующей больших затрат, если буферы огромны и между ними есть большое количество различий. Чтобы сохранить время выполнения replace-buffer-contents в пределах нормы, у него есть два необязательных аргумента.

max-secs определяет жесткий предел во времени. Если он задан и превышен, функция перейдет к использованию delete-region и insert-buffer-substring.

max-costs определяет качество вычисления различий. Если фактические затраты превышают этот лимит, используются эвристики для предоставления более быстрого, но субоптимального решения. Значение по умолчанию равно 1000000.

replace-buffer-contents возвращает t, если возможно выполнить замену без разрушения. В противном случае, то есть если превышен max-secs, он возвращает nil.

Функция: replace-region-contents beg end replace-fn &optional max-secs max-costs

Эта функция заменяет область между beg и end используя заданную replace-fn. Функция replace-fn выполняется в текущем буфере, суженном до указанной области, и должна вернуть либо строку, либо буфер, заменяющий область.

Замена выполняется с помощью replace-buffer-contents (см. выше), которая также описывает аргументы max-secs и max-costs и возвращаемое значение.

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