Спецификации отображения, заменяющие текст
Некоторые виды спецификаций отображения указывают, что следует отображать вместо текста, обладающего этим свойством. Такие спецификации называются заменяющими. Emacs не позволяет пользователю интерактивно перемещать точку внутрь текста буфера, заменённого таким образом.
Если список спецификаций отображения включает несколько заменяющих спецификаций, первая имеет приоритет над остальными. Заменяющие спецификации отображения делают большинство других спецификаций отображения неактуальными, поскольку те не применяются к замене. Кроме того, любые свойства invisible и composition заменяемого текста игнорируются, поскольку заменённый текст пропускается, а его свойства не обрабатываются.
В случае заменяющих спецификаций отображения под текстом, обладающим этим свойством понимаются все следующие подряд символы, имеющие один и тот же объект Lisp в качестве свойства display; эти символы заменяются как единое целое. Если у двух символов в качестве свойства display указаны разные объекты Lisp (то есть объекты, которые не являются 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»; и так далее. Таким образом, десять символов отображаются как пять букв A.
Примечание: использование атрибута гарнитуры :box для заменяющей строки display, расположенной рядом с обычным текстом того же стиля :box, может приводить к артефактам отображения при перемещении курсора по тексту с этим атрибутом гарнитуры. Этого можно избежать, применив атрибут :box непосредственно к заменяемому тексту, а не к самой строке display (или применив его также и к ней). Вот пример:
;; Causes display artifacts when moving the cursor across text (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))))
;; No display artifacts due to `: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 "] ")))
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-Specs.html