Bagaimana cara saya menyisipkan teks dengan wajah tertentu?

14

Saya punya wajah, dibuat dengan cara ini:

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

Saya ingin memasukkan beberapa teks dengan wajah itu. Tetapi cara-cara ini menyisipkan teks tanpa wajah:

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

Dan bahkan memasukkan teks terlebih dahulu, lalu kembali untuk meletakkan wajah di atasnya tidak berfungsi:

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

Masalahnya bukan definisi wajah, karena jika saya pergi untuk menyesuaikannya, itu sudah muncul dengan tinggi dua kali lebih besar. Meski begitu, meratakan wajah juga tidak bekerja:

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

Jadi bagaimana saya bisa memasukkan beberapa teks dengan wajah tertentu? Saya tahu saya bisa menggunakan overlay, tapi itu kelihatannya berlebihan karena lebih bertele-tele, membutuhkan teks yang akan disisipkan terlebih dahulu (jadi kita harus mencari tahu ukuran dan posisi teks yang akan dilapis) dan mengharuskan membuat lebih banyak sampah menjadi dikumpulkan.

kawan
sumber
2
Coba contoh di atas dalam mode fundamental atau mode lainnya dengan font-lock dinonaktifkan (semuanya akan berfungsi dengan baik). Masalahnya adalah bahwa font-lock juga digunakan faceuntuk kode penyorotan sintaks, jadi itu mengganti properti wajah Anda. Saya yakin pasti ada beberapa cara untuk menonaktifkan font-lock untuk teks yang diberikan tetapi saya harus meneliti sedikit kode (tidak ada waktu sekarang). Mungkin membaca font-lock.elkode akan memberikan petunjuk
Iqbal Ansari

Jawaban:

15

Ada beberapa masalah dengan kode:

  • put-text-propertyditerapkan ke suatu objek. Dalam hal ini string Anda. Anda harus meneruskannya sebagai parameter terakhir.
  • put-text-property mulai menghitung nol.
  • Jika font-lock-modediaktifkan, itu akan menghapus teks apa pun dari faceproperti.

Bagian kode berikut berfungsi, jika mode font-lock dinonaktifkan:

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

Jika Anda ingin menggunakan ini dengan kunci-huruf diaktifkan, Anda dapat mengatur properti font-lock-facesebagai gantinya. Ini memiliki efek yang sama tetapi tidak terpengaruh oleh font-lock.

Lindydancer
sumber
Jawaban yang jelas dan lengkap.
Drew