¿Cómo inserto texto con una cara específica?

14

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, luego volver para 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 voy a personalizarla, ya se muestra con una altura dos veces mayor. 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 excesivo 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 superpondrá) y requiere que se haga más basura. recogido.

zck
fuente
2
Pruebe los ejemplos anteriores en modo fundamental o en cualquier otro modo con el bloqueo de fuente deshabilitado (funcionarían bien). El problema es que el bloqueo de fuente también se usa facepara el código de resaltado de sintaxis, por lo que está reemplazando la propiedad de la cara. Estoy seguro de que debe haber alguna forma de deshabilitar el bloqueo de fuente para un texto determinado, pero tendré que investigar un poco el código (no hay tiempo ahora). Quizás leer el font-lock.elcódigo daría alguna pista
Iqbal Ansari

Respuestas:

15

Hay algún problema con el código:

  • put-text-propertyse aplica a un objeto. En este caso tu cadena. Debe pasarlo como el último parámetro.
  • put-text-property comienza a contar en cero.
  • Si font-lock-modeestá habilitado, eliminará cualquier texto de la facepropiedad.

El siguiente 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 usar esto con el bloqueo de fuente habilitado, puede configurar la propiedad en su font-lock-facelugar. Tiene el mismo efecto pero no le afecta font-lock.

Lindydancer
fuente
Respuesta clara y completa.
Dibujó