Làm cách nào để chèn văn bản với một khuôn mặt cụ thể?


14

Tôi có một khuôn mặt, được tạo ra theo cách này:

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

Tôi muốn chèn một số văn bản với khuôn mặt đó. Nhưng những cách này chèn văn bản mà không có mặt:

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

Và thậm chí chèn văn bản trước, sau đó quay lại để đặt khuôn mặt trên đó không hoạt động:

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

Vấn đề không phải là định nghĩa của khuôn mặt, bởi vì nếu tôi đi tùy chỉnh nó, nó đã hiển thị với chiều cao gấp đôi. Mặc dù vậy, nội tuyến cũng không hoạt động:

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

Vì vậy, làm thế nào tôi có thể đưa vào một số văn bản với khuôn mặt cụ thể? Tôi biết tôi có thể sử dụng lớp phủ, nhưng điều đó có vẻ như quá mức vì nó dài dòng hơn, đòi hỏi phải chèn văn bản trước (vì vậy chúng tôi phải tìm ra kích thước và vị trí của văn bản được phủ lên) và yêu cầu tạo thêm rác thu thập.


2
Hãy thử các ví dụ trên ở chế độ cơ bản hoặc bất kỳ chế độ nào khác có khóa phông chữ bị tắt (chúng sẽ hoạt động tốt). Vấn đề là khóa phông chữ cũng sử dụng facecho mã tô sáng cú pháp, vì vậy nó đang thay thế thuộc tính khuôn mặt của bạn. Tôi chắc chắn phải có một số cách để vô hiệu hóa khóa phông chữ cho một văn bản nhất định nhưng tôi sẽ phải nghiên cứu mã một chút (không có thời gian ngay bây giờ). Có lẽ đọc font-lock.elmã sẽ cung cấp một số manh mối
Iqbal Ansari

Câu trả lời:


15

Có một số vấn đề với mã:

  • put-text-propertyđược áp dụng cho một đối tượng. Trong trường hợp này chuỗi của bạn. Bạn cần phải vượt qua nó như là tham số cuối cùng.
  • put-text-property bắt đầu đếm từ 0
  • Nếu font-lock-modeđược bật, nó sẽ loại bỏ bất kỳ văn bản nào của facetài sản.

Đoạn mã sau hoạt động, nếu chế độ khóa phông chữ bị tắt:

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

Nếu bạn muốn sử dụng tính năng này với chức năng khóa phông chữ, bạn có thể đặt thuộc tính font-lock-facethay thế. Nó có tác dụng tương tự nhưng không bị ảnh hưởng bởi font-lock.


Câu trả lời rõ ràng và đầy đủ.
vẽ
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.