เนื่องจากมีสิ่งที่ต้องทำมากกว่าเริ่มต้นเพียงแค่โหลดไฟล์และในทางกลับกันการเชื่อมโยง.emacs.d
หรือการHOME
เปลี่ยนแปลงการเปลี่ยนแปลงสภาพแวดล้อมรันไทม์ของฉันฉันเลือกใช้ตัวแปรที่ @glucas เสนอ ฉันใช้รหัสจากstartup.el
และเพิ่มแพตช์จาก# 15539เพื่อใช้ตัวแปรสภาพแวดล้อมสำหรับการสลับไปมาระหว่าง dirs ที่แตกต่างกัน หากไม่ได้ระบุจะใช้ค่าเริ่มต้น
มีปัญหาหนึ่งคือ spacemacs: async
ไม่ทราบเกี่ยวกับไดเรกทอรี init ที่มีการเปลี่ยนแปลงดังนั้นจึงไม่สามารถหาไฟล์ที่จำเป็นได้ แต่สิ่งนี้ได้รับการแก้ไขใน spacemacs เมื่อเร็ว ๆ นี้: เกิดข้อผิดพลาดเมื่อใช้ไดเรกทอรีการตั้งค่าอื่นนอกเหนือจาก. emacs.d ·ปัญหา # 3390
ดังนั้นนี่คือของฉัน~/.emacs
ที่ควรทำตัวเหมือนรหัสเริ่มต้นดั้งเดิม แต่มีไดเรกทอรีเริ่มต้นที่กำหนดค่าได้:
;;; .emacs --- let the user choose the emacs environment to use
;;; Commentary:
;;; This code mimics the behaviour of `startup.el' to let the
;;; usage of the custom init directory behave just like the
;;; one and only "~/.emacs.d".
;;;
;;; By setting the environment variable `EMACS_USER_DIRECTORY'
;;; the user-emacs-directory can be chosen and if there is an
;;; `init.el' the configuration from that directory will be used.
;;; If the environment variable is not set or there is no `init.el'
;;; the default configuration directory `~/.emacs.d/' will be used.
;;;
;;; The variable `server-name' will be set to the name of the directory
;;; chosen as start path. So if the server will be started, it can be
;;; reached with 'emacsclient -s servername'.
;;;
;;; This now works with a current version of spacemacs but does not
;;; work with `async-start' in general, if the code executed with `async'
;;; uses `user-init-dir' or makes other assumptions about the emacs
;;; start-directory.
;;; Code:
(let* ((user-init-dir-default
(file-name-as-directory (concat "~" init-file-user "/.emacs.d")))
(user-init-dir
(file-name-as-directory (or (getenv "EMACS_USER_DIRECTORY")
user-init-dir-default)))
(user-init-file-1
(expand-file-name "init" user-init-dir)))
(setq user-emacs-directory user-init-dir)
(with-eval-after-load "server"
(setq server-name
(let ((server--name (file-name-nondirectory
(directory-file-name user-emacs-directory))))
(if (equal server--name ".emacs.d")
"server"
server--name))))
(setq user-init-file t)
(load user-init-file-1 t t)
(when (eq user-init-file t)
(setq user-emacs-directory user-init-dir-default)
(load (expand-file-name "init" user-init-dir-default) t t)))
(provide '.emacs)
;;; .emacs ends here
นอกจากนี้ยังมีการเพิ่มที่ดีที่ทำให้มันทำงานเป็น daemon ได้โดยไม่ต้องใช้ความพยายามเพิ่มเติม: ชื่อเซิร์ฟเวอร์จะถูกตั้งค่าเป็นชื่อของไดเรกทอรี init ดังนั้นตอนนี้คุณสามารถเริ่มต้น emacs daemon ที่สองด้วยวานิลลาสเปซแม็ค
EMACS_USER_DIRECTORY=~/.emacsenv.d/spacemacs emacs --daemon
และยังคงใช้ emacsclient
emacsclient -s spacemacs -c -e '(message "Hello spacemacs")'
usecase ของฉันนั้นง่ายมากและฉันประหลาดใจที่ฉันเป็นคนเดียว: ฉันมี emacs daemon ที่ทำงานอยู่ตลอดเวลาและใช้มันจาก gui และบนคอนโซล (พร้อมด้วย ssh เป็นต้น) ใน emacs นี้ฉันเตรียมเอกสารและบันทึกการทำงานทั้งหมดของฉันดังนั้นจึงต้องมีตลอดเวลา แต่จากนั้นฉันต้องการลองใช้ spacemacs หรือแพ็คเกจการกระจายอื่นอย่างใดอย่างหนึ่งและตั้งค่ามันจนกว่าฉันจะสามารถกำหนดค่าปัจจุบันของฉันออกไปหรือใช้ความคิดที่ฉลาดบางอย่าง และในขณะที่คนอื่น ๆ ฉันต้องการสร้างการกำหนดค่าพื้นฐานที่เรียบง่ายสำหรับผู้ร่วมงานของฉัน - และจัดทำเอกสารด้วยโหมดองค์กรในอินสแตนซ์ที่ใช้งานอยู่
เนื่องจากปัญหาเดียวที่ฉันรู้คือasync
และไม่ทราบเกี่ยวกับผู้เริ่มต้นที่เปลี่ยนแปลงฉันจึงคิดถึงวิธีที่ดีที่สุดในการเพิ่มการกำหนดค่าบางอย่างasync
ที่มีตัวแปรที่ควรฉีดโดยค่าเริ่มต้นดังนั้นจึงไม่จำเป็นต้องแก้ไขทั้งหมด การเรียกใช้async-start
Spacemacs ได้ทำไปแล้ว