28.5 Изменение буфера

Emacs хранит флаг под названием modified flag для каждого буфера, чтобы зафиксировать, изменяли ли вы текст буфера. Этот флаг устанавливается в t каждый раз, когда вы изменяете содержимое буфера, и сбрасывается в nil, когда вы сохраняете его. Таким образом, флаг показывает, есть ли несохраненные изменения. Значение флага обычно отображается в строке состояния (см. Переменные, используемые в строке состояния) и контролирует сохранение (см. Сохранение буферов) и автосохранение (см. Автосохранение).

Некоторые программы на Lisp явно устанавливают этот флаг. Например, функция set-visited-file-name устанавливает флаг в t, потому что текст не соответствует недавно посещенному файлу, даже если он не изменился по сравнению с ранее посещенным файлом.

Функции, изменяющие содержимое буферов, описаны в разделе Текст.

Функция: buffer-modified-p &optional buffer

Эта функция возвращает не-nil, если buffer был изменен с момента последнего чтения из файла или сохранения, или nil в противном случае. Если buffer был автоматически сохранен с момента последнего изменения, эта функция возвращает символ autosaved. Если buffer равен nil или опущен, по умолчанию используется текущий буфер.

Функция: set-buffer-modified-p flag

Эта функция помечает текущий буфер как измененный, если flag не равен nil, или как не измененный, если флаг равен nil.

Другим эффектом вызова этой функции является принудительный повторный отображение строки состояния для текущего буфера. Фактически, функция force-mode-line-update работает именно так:

(set-buffer-modified-p (buffer-modified-p))
Функция: restore-buffer-modified-p flag

Подобно set-buffer-modified-p, но не принуждает повторное отображение строк состояния. Эта функция также позволяет значению flag быть символом autosaved, что помечает буфер как измененный и автоматически сохраненный после последнего изменения.

Команда: not-modified &optional arg

Эта команда помечает текущий буфер как не измененный и не требующий сохранения. Если arg не равен nil, она помечает буфер как измененный, чтобы он был сохранен при следующей подходящей возможности. В интерактивном режиме arg — это префиксный аргумент.

Не используйте эту функцию в программах, так как она выводит сообщение в область вывода; вместо этого используйте set-buffer-modified-p (выше).

Функция: buffer-modified-tick &optional buffer

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

Функция: buffer-chars-modified-tick &optional buffer

Эта функция возвращает счетчик изменений символов buffer. Изменения свойств текста не изменяют этот счетчик; однако каждый раз, когда текст вставляется или удаляется из буфера, счетчик сбрасывается до значения, которое было бы возвращено buffer-modified-tick. Сравнивая значения, возвращаемые двумя вызовами buffer-chars-modified-tick, вы можете узнать, произошло ли изменение символа в этом буфере между вызовами. Если buffer равен nil (или опущен), используется текущий буфер.

Иногда возникает необходимость изменять буфер таким образом, чтобы это не приводило к фактическому изменению его текста, например, если изменяются только его свойства текста. Если вашей программе необходимо изменить буфер, не вызывая никаких хуков и функций, реагирующих на изменения буфера, используйте макрос with-silent-modifications.

Макрос: with-silent-modifications body…

Выполняет body, делая вид, что он не изменяет буфер. Это включает проверку того, заблокирован ли файл буфера (см. Блокировка файлов), выполнение хуков изменения буфера (см. Хуки изменения) и т. д. Обратите внимание, что если body фактически изменяет текст буфера (а не его свойства), его данные отмены могут быть повреждены.