Làm cách nào để ghi đè khuôn mặt được xác định trước cho nền sáng và tối?


9

Tôi muốn sử dụng set-face-attributeđể chọn một trong hai màu cho nền trước tùy thuộc vào nền của chủ đề hiện tại là sáng hay tối.

Hành vi dự kiến ​​là tiền cảnh thay đổi tự động nếu tôi chuyển từ chủ đề nền sáng sang chủ đề nền tối hoặc ngược lại.

Đây là một trường hợp sử dụng:

Tôi tùy chỉnh khuôn mặt stripe-hl-linenhư sau:

 (set-face-attribute 'stripe-hl-line nil
                        :overline   "gray"
                        :underline  "gray"
                        :foreground "dodger blue")

Nhưng tôi muốn thay đổi tiền cảnh dựa trên chỉ khi chủ đề sáng hoặc tối. Bằng cách đó, tôi không phải lo lắng về việc tùy chỉnh khuôn mặt đó trong mỗi chủ đề.


Đó là điều thường được thực hiện trong định nghĩa chủ đề.
wasamasa

Mặc dù nó có thể trở nên phức tạp, nhưng có vẻ như bạn có thể sử dụng colorthư viện ở đây. Bạn có thể có thể nhận giá trị rgb hoặc hex của mặt nền, xác định một số giá trị ngưỡng cho "bóng tối" và đặt tiền cảnh tương ứng.
Dân

@wasamasa Vâng. Nhưng đối với một số khuôn mặt, tôi không quan tâm đến màu sắc của chúng là đặc trưng cho chủ đề. Tôi đã cập nhật câu hỏi của mình với một khuôn mặt mẫu mà tôi muốn tùy chỉnh.
Kaushal Modi

@Dan Điều gì sẽ là một cái móc thích hợp để đánh giá lại hex nền?
Kaushal Modi

đây là logic bạn có thể sử dụng `(defface thay đổi mặt '((((nền tối)): foreground" White ") (t: foreground" Black ")): nhóm' x-mode-face)` ... Vì nếu bạn muốn sử dụng khuôn mặt hiện có, thì bạn có thể thêm 2 dòng giữa vào biểu mẫu hủy kết nối hiện có.
Madhavan

Câu trả lời:


9

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.

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.