ฉันจะแทรกข้อความด้วยใบหน้าที่เฉพาะเจาะจงได้อย่างไร


15

ฉันมีใบหน้าสร้างด้วยวิธีนี้:

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

ฉันต้องการแทรกข้อความด้วยใบหน้านั้น แต่วิธีเหล่านี้แทรกข้อความโดยไม่มีใบหน้า:

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

และแม้แต่การแทรกข้อความก่อนจากนั้นกลับไปใส่หน้ามันไม่ทำงาน:

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

ปัญหาไม่ได้เป็นคำจำกัดความของหน้าเพราะถ้าฉันไปปรับแต่งมันก็แสดงให้เห็นแล้วด้วยความสูงเป็นสองเท่า ดังนั้นการฝังใบหน้าก็ไม่ได้ผล:

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

ดังนั้นฉันจะใส่ข้อความลงไปด้วยใบหน้าที่เฉพาะเจาะจงได้อย่างไร? ฉันรู้ว่าฉันสามารถใช้การซ้อนทับได้ แต่ดูเหมือนว่าเกินความจริงเพราะมันละเอียดมากขึ้นต้องมีการแทรกข้อความก่อน (ดังนั้นเราต้องหาขนาดและตำแหน่งของข้อความที่จะวางทับ) และต้องทำให้ขยะมากขึ้น เก็บรวบรวม


2
ลองตัวอย่างข้างต้นในโหมดพื้นฐานหรือโหมดอื่น ๆ ที่ปิดใช้งานแบบอักษร - ล็อค (มันจะทำงานได้ดี) ปัญหาคือตัวล็อคแบบอักษรใช้faceสำหรับการเน้นรหัสทางไวยากรณ์ดังนั้นจึงเป็นการแทนที่คุณสมบัติใบหน้าของคุณ ฉันแน่ใจว่าต้องมีวิธีการปิดใช้งานแบบอักษรสำหรับข้อความที่ระบุ แต่ฉันจะต้องค้นคว้ารหัสเล็กน้อย (ไม่มีเวลาตอนนี้) บางทีการอ่านfont-lock.elรหัสอาจให้เบาะแส
Iqbal Ansari

คำตอบ:


16

มีปัญหาบางอย่างกับรหัส:

  • put-text-propertyถูกนำไปใช้กับวัตถุ ในกรณีนี้สตริงของคุณ คุณต้องผ่านมันเป็นพารามิเตอร์ตัวสุดท้าย
  • put-text-property เริ่มนับที่ศูนย์
  • หากfont-lock-modeเปิดใช้งานมันจะตัดข้อความของfaceคุณสมบัติใด ๆ

ส่วนของรหัสต่อไปนี้ใช้งานได้หากปิดใช้งานโหมดล็อคแบบอักษร:

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

หากคุณต้องการใช้สิ่งนี้เมื่อเปิดใช้งานฟอนต์ล็อคคุณสามารถตั้งค่าคุณสมบัติfont-lock-faceแทน แต่ก็มีผลเช่นเดียวกัน font-lockแต่ไม่ได้รับผลกระทบจาก


คำตอบที่ชัดเจนและสมบูรณ์
ดึง
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.