Замена текста в буфере
Для замены части текста в текущем буфере можно использовать следующую функцию:
- Функция: replace-region-contents beg end source &optional max-secs max-costs inherit
-
Эта функция заменяет область между beg и end в текущем буфере текстом из source, которым обычно является строка или буфер; в последнем случае будет использована доступная часть этого буфера.
Эта функция пытается сохранить точку, маркеры, текстовые свойства и наложения в текущем буфере. Одним из возможных случаев, когда это поведение полезно, являются программы внешнего форматирования кода: обычно они записывают отформатированный текст во временный буфер или файл, а использование
insertиdelete-regionуничтожило бы эти свойства.Однако для этого
replace-region-contentsдолжна сравнить содержимое исходного буфера с содержимым source с помощью затратного алгоритма, из-за которого операция выполняется гораздо медленнее, чем простыеinsertиdelete-region. Во многих случаях такое уточнение не требуется, и тогда следует передать 0 в качестве аргумента max-secs, чтобы пропустить этот затратный алгоритм: операция будет такой же быстрой, какinsertиdelete-region, при этом точка и маркеры будут сохраняться несколько лучше.Кроме этого базового способа использования, если в качестве источника требуется использовать подмножество доступной части буфера, source также может быть вектором
[sbuf sbeg send], где текстом-источником является область между sbeg и send в буфере sbuf.Если требуется, чтобы вставленный текст наследовал текстовые свойства соседнего текста, в качестве аргумента inherit можно передать значение, отличное от
nil.Если же требуется выполнять затратную уточнённую замену, чтобы ограничить время выполнения
replace-region-contents, у функции есть два необязательных аргумента.max-secs задаёт жёсткое ограничение времени в секундах. Если этот предел задан и превышен, функция переключится на
delete-regionиinsert-buffer-substring.max-costs задаёт качество вычисления различий. Если фактические затраты превышают этот предел, для ускорения вычислений используются эвристики, дающие неоптимальное решение. Значение по умолчанию — 1000000.
replace-region-contentsвозвращаетt, если удалось выполнить недеструктивную замену. В противном случае, то есть если превышено значение max-secs, функция возвращаетnil.Примечание: при использовании уточнённого алгоритма замены строка замены будет скопирована во временный буфер. Поэтому при прочих равных условиях в качестве аргумента source предпочтительно передавать буфер, а не строку.
Copyright © 1990-1996, 1998-2026 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Replacing.html