Bağlam
after-make-frame-functions
Bir emacs istemci / sunucu yapılandırmasında temaları düzgün yüklemek için kanca kullanıyorum . Özellikle bu yapmak için kullandığım kod snippet (bu SO cevabına dayanarak ):
(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)))
Sorun
Yeni bir emacsclient -c/t
oturum başlatıldığında, kanca yalnızca yeni çerçevede değil, önceki tüm karelerde (diğer emacclient oturumları) yürütülür ve çok can sıkıcı bir görsel efekt oluşturur (temalar tüm bu karelere yeniden yüklenir) . Daha da kötüsü, terminal istemcilerinde zaten açılan tema rengi tamamen berbat oluyor. Açıkçası bu sadece aynı emacs sunucusuna bağlı emacs istemcilerinde olur. Bu davranışın nedeni açıktır, kanca sunucuda çalıştırılır ve tüm istemcileri etkilenir.
Soru
Kanca kullanmadan bu işlevi yalnızca bir kez yürütmenin veya aynı sonucu almanın herhangi bir yolu var mı?
Kısmi bir çözüm
@ Drew'un cevabı sayesinde şimdi bu kod var. Ancak yine de bir sorun var, terminalde bir istemci oturumu başlattığınızda, GUI temaları düzgün yüklemez ve bunun tersi de geçerlidir. Birçok testten sonra, davranışın ilk önce hangi emacsclient'in başladığına bağlı olduğunu fark ettim ve çeşitli şeyleri attıktan sonra, bunun yüklü renk paleti ile ilgili olduğunu düşünüyorum. Elle yeniden yüklerseniz, tema iyi çalışır ve bu nedenle, ilk yapılandırmamda olduğu gibi işlev her seferinde kanca tarafından çağrıldığında bu davranışın görünmemesinin nedeni budur.
(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)))
Son çözüm
Sonunda, kısmi çözümde görülen davranışı çözen tamamen çalışma kodum var, bunu başarmak için işlevi bir kez mod (terminal veya gui) ile çalıştırıyorum, sonra ilgili emacclient ilk kez başlatıldığında, daha sonra işlevi kancadan çıkarın çünkü artık gerek yok. Şimdi mutluyum! :) Tekrar teşekkürler @Drew!
Kod:
(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)))