मैं प्रकाश और अंधेरे पृष्ठभूमि के लिए पूर्व-परिभाषित चेहरे को कैसे ओवरराइड कर सकता हूं?


9

मैं set-face-attributeअग्रभूमि के लिए दो रंगों में से किसी एक को चुनने के लिए उपयोग करना चाहूंगा या नहीं, इस पर निर्भर करता है कि वर्तमान विषय की पृष्ठभूमि हल्की है या अंधेरे।

अपेक्षित व्यवहार यह है कि अग्रभूमि स्वचालित रूप से बदल जाता है अगर मैं एक हल्के पृष्ठभूमि विषय से एक अंधेरे पृष्ठभूमि विषय या इसके विपरीत में स्विच करता हूं।

यहाँ एक उपयोग मामला है:

मैं stripe-hl-lineनिम्नानुसार चेहरे को अनुकूलित करता हूं :

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

लेकिन मैं विषय के प्रकाश या अंधेरे होने के आधार पर अग्रभूमि को बदलना चाहूंगा। इस तरह मुझे प्रत्येक विषय में उस चेहरे को अनुकूलित करने के बारे में चिंता करने की आवश्यकता नहीं है।


यह सामान्य रूप से थीम की परिभाषा में किया गया है।
वामासा

यद्यपि यह जटिल हो सकता है, ऐसा लगता है कि आप colorयहां पुस्तकालय का उपयोग कर सकते हैं। आप संभवतः पृष्ठभूमि चेहरे का आरजीबी या हेक्स मूल्य प्राप्त कर सकते हैं, "अंधेरे" के लिए कुछ सीमा मूल्य निर्धारित कर सकते हैं, और तदनुसार अग्रभूमि निर्धारित कर सकते हैं।
दान

@ वासमासा होय। लेकिन कुछ चेहरों के लिए, मुझे उनके रंग के विषय के लिए विशिष्ट होने की परवाह नहीं है। मैंने अपना प्रश्न एक ऐसे उदाहरण चेहरे के साथ अद्यतन किया है जिसे मैं अनुकूलित करना चाहता हूं।
कौशल मोदी

@ क्या पृष्ठभूमि हेक्स का पुनर्मूल्यांकन करने के लिए एक उपयुक्त हुक होगा?
कौशल मोदी

यह वह तर्क है जिसका उपयोग आप '(डिफेस चेंजिंग-फेस' (((बैकग्राउंड डार्क)): फोरग्राउंड "व्हाइट") (t: फोरग्राउंड "ब्लैक") कर सकते हैं: ग्रुप 'x-मोड-फेस') `... चूंकि यदि आप मौजूदा चेहरे का उपयोग करना चाहते हैं, तो आप मौजूदा 2 लाइनों को मौजूदा डीफेस फॉर्म में जोड़ सकते हैं।
माधवन

जवाबों:


9

@MadhavanKumar के लिए धन्यवाद, मैंने इसके आधार पर एक समाधान निकालने पर ध्यान केंद्रित किया 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उपयोग की सलाह देकर अपना रीमैपिंग करते हैं ।:after advice

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

किया हुआ!

उस ने कहा, यह set-face-attributeपृष्ठभूमि अंधेरे के आधार पर चेहरे सेट करने के लिए सीधे कुछ का उपयोग करने के लिए भयानक होगा ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.