প্রসঙ্গ
আমি ইমাস ক্লায়েন্ট / সার্ভার কনফিগারেশনে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
সেশন শুরু হয় হুক মৃত্যুদন্ড কার্যকর করা হয় না শুধুমাত্র নতুন ফ্রেমে কিন্তু সমস্ত পূর্ববর্তী অস্তিত্ব ফ্রেম (অন্যান্য মধ্যে emacsclient সেশন) এবং এটি একটি খুব বিরক্তিকর ভিজ্যুয়াল ইফেক্ট (থিম ঐ সমস্ত ফ্রেম মধ্যে আবার লোড করা হয়) করে তোলে । আরও খারাপ, টার্মিনালের ক্লায়েন্টরা ইতিমধ্যে খোলা থিমের রঙটি পুরোপুরি মিশে গেছে। স্পষ্টতই এটি একই ইমাস সার্ভারের সাথে সংযুক্ত ইম্যাক্স ক্লায়েন্টগুলিতে ঘটে। এই আচরণের কারণ স্পষ্ট, হুকটি সার্ভারে চালিত হয় এবং এর সমস্ত ক্লায়েন্ট প্রভাবিত হয়।
প্রশ্নটি
এই ফাংশনটি শুধুমাত্র একবার চালানো বা হুক ব্যবহার না করে একই ফলাফল পাওয়ার কোনও উপায় আছে?
একটি আংশিক সমাধান
@ ড্র এর উত্তরের জন্য ধন্যবাদ আমার কাছে এখন এই কোডটি রয়েছে। তবে এখনও সমস্যা আছে, একবার আপনি টার্মিনালে ক্লায়েন্ট সেশন শুরু করার পরে, জিইউআই সঠিকভাবে থিমগুলি লোড করে না এবং বিপরীতে। অনেক পরীক্ষার পরে, আমি বুঝতে পেরেছিলাম যে আচরণটি নির্ভর করে প্রথমে কোন ইমাস্ক্লিভেন্টটি শুরু হয় এবং বিভিন্ন জিনিস ফেলে দেওয়ার পরে, আমি মনে করি এটি সম্ভবত রঙিন প্যালেটটি বোঝানো হয়েছে is আপনি যদি ম্যানুয়ালি থিমটি পুনরায় লোড করেন তবে সমস্ত ঠিকঠাক কাজ করে এবং এই কারণটি যখন আমার প্রাথমিক কনফিগারেশনের মতো প্রতিবার হুক দ্বারা ডাকা হয় তখন এই আচরণটি উপস্থিত হয় না not
(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)))