Wie füge ich Text mit einem bestimmten Gesicht ein?

14

Ich habe ein Gesicht, das so erschaffen wurde:

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

Ich möchte etwas Text mit diesem Gesicht einfügen. Aber diese Möglichkeiten fügen den Text ohne das Gesicht ein:

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

Und selbst wenn Sie zuerst den Text einfügen und dann zurückgehen, um das Gesicht darauf zu setzen, funktioniert das nicht:

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

Das Problem ist nicht die Definition des Gesichts, denn wenn ich es anpasse, wird es bereits doppelt so groß angezeigt. Trotzdem funktioniert das Inlinen des Gesichts nicht:

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

Wie kann ich also einen Text mit einem bestimmten Gesicht einfügen? Ich weiß, dass ich eine Überlagerung verwenden kann, aber das scheint übertrieben, weil es ausführlicher ist, und erfordert, dass der Text zuerst eingefügt wird (also müssen wir die Größe und Position des zu überlagernden Texts herausfinden) und dass mehr Müll erzeugt wird gesammelt.

zck
quelle
2
Probieren Sie die obigen Beispiele im Grundmodus oder in einem anderen Modus mit deaktivierter Schriftsperre aus (sie funktionieren problemlos). Das Problem ist, dass die Schriftsperre auch facezur Syntaxhervorhebung von Code verwendet wird, sodass die Eigenschaft face ersetzt wird. Ich bin mir sicher, dass es eine Möglichkeit geben muss, die Schriftsperre für einen bestimmten Text zu deaktivieren, aber ich muss den Code ein wenig recherchieren (momentan keine Zeit). Vielleicht font-lock.elwürde das Lesen von Code einen Hinweis geben
Iqbal Ansari

Antworten:

15

Es gibt ein Problem mit dem Code:

  • put-text-propertywird auf ein Objekt angewendet. In diesem Fall Ihre Zeichenfolge. Sie müssen es als letzten Parameter übergeben.
  • put-text-property beginnt bei null zu zählen.
  • Wenn font-lock-modeaktiviert, wird jeglicher Text der faceEigenschaft entfernt.

Der folgende Code funktioniert, wenn der Schriftsperrmodus deaktiviert ist:

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

Wenn Sie dies mit aktivierter Schriftsperre verwenden möchten, können Sie font-lock-facestattdessen die Eigenschaft festlegen . Es hat den gleichen Effekt, ist aber nicht betroffen von font-lock.

Lindydancer
quelle
Klare und vollständige Antwort.
Drew