Pregunta:
Tengo una cara, creada de esta manera:
(defface test-face
'((t . (:height 2.0)))
"A face for testing.")
Me gustaría insertar un texto con esa cara. Pero estas formas insertan el texto sin la cara:
(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))
E incluso insertar el texto primero y luego volver a ponerle la cara no funciona:
(progn
(insert "text to insert")
(add-text-properties
(save-excursion
(backward-word 3)
(point))
(point)
'(face test-face)))
El problema no es la definición de la cara, porque si la personalizo, ya está apareciendo con el doble de altura. Aun así, alinear la cara tampoco funciona:
(insert (propertize "to insert" 'face '(:height 2.0)))
Entonces, ¿cómo puedo poner un texto con la cara específica? Sé que puedo usar una superposición, pero eso parece una exageración porque es más detallado, requiere que el texto se inserte primero (por lo que tenemos que averiguar el tamaño y la posición del texto que se va a superponer) y requiere hacer más basura para ser recogido.
Respuesta:
Hay algún problema con el código:
-
put-text-property
se aplica a un objeto. En este caso su string. Debe pasarlo como último parámetro. -
put-text-property
comienza a contar desde cero. - Si
font-lock-mode
está habilitado, eliminará cualquier texto de la propiedad de laface
.
El siguiente fragmento de código funciona, si el modo de bloqueo de fuente está desactivado:
(let ((current-string "text to insert"))
(put-text-property 0 (length current-string) 'face 'font-lock-warning-face
current-string)
(insert current-string))
Si desea utilizar esto con font-lock habilitado, puede establecer la propiedad font-lock-face
lugar. Tiene el mismo efecto pero no se ve afectado por font-lock
.