Comment insérer du texte avec un visage spécifique?

14

J'ai un visage, créé de cette façon:

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

Je voudrais insérer du texte avec ce visage. Mais ces façons insèrent le texte sans le visage:

(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))

Et même insérer le texte en premier, puis revenir en arrière pour mettre le visage dessus ne fonctionne pas:

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

Le problème n'est pas la définition du visage, car si je vais le personnaliser, il apparaît déjà avec une hauteur deux fois plus grande. Même ainsi, l'incrustation du visage ne fonctionne pas non plus:

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

Alors, comment puis-je mettre du texte avec le visage spécifique? Je sais que je peux utiliser une superposition, mais cela semble exagéré car il est plus verbeux, nécessite que le texte soit inséré en premier (nous devons donc trouver la taille et la position du texte à superposer) et nécessite de faire plus de déchets pour être collectés.

zck
la source
2
Essayez les exemples ci-dessus en mode fondamental ou tout autre mode avec le verrouillage de police désactivé (ils fonctionneraient bien). Le problème est que font-lock utilise également le facecode de mise en évidence de la syntaxe, il remplace donc votre propriété face. Je suis sûr qu'il doit y avoir un moyen de désactiver le verrouillage de la police pour un texte donné, mais je devrai rechercher un peu le code (pas de temps pour le moment). La lecture du font-lock.elcode pourrait peut-être donner un indice
Iqbal Ansari

Réponses:

15

Il y a un problème avec le code:

  • put-text-propertyest appliqué à un objet. Dans ce cas, votre chaîne. Vous devez le passer comme dernier paramètre.
  • put-text-property commence à compter à zéro.
  • Si font-lock-modeest activé, il supprimera tout texte de la facepropriété.

Le morceau de code suivant fonctionne, si le mode de verrouillage des polices est désactivé:

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

Si vous souhaitez l'utiliser avec le verrouillage de police activé, vous pouvez définir la propriété à la font-lock-faceplace. Il a le même effet mais n'est pas affecté par font-lock.

Lindydancer
la source
Réponse claire et complète.
Tiré