Nhờ @MadhavanKumar, tôi tập trung vào việc tìm ra giải pháp dựa trên defface.
Tôi nhận ra rằng tôi không thể ghi đè lên hiện tại deffacenhưng tôi luôn có thể tạo màu nền nhạy cảm của riêng mình defface. Sau đó, câu hỏi duy nhất là làm thế nào để sử dụng defface tùy chỉnh của tôi thay vì ban đầu.
Tôi sẽ sử dụng cùng một ví dụ về ghi đè stripe-hl-linekhuôn mặt để đi qua giải pháp. Khuôn mặt này được xác định trong gói stripe-buffer.
Dưới đây là các bước:
Bước 1. Xác định của riêng bạn defface
(defface my/stripe-hl-line
'((((background dark)) (:overline "gray" :underline "gray" :foreground "dodger blue"))
(t (:overline "gray" :underline "gray" :foreground "red")))
"Bold face for highlighting the current line in Hl-Line mode."
:group 'stripe-buffer)
Điều này sẽ dẫn đến màu nền trước của my/stripe-hl-linemặt là màu xanh lam cho nền tối và màu đỏ cho nền sáng.
Bước 2. Tạo một chức năng để ánh xạ lại khuôn mặt
Các face-remap-add-relativechức năng được sử dụng để remap một khuôn mặt hiện có để một khuôn mặt mới. Trong trường hợp này, tôi đang ánh xạ lại stripe-hl-linekhuôn mặt my/stripe-hl-line.
(defun my/stripe-hl-line-face-remap ()
(face-remap-add-relative 'stripe-hl-line 'my/stripe-hl-line))
Bước 3. Thực hiện ánh xạ lại ở vị trí thích hợp
Từ stripe-buffernguồn, tôi thấy rằng hl-linekhuôn mặt được ánh xạ lại để stripe-hl-lineđối mặt. Vì vậy, chúng ta cần thực hiện ánh xạ lại sau khi ánh xạ đó xảy ra (nằm trong stripe-listify-bufferđịnh nghĩa hàm).
Vì vậy, chúng tôi thực hiện ánh xạ lại bằng cách tư vấn stripe-listify-buffersử dụng bộ kết hợp.:after advice
(advice-add 'stripe-listify-buffer :after #'my/stripe-hl-line-face-remap)
Làm xong!
Điều đó nói rằng, sẽ thật tuyệt vời khi trực tiếp sử dụng một cái gì đó như set-face-attributeđể đặt khuôn mặt dựa trên bóng tối nền.