प्रसंग
मैं emacs क्लाइंट / सर्वर कॉन्फ़िगरेशनafter-make-frame-functions
में थीम को ठीक से लोड करने के लिए हुक का उपयोग कर रहा हूं । विशेष रूप से यह कोड स्निपेट है जिसे मैं बनाने के लिए उपयोग करता हूं (इस एसओ उत्तर में आधारित ):
(if (daemonp)
(add-hook 'after-make-frame-functions
(lambda (frame)
(select-frame frame)
(load-theme 'monokai t)
;; setup the smart-mode-line and its theme
(sml/setup)))
(progn (load-theme 'monokai t)
(sml/setup)))
समस्या
जब एक नया emacsclient -c/t
सत्र शुरू किया जाता है तो हुक को न केवल नए फ्रेम में निष्पादित किया जाता है, बल्कि पिछले सभी मौजूदा फ़्रेमों (अन्य इमैसेक्लिएंट सत्र) में और यह बहुत कष्टप्रद दृश्य प्रभाव बनाता है (उन सभी फ़्रेमों में थीम फिर से लोड किए जाते हैं) । इससे भी बदतर, टर्मिनल ग्राहकों में पहले से ही खोला विषय रंग पूरी तरह से गड़बड़ हो। जाहिर है कि केवल emacs क्लाइंट पर ही emacs सर्वर से जुड़ा होता है। इस व्यवहार का कारण स्पष्ट है, हुक सर्वर पर चलाया जाता है और इसके सभी क्लाइंट प्रभावित होते हैं।
प्रश्न
क्या इस फ़ंक्शन को केवल एक बार निष्पादित करने या हुक का उपयोग किए बिना एक ही परिणाम प्राप्त करने का कोई तरीका है?
एक आंशिक समाधान
मेरे पास अब यह कोड है, @ ड्रू के उत्तर के लिए धन्यवाद। लेकिन अभी भी एक समस्या है, एक बार जब आप टर्मिनल में एक ग्राहक सत्र शुरू करते हैं, तो जीयूआई विषयों को ठीक से लोड नहीं करता है और इसके विपरीत। बहुत सारे परीक्षणों के बाद, मुझे एहसास हुआ कि व्यवहार इस बात पर निर्भर करता है कि कौन सा क्षीणता पहले शुरू होती है, और विभिन्न चीजों को त्यागने के बाद, मुझे लगता है कि यह शायद रंग पैलेट से संबंधित है जो भरी हुई है। यदि आप मैन्युअल रूप से थीम को पुनः लोड करते हैं, तो सभी ठीक काम करते हैं और यही कारण है कि जब मेरे प्रारंभिक कॉन्फ़िगरेशन में फ़ंक्शन द्वारा हर बार हुक द्वारा कॉल किया जाता है तो यह व्यवहार प्रकट नहीं होता है।
(defun emacsclient-setup-theme-function (frame)
(progn
(select-frame frame)
(load-theme 'monokai t)
;; setup the smart-mode-line and its theme
(sml/setup)
(remove-hook 'after-make-frame-functions 'emacsclient-setup-theme-function)))
(if (daemonp)
(add-hook 'after-make-frame-functions 'emacsclient-setup-theme-function)
(progn (load-theme 'monokai t)
(sml/setup)))
अंतिम समाधान
अंत में मेरे पास पूरी तरह से काम करने वाला कोड है जो आंशिक समाधान में देखे गए व्यवहार को हल करता है, इसे प्राप्त करने के लिए मैं फ़ंक्शन को एक बार मोड (टर्मिनल या गुई) से चलाता हूं, जब पहली बार पर्टिकेंट इमैसेक्लाइंट शुरू होता है, तो हुक से फ़ंक्शन को हटा दें क्योंकि यह है किसी और की जरूरत नहीं। अब में खुश हूँ! :) फिर से धन्यवाद @ आकर्षित!
कोड:
(setq myGraphicModeHash (make-hash-table :test 'equal :size 2))
(puthash "gui" t myGraphicModeHash)
(puthash "term" t myGraphicModeHash)
(defun emacsclient-setup-theme-function (frame)
(let ((gui (gethash "gui" myGraphicModeHash))
(ter (gethash "term" myGraphicModeHash)))
(progn
(select-frame frame)
(when (or gui ter)
(progn
(load-theme 'monokai t)
;; setup the smart-mode-line and its theme
(sml/setup)
(sml/apply-theme 'dark)
(if (display-graphic-p)
(puthash "gui" nil myGraphicModeHash)
(puthash "term" nil myGraphicModeHash))))
(when (not (and gui ter))
(remove-hook 'after-make-frame-functions 'emacsclient-setup-theme-function)))))
(if (daemonp)
(add-hook 'after-make-frame-functions 'emacsclient-setup-theme-function)
(progn (load-theme 'monokai t)
(sml/setup)))