การเรียกใช้ spacemacs ข้าง emacs ปกติ: วิธีแยก. emacs.d แยกต่างหาก


32

ฉันต้องการลองใช้ spacemacs แต่ฉันยังไม่ต้องการเปลี่ยนจากการกำหนดค่า emacs ปกติของฉันดังนั้นฉันต้องการให้การกำหนดค่าที่อยู่ในของฉัน.emacs.dอยู่ในไดเรกทอรีเดียวและการกำหนดค่าที่เทียบเท่าสำหรับ spacemacs จะอยู่ในไดเรกทอรีอื่น ฉันไม่สนใจว่าชื่อใดไดเรกทอรีใดมี

เป็นไปได้หรือไม่ที่ chroots / LD_PRELOAD / กลอุบายอื่น ๆ ฉันจะทำมันได้อย่างไร


2
ดูคำตอบของ Dan สำหรับคำถามที่คล้ายกันที่ฉันมีเกี่ยวกับการตั้งเวลาด้วยตัวเลือกเมื่อ Emacs เริ่มทำงาน: emacs.stackexchange.com/questions/3588/ ...... ฉันได้ใช้คำตอบนั้นมาตั้งแต่แรกแล้ว
กฎหมาย

1
ในหมวดหมู่ของ "กลอุบายอื่น ๆ " บางทีคุณสามารถสร้าง symlink ที่spacemacsชี้ไปที่ emacs ที่ปฏิบัติการได้และใช้ค่าของ(car command-line-args)การตัดสินใจว่าไฟล์ init ใดที่จะเรียกใช้ แน่นอนว่าคุณกำลังทำงานบนระบบยูนิกซ์นอกเหนือจาก OS X (วิธีที่แอปบันเดิลทำงานบน OS X ทำให้เคล็ดลับนี้ยากที่จะดำเนินการ)
Harald Hanche-Olsen

1
ดูวิธีอื่นได้ที่นี่: emacs.stackexchange.com/q/4253/780
ลูกัส

2
ฉันเพิ่งกลับมาบอกว่าประมาณ 18 เดือนต่อมานี่เป็นเหตุผลที่ฉันไม่ได้เรียนรู้ spacemacs ฉันมีปัญหานิดหน่อยกับคำตอบที่ยอมรับแล้วลองอีกครั้งยังคงเป็นจริง หลังจากที่เพิ่มเลเยอร์ org ได้รับ "การกำหนดฟังก์ชั่นของ Symbol เป็นโมฆะ: วน" ในขณะนี้ ฉันไม่ทราบว่านี่เป็นส่วนหนึ่งของสาเหตุ แต่เป็นปัญหาที่เกิดขึ้นจริง: สำหรับโครงการ "รวมแบตเตอรี่" ที่ขัดมันดูเหมือนว่าจะต้องมีบางสิ่งบางอย่างเข้าด้วยกันเพื่อเริ่มกันแล้วสงสัยว่าการตั้งค่าของฉันรองรับหรือไม่ อาจไม่ยุติธรรม แต่นั่นทำให้ฉันหมดความเชื่อถือ อาจจะได้รับการแก้ไขในอีก 18 เดือนข้างหน้า ...
Croad Langshan

คำตอบ:


20

ทางเลือกหนึ่งคือการระบุการกำหนดค่าที่คุณต้องการโหลดใน~/.emacsไฟล์ เมื่อ Emacs ~/.emacs.d/เริ่มขึ้นก็จะมองหาไฟล์ดังกล่าวก่อนที่จะมองใน สำหรับรายละเอียดเพิ่มเติมคุณสามารถอ่านเกี่ยวกับไฟล์ Initในคู่มือ Emacs

ตัวอย่างเช่นคุณอาจสร้าง~/.spacemacs.dและรักษาสิ่งที่มีอยู่~/.emacs.dตามเดิม จากนั้นสร้าง a ~/.emacsเพื่อโหลดสิ่งที่คุณอยู่ในอารมณ์ที่จะใช้:

(setq use-spacemacs t)   ; or nil 

(when use-spacemacs
  (setq user-emacs-directory "~/.spacemacs.d/"))   ; defaults to ~/.emacs.d/

(load (expand-file-name "init.el" user-emacs-directory))

หากคุณต้องการคุณสามารถหาวิธีสลับการกำหนดค่าโดยไม่ต้องแก้ไขไฟล์. emacs ตัวอย่างเช่นให้. emacs ของคุณตรวจสอบตัวแปรสภาพแวดล้อมบางอย่างที่คุณตั้งไว้ในเชลล์หรือในสคริปต์ที่คุณใช้เพื่อเริ่ม spacemacs:

(setq use-spacemacs (getenv "USE_SPACEMACS"))

1
แน่นอนว่าต้องมีทางจากภายใน elisp เพื่อบอกว่าคุณกำลังใช้ spacemacs หรือไม่? ตัวอย่างเช่นโดยการตรวจสอบ (กับfboundp) สำหรับฟังก์ชั่นหรือคำสั่งที่ไม่ซ้ำกับ spacemacs?
Harald Hanche-Olsen

2
แน่นอน แต่นั่นไม่ใช่คำถามที่ฉันเข้าใจ Spacemacs เป็นเพียงการกำหนดค่า emacs และ OP ต้องการทราบวิธีการดูแลรักษา emacs อิสระมากกว่าหนึ่งตัว
ลูกัส

1
@ HaraldHanche-Olsen ที่ทำให้ฉันประหลาดใจเหมือนกันเมื่อฉันดาวน์โหลดมัน แต่เมื่อฉันคิดเกี่ยวกับมันมันทำให้รู้สึกทั้งหมด ฉันคิดว่าเหตุผลที่เราคาดว่านั่นคือสำหรับระบบส่วนใหญ่เพื่อให้ 'ผลิตภัณฑ์' ขัดเงาเหมือน spacemacs ดูเหมือนจะเป็นสิ่งที่จำเป็นในการคลี่คลายภาษาระบบระดับล่างบางส่วน - แต่ใน emacs มีการขยายมาก (ขอบคุณ elisp) ที่ไม่จำเป็น
Croad Langshan

1
ฉันยอมรับสิ่งนี้ แต่ไม่ได้ลองจริง ตอนนี้ฉันมีมันไม่ทำงานตามที่เป็นอยู่: ข้อผิดพลาดของไฟล์: ไม่สามารถเปิดไฟล์โหลด /home/me/.emacs.d/core/core-load-paths.el - ฉันต้องการเพื่อ(setq user-emacs-directory "~/.spacemacs.d/")ให้มัน ทำงาน (ในprognสาขา spacemacs ตามเงื่อนไขของคุณ) คุณสามารถเพิ่มสิ่งนั้นลงในคำตอบของคุณเพื่อให้ฉันสามารถยอมรับได้อีกครั้ง?
Croad Langshan

2
@glucas ฉันใช้ win10 ด้วยเหตุผลบางประการ HOME ได้รับมอบหมายให้ c: / users / nate ลบตัวแปรสภาพแวดล้อมและทุกอย่างทำงานได้ดี
นาธาเนียลแซ็กซ์

12

เนื่องจากมีสิ่งที่ต้องทำมากกว่าเริ่มต้นเพียงแค่โหลดไฟล์และในทางกลับกันการเชื่อมโยง.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-startSpacemacs ได้ทำไปแล้ว


นี้เป็นที่น่ารักจริงๆและทำงานสวยงาม ... asyncจนกระทั่งฉันต้องการที่จะใช้ :-( เนื่องจากเป็นเวลาไม่กี่เดือนนับตั้งแต่ที่คุณโพสต์คุณมีวิธีแก้ปัญหาหรือไม่
Trey

น่าเสียดายที่ไม่ใช่ - แต่สำหรับ spacemac นั้นได้รับการแก้ไขแล้วและสำหรับ async ทั่วไปฉันไม่แน่ใจว่าจะต้องมีการเปลี่ยนแปลงใด ๆ เพราะasync-startเริ่ม emacs โดยไม่มีอะไรและถ้าคุณต้องการใช้ตัวแปรบางตัวคุณต้องผ่านมัน แต่แน่นอนว่ามันจะ จะดีและสะดวกสบายถ้า async async-startสามารถกำหนดค่ากับรายการของตัวแปรที่จะใช้ในการภาวนาของทุก
Uwe Koloska

1
ด้วยวิธีนี้อาจมีตัวแปรอื่น ๆ ที่เริ่มต้นจากไดเรกทอรีผู้ใช้ emacs-default ก่อนที่จะโหลด. emacs ของคุณ ตัวอย่างเช่นฉันต้องการเพิ่ม(setq custom-theme-directory user-emacs-directory)ที่นี่
ลูกัส

1
ฉันไม่ทราบว่าตัวแปรนี้ตั้งอยู่ที่ใดเพราะเมื่อฉันตรวจสอบภายใน testenv ที่น้อยที่สุดฉันจะได้รับ: ค่าของมันคือ "~ / .emacs.d /" ค่าดั้งเดิมคือ "~ / .emacsenv.d / init-test /"ดังนั้นมันจึงมีค่าที่ถูกต้อง แต่นี่ถูกเขียนทับ
Uwe Koloska

1
ฉันลงเอยด้วยการใช้คำตอบนี้จริง ๆ หลังจากฉันถามคำถาม ฉันไม่ได้เปลี่ยนคำตอบที่ยอมรับเพราะมันนานมากและเพราะฉันไม่ได้ให้ความสนใจกับการติดตั้งจริง ๆ ! คำตอบนี้มีประโยชน์กับฉันมาก
Croad Langshan

5

มีการอธิบายที่นี่และมีการประชาสัมพันธ์อย่างต่อเนื่องเพื่อเพิ่มไปยังเอกสาร:

mkdir ~/spacemacs
git clone git@github.com:syl20bnr/spacemacs.git ~/spacemacs/.emacs.d
HOME=~/spacemacs emacs```

6
ใช่บางครั้งฉันเปลี่ยนหน้าแรกเพื่อลองกำหนดค่าทางเลือก ข้อเสียคือหน้าแรกใช้สำหรับสิ่งอื่นที่คุณอาจไม่ต้องการได้รับผลกระทบ
ลูกัส

3

มันตอบแล้วและได้รับการยอมรับแล้ว แต่ถ้าคุณรู้สึกอยากลองวิธีใหม่ ๆ ในการทำสิ่งต่าง ๆ ในแบบย้อนกลับ (นอกเหนือจาก emacs configs) ฉันขอแนะนำให้คุณใช้เวลาครึ่งชั่วโมงทำความคุ้นเคยกับ GNU Stow เป็นประเภทของln -sเตียรอยด์และอาจมีหลายวิธีในการใช้ คุณสามารถมีการตั้งค่าทั้งหมดภายใต้ไดเรกทอรีย่อยเดียว (รวมถึงการกำหนดค่า offlineimap, emacs configs ฯลฯ ) ซึ่งเป็นวิธีการที่อิงกับสภาพแวดล้อมหรือมีไดเรกทอรีย่อยแยกต่างหากสำหรับทุกแอปพลิเคชันที่คุณมี โรคจิตเภทหวาน

เช่นรายชื่อที่เกี่ยวข้องกับ emacs จาก ~ / Stow ของฉัน:

-> % ls ~/Stow | grep emacs
emacs 
emacs_from_scratch
spacemacs
hoodoo@T450s 2:46 [~]

มีหนึ่งการกำหนดค่าเริ่มต้นที่ฉันจัดการเพื่อให้สามารถใช้งานได้หนึ่ง 'ฉันติดกับการกำหนดค่าเริ่มต้น' และหนึ่ง 'ฉันจะม้วนตัวเอง' ฉันสามารถเปิดและปิดแต่ละสิ่งเหล่านี้และให้ทุกอย่างพร้อมใช้งานเสมอ แต่ละเขตย่อยสามารถมีทั้งต้นไม้เทียบกับของฉัน ~ / และมันค่อนข้างมีประโยชน์ในการผสมและจับคู่


ฉันใช้ stow แล้วเมื่อมันเกิดขึ้น แต่คุณจะใช้มันเพื่อสิ่งนี้ได้อย่างไร คุณเป็นเพียง 'กำหนดขอบเขตแบบไดนามิก' .emacs.d ของคุณด้วยการเชื่อมโยงเข้า / ออกที่คุณต้องการใช้โดยใช้ stow? คุณเคยวิ่งทั้งสองอย่างในเวลาเดียวกันหรือไม่? ถ้าเป็นเช่นนั้นฉันเดาว่า emacses ทั้งสองคิดว่าพวกเขา "เป็นเจ้าของ". emacs.d ฉันสงสัยว่าสิ่งนี้อาจทำให้เกิดสิ่งแปลกประหลาดบางอย่างกับสิ่งที่ช่วยให้รัฐอยู่ที่นั่นได้หรือไม่เช่นฉันไม่รู้ว่าเมื่อเร็ว ๆ นี้, savehist, บันทึกอัตโนมัติ ฯลฯ โดยเฉพาะอย่างยิ่งเมื่อ emacs สองชุดทำงานด้วยการตั้งค่าที่แตกต่างกัน
Croad Langshan

ไม่ฉันเพิ่งเปลี่ยนการตั้งค่าตามต้องการ
Roman Grazhdan

2

ฉันดูแพทช์ที่ @Uwe Koloska ใช้ มันไม่ได้รวมอยู่ในสาขาหลัก ฉันเห็นด้วยค่อนข้างฉันคิดว่าปัญหาควรได้รับการแก้ไขนอก emacs โดยใช้เชลล์และปล่อยให้ emacs ไม่รู้อะไรเกี่ยวกับมัน

บางทีคุณลักษณะนั้นอาจมีเหตุผลมากกว่าจากมุมมองของผู้ใช้การใช้การตั้งค่าสถานะอาจทำให้ผู้ใช้บางรายสับสนน้อยลง

ในกรณีการใช้งานของฉันฉันต้องการติดตั้ง Emacs และSpacemacsของฉันต่อไปดังนั้นความหลากหลายของโซลูชันทั้งสองด้านบนจึงเป็นเช่นนี้

เชลล์สคริปต์

ก่อนอื่นสคริปต์สำหรับการเปิดตัว spacemacs:

#!/bin/sh

export EMACS_USER_DIR=~/spacemacs/emacs.d

exec emacs "$@"

สคริปต์นี้ถูกเรียกใช้spacemacsและติดตั้งใน/usr/local/binโฟลเดอร์

ไฟล์. emacs

แล้วฉันจะต้องมีไฟล์ในบ้านของฉันโฟลเดอร์ที่จะรักษาอย่างถูกต้องตัวแปรสภาพแวดล้อม.emacsEMACS_USER_DIR

(defvar user-custom-dir (getenv "EMACS_USER_DIR"))

(when (/= (length user-custom-dir) 0)
  (setq user-emacs-directory (file-name-as-directory user-custom-dir)))

(load (expand-file-name "init.el" user-emacs-directory))

ฉันไม่เคยมีประสบการณ์เกี่ยวกับเอลลิสเลยดังนั้นฉันจึงคิดสิ่งนี้ผู้คนที่มีประสบการณ์มากกว่าอาจจะคิดอะไรบางอย่างที่ดีกว่า แต่เดี๋ยวก่อนมันใช้ได้

อาหารตา

ถ้าอย่างนั้นทำไมไม่เพิ่มไอคอน:

ไอคอน

[Desktop Entry]
Name=Spacemacs
GenericName=Text Editor
Comment=Edit text
MimeType=text/english;text/plain;text/x-makefile;text/x-c++hdr;text/x-c++src;text/x-chdr;text/x-csrc;text/x-java;text/x-moc;text/x-pascal;text/x-tcl;text/x-tex;application/x-shellscript;text/x-c;text/x-c++;
Exec=spacemacs %F
Icon=/home/marcs/.icons/spacemacs.svg
Type=Application
Terminal=false
Categories=Development;TextEditor;
StartupWMClass=Emacs
Keywords=Text;Editor;

3
exec emacs "$@"เชลล์สคริปต์ของคุณควรใช้
Uwe Koloska

ใช่ขอบคุณสำหรับเคล็ดลับเพิ่งแก้ไข
Marcs

2

ฉันพบว่าการใช้Chemacsนั้นง่ายมากสำหรับการสลับระหว่าง emacs ที่แตกต่างกัน

ฉันทำคำตอบที่นี่: https://emacs.stackexchange.com/a/44678/11979

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.