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


9

ฉันต้องการใช้set-face-attributeเพื่อเลือกหนึ่งในสองสีสำหรับพื้นหน้าขึ้นอยู่กับว่าพื้นหลังของชุดรูปแบบปัจจุบันนั้นสว่างหรือมืด

พฤติกรรมที่คาดหวังคือพื้นหน้าจะเปลี่ยนโดยอัตโนมัติหากฉันเปลี่ยนจากชุดรูปแบบพื้นหลังสีอ่อนเป็นชุดรูปแบบพื้นหลังสีเข้มหรือในทางกลับกัน

นี่คือกรณีการใช้งาน:

ฉันปรับแต่งหน้าใบหน้าstripe-hl-lineดังนี้:

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

แต่ฉันต้องการเปลี่ยนฉากหน้าโดยยึดตามถ้าธีมนั้นสว่างหรือมืด ด้วยวิธีนี้ฉันไม่ต้องกังวลกับการปรับแต่งใบหน้านั้นในแต่ละธีม


นั่นเป็นสิ่งที่ทำตามปกติในการกำหนดธีม
wasamasa

แม้ว่ามันอาจจะซับซ้อน แต่ดูเหมือนว่าคุณสามารถใช้ประโยชน์จากcolorห้องสมุดได้ที่นี่ คุณอาจได้รับ rgb หรือค่าฐานสิบหกของใบหน้าพื้นหลังกำหนดค่าเกณฑ์บางอย่างสำหรับ "มืด" และตั้งค่าเบื้องหน้า
แดน

@wasamasa ใช่ แต่สำหรับบางหน้าฉันไม่สนใจว่าสีของพวกเขาจะมีความเฉพาะเจาะจงกับธีม ฉันได้อัพเดตคำถามด้วยหน้าตัวอย่างที่ฉันต้องการปรับแต่ง
Kaushal Modi

@ ด่านอะไรจะเป็นตะขอที่เหมาะสมที่จะประเมิน hex พื้นหลัง?
Kaushal Modi

นี่คือตรรกะที่คุณสามารถใช้ `(defface changing-face '((((พื้นหลังมืด)): เบื้องหน้า" ขาว ")) (t: เบื้องหน้า" ดำ ")): กลุ่ม' x-mode-faces) '... เนื่องจากถ้าคุณต้องการใช้ใบหน้าที่มีอยู่คุณสามารถเพิ่มเส้นกลาง 2 ลงในแบบฟอร์ม defface ที่มีอยู่
Madhavan

คำตอบ:


9

ขอขอบคุณที่ @MadhavanKumar deffaceผมมุ่งเน้นไปที่การแก้ปัญหาทั้งปวงที่อยู่บนพื้นฐานของ

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

ฉันจะใช้ตัวอย่างเดียวกันของการเอาชนะstripe-hl-lineใบหน้าเพื่อแก้ปัญหา stripe-bufferใบหน้านี้ถูกกำหนดไว้ในแพคเกจ

นี่คือขั้นตอน:

ขั้นตอน 1. กำหนดของคุณเอง 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)

ซึ่งจะทำให้สีพื้นหน้าของmy/stripe-hl-lineใบหน้าเป็นสีฟ้าแก่สำหรับพื้นหลังสีเข้มและสีแดงสำหรับพื้นหลังสีอ่อน

ขั้นตอนที่ 2 สร้างฟังก์ชั่นเพื่อทำการแมปใบหน้าใหม่

face-remap-add-relativeฟังก์ชั่นที่ใช้ในการแมปที่มีอยู่เพื่อใบหน้าใบหน้าใหม่ ในกรณีนี้ฉันทำการแมปstripe-hl-lineหน้าmy/stripe-hl-lineใหม่อีกครั้ง

(defun my/stripe-hl-line-face-remap ()
  (face-remap-add-relative 'stripe-hl-line 'my/stripe-hl-line))

ขั้นตอนที่ 3 ทำการแมปที่ตำแหน่งที่เหมาะสม

จากstripe-bufferแหล่งที่มาฉันเห็นว่าhl-lineมีการแมปstripe-hl-lineใบหน้าอีกครั้ง ดังนั้นเราต้องทำการแมปใหม่หลังจากการแมปใหม่นั้นเกิดขึ้น (ซึ่งอยู่ในstripe-listify-bufferนิยามของฟังก์ชัน)

ดังนั้นเราจึงทำการแมปใหม่โดยการแนะนำให้stripe-listify-bufferใช้combinator:after advice

(advice-add 'stripe-listify-buffer :after #'my/stripe-hl-line-face-remap)

ทำ!

ที่กล่าวมามันจะยอดเยี่ยมมากที่จะใช้บางอย่างเช่นset-face-attributeตั้งค่าใบหน้าโดยตรงตามความมืดของพื้นหลัง

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