Некоторые виды спецификаций отображения указывают, что следует отобразить вместо текста, имеющего данное свойство. Эти спецификации называются замещающими спецификациями отображения. Emacs не позволяет пользователю интерактивно перемещать курсор в середину буферного текста, который заменяется таким образом.
Если список спецификаций отображения содержит более одной замещающей спецификации отображения, первая имеет приоритет над остальными. Замещающие спецификации отображения делают большинство других спецификаций отображения неактуальными, поскольку они не применяются к замене. Кроме того, любые свойства invisible и composition текста, который заменяется, игнорируются, поскольку заменяемый текст пропускается, и его свойства не обрабатываются.
Для замещающих спецификаций отображения текст, имеющий свойство означает все последовательные символы, имеющие один и тот же объект Lisp как свое свойство display; эти символы заменяются как единое целое. Если два символа имеют разные объекты Lisp в качестве своих свойств display (т.е. объекты, которые не являются eq), они обрабатываются отдельно.
Вот пример, иллюстрирующий этот момент. Строка служит замещающей спецификацией отображения, которая заменяет текст, имеющий данное свойство, указанной строкой (см. Другие спецификации отображения). Рассмотрим следующую функцию:
(defun foo ()
(dotimes (i 5)
(let ((string (concat "A"))
(start (+ i i (point-min))))
(put-text-property start (1+ start) 'display string)
(put-text-property start (+ 2 start) 'display string))))
Эта функция присваивает каждому из первых десяти символов в буфере свойство display, которое является строкой "A", но они не все получают один и тот же строковый объект. Первые два символа получают один и тот же строковый объект, поэтому они заменяются одним A; тот факт, что свойство отображения было присвоено в двух отдельных вызовах put-text-property, не имеет значения. Аналогично, следующие два символа получают вторую строку (concat создает новый строковый объект), поэтому они заменяются одним A, и так далее. Таким образом, десять символов отображаются как пять «А».
Примечание: Использование атрибута лица :box (см. Атрибуты лица) на замещающей строке display, которая граничит с обычным текстом с тем же стилем :box, может привести к артефактам отображения при перемещении курсора по тексту с этим атрибутом лица. Их можно избежать, применяя атрибут :box непосредственно к заменяемому тексту, а не (или в дополнение к) самой строке display. Вот пример:
;; Вызывает артефакты отображения при перемещении курсора по тексту (progn (put-text-property 1 2 'display (propertize " [" 'face '(:box t))) (put-text-property 2 3 'face '(:box t)) (put-text-property 3 4 'display (propertize "] " 'face '(:box t))))
;; Нет артефактов отображения благодаря `:box` (progn (add-text-properties 1 2 '(face (:box t) display " [")) (put-text-property 2 3 'face '(:box t)) (add-text-properties 3 4 '(face (:box t) display "] ")))