Как вставить текст с определенным лицом?

14

У меня есть лицо, созданное таким образом:

(defface test-face
  '((t . (:height 2.0)))
  "A face for testing.")

Я хотел бы вставить текст с этим лицом. Но эти способы вставки текста без лица:

(insert (propertize "text to insert" 'face 'test-face))

(let ((current-string "text to insert"))
  (put-text-property 1 (length current-string) 'face 'test-face)
  (insert current-string))

И даже сначала вставить текст, а затем вернуться, чтобы нанести на него лицо, не получается:

(progn
  (insert "text to insert")
  (add-text-properties
   (save-excursion
     (backward-word 3)
     (point))
   (point)
   '(face test-face)))

Проблема не в определении лица, потому что, если я настрою его, оно уже высотой в два раза больше. Несмотря на это, вставка лица также не работает:

(insert (propertize "to insert" 'face '(:height 2.0)))

Итак, как я могу вставить текст с определенным лицом? Я знаю, что могу использовать наложение, но это выглядит как излишнее, потому что оно более многословно, требует, чтобы текст был вставлен первым (поэтому мы должны выяснить размер и положение текста, который должен быть наложен) и требует, чтобы было больше мусора, чтобы быть собраны.

zck
источник
2
Попробуйте приведенные выше примеры в основном режиме или в любом другом режиме с отключенной блокировкой шрифта (они будут работать нормально). Проблема в том, что font-lock также использует faceкод подсветки синтаксиса, поэтому он заменяет ваше свойство face. Я уверен, что должен быть какой-то способ отключить блокировку шрифта для данного текста, но мне придется немного изучить код (сейчас нет времени). Возможно, чтение font-lock.elкода даст некоторую подсказку
Икбал Ансари

Ответы:

15

Есть некоторые проблемы с кодом:

  • put-text-propertyприменяется к объекту. В этом случае ваша строка. Вы должны передать его как последний параметр.
  • put-text-property начинает считать с нуля.
  • Если этот параметр font-lock-modeвключен, он удалит любой текст faceсвойства.

Следующий фрагмент кода работает, если режим блокировки шрифтов отключен:

(let ((current-string "text to insert"))
  (put-text-property 0 (length current-string) 'face 'font-lock-warning-face
                     current-string)
  (insert current-string))

Если вы хотите использовать это с включенной блокировкой шрифта, вы можете установить свойство font-lock-faceвместо этого. Это имеет тот же эффект, но не зависит от font-lock.

Lindydancer
источник
Четкий и полный ответ.
Дрю