บริบท
ฉันใช้after-make-frame-functions
เบ็ดโหลดอย่างถูกต้องในรูปแบบนั้นกำหนดค่าไคลเอ็นต์ emacs / เซิร์ฟเวอร์ โดยเฉพาะนี่คือข้อมูลโค้ดที่ฉันใช้ในการสร้าง (ตามคำตอบ SOนี้):
(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ครั้ง) และมันทำให้ผลภาพที่น่ารำคาญมาก (รูปแบบที่มีการโหลดอีกครั้งในเฟรมทุกคน) ที่แย่ยิ่งกว่านั้นในไคลเอนต์เครื่องเทอร์มินัลได้เปิดสีของชุดรูปแบบเรียบร้อยแล้ว เห็นได้ชัดว่าเกิดขึ้นเฉพาะในไคลเอนต์ emacs ที่เชื่อมต่อกับเซิร์ฟเวอร์ emacs เดียวกัน สาเหตุของพฤติกรรมนี้ชัดเจน hook ถูกเรียกใช้บนเซิร์ฟเวอร์และไคลเอ็นต์ทั้งหมดได้รับผลกระทบ
คำถาม
มีวิธีการใช้งานฟังก์ชั่นนี้เพียงครั้งเดียวหรือได้รับผลลัพธ์เดียวกันโดยไม่ต้องใช้เบ็ดหรือไม่?
ทางออกบางส่วน
ฉันมีรหัสนี้แล้วขอบคุณคำตอบของ @ Drew แต่ยังคงมีปัญหาเมื่อคุณเริ่มเซสชันไคลเอ็นต์ในเทอร์มินัล GUI ไม่โหลดธีมอย่างถูกต้องและในทางกลับกัน หลังจากการทดสอบหลายครั้งฉันรู้ว่าพฤติกรรมขึ้นอยู่กับว่า emacsclient เริ่มก่อนและหลังจากทิ้งสิ่งต่าง ๆ ฉันคิดว่ามันอาจเกี่ยวข้องกับจานสีที่บรรจุอยู่ หากคุณโหลดธีมเองใหม่ทั้งหมดจะทำงานได้ดีและนั่นเป็นสาเหตุที่พฤติกรรมนี้ไม่ปรากฏเมื่อมีการเรียกใช้ฟังก์ชันโดย hook ทุกครั้งเช่นเดียวกับในการกำหนดค่าเริ่มต้นของฉัน
(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)))
ทางออกสุดท้าย
ในที่สุดฉันมีรหัสการทำงานทั้งหมดที่แก้พฤติกรรมที่เห็นในการแก้ปัญหาบางส่วนเพื่อให้บรรลุนี้ฉันเรียกใช้ฟังก์ชั่นครั้งเดียวโดยโหมด (terminal หรือกุย) เมื่อนั้น emacsclient ที่เกี่ยวข้องจะเริ่มขึ้นเป็นครั้งแรกแล้วเอาฟังก์ชั่น ไม่จำเป็นอีกต่อไป ตอนนี้ฉันมีความสุข! :) ขอขอบคุณอีกครั้ง @Drew!
รหัส:
(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)))