Jak wstawić tekst z określoną twarzą?

15

Mam twarz stworzoną w ten sposób:

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

Chciałbym wstawić tekst z tą twarzą. Ale te sposoby wstawiają tekst bez twarzy:

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

Nawet wstawianie najpierw tekstu, a potem powrót do niego, nie działa:

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

Problemem nie jest definicja twarzy, ponieważ jeśli pójdę ją dostosować, to już pokazuje wysokość dwa razy większą. Mimo to pochylenie twarzy również nie działa:

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

Jak mogę wstawić tekst z określoną twarzą? Wiem, że mogę użyć nakładki, ale to wydaje się przesadne, ponieważ jest bardziej szczegółowe, wymaga najpierw wstawienia tekstu (więc musimy ustalić rozmiar i położenie tekstu do nałożenia) i wymaga zrobienia większej ilości śmieci Zebrane.

zck
źródło
2
Wypróbuj powyższe przykłady w trybie podstawowym lub dowolnym innym trybie z wyłączoną blokadą czcionek (działałyby dobrze). Problem polega na tym, że blokada czcionek używa również facekodu podświetlania składni, więc zastępuje on właściwość twarzy. Jestem pewien, że musi istnieć jakiś sposób, aby wyłączyć blokadę czcionek dla danego tekstu, ale będę musiał trochę zbadać kod (teraz nie ma czasu). Być może odczytanie font-lock.elkodu dałoby jakąś wskazówkę
Iqbal Ansari

Odpowiedzi:

16

Istnieje pewien problem z kodem:

  • put-text-propertyjest stosowany do obiektu. W tym przypadku twój ciąg. Musisz przekazać go jako ostatni parametr.
  • put-text-property zaczyna liczenie od zera.
  • Jeśli font-lock-modejest włączony, spowoduje usunięcie dowolnego tekstu facewłaściwości.

Poniższy fragment kodu działa, jeśli tryb blokowania czcionek jest wyłączony:

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

Jeśli chcesz tego używać z włączoną blokadą czcionek, możesz font-lock-facezamiast tego ustawić właściwość . Ma ten sam efekt, ale nie ma na niego wpływu font-lock.

Lindydancer
źródło
Jasna i pełna odpowiedź.
Drew