วิธีรับสภาพแวดล้อม Emacs เดียวกันบนคอมพิวเตอร์เครื่องอื่น?


16

ฉันเป็นผู้เริ่มต้นใน Emacs (ใช้มันประมาณ 2 สัปดาห์แล้วและรักมัน) เมื่อฉันอัปเดตและขยาย~/.emacs.d/init.elไฟล์ของฉันสิ่งที่ฉันเขียนนั้นขึ้นอยู่กับแพ็คเกจที่ฉันติดตั้งจาก MELPA โดยใช้M-x package-installกับ.elไฟล์ที่ฉันเขียนเองเป็นต้น

คำถามของฉันคือฉันควรเปลี่ยนคอมพิวเตอร์ในอนาคตเป็นวิธีที่ดีที่สุดในการรับสภาพแวดล้อม Emacs ที่เหมือนกันบนคอมพิวเตอร์เครื่องใหม่อย่างที่ฉันมีอยู่ตอนนี้หรือไม่


3
ตราบใดที่คุณสามารถเคลื่อนย้ายinit.elไปมา (โดยใช้ตัวอย่างเช่น git) วิธีนี้ใช้งานได้ (ตามuse-package): lunaryorn.com/posts/…
VanLaser

วิธีการหนึ่งคือใส่ไดเรกทอรี. emacs.d ของคุณใน Dropbox ฉันใช้มันกับคอมพิวเตอร์ที่มีระบบปฏิบัติการเดียวกันเท่านั้น รสชาติที่แตกต่างกันของ * ระวังควรจะเป็นไร แต่คุณอาจมีปัญหาหากคุณพยายามแบ่งปันในเครื่องที่ใช้ระบบปฏิบัติการที่แตกต่างกันเกินไป
Qudit

คำถามนี้อยู่ใกล้กับemacs.stackexchange.com/q/408/2710มาก คุณสามารถเน้นความแตกต่างได้หรือไม่
Andrew Swann

สำหรับผู้ที่ไม่ใช่โปรแกรมเมอร์เช่นตัวฉันเองการซิงโครไนซ์การกำหนดค่า emacs และแพ็คเกจในสามเครื่อง (สองหน้าต่างหนึ่ง OSX) โดยใช้ Google Drive นั้นมีประสิทธิภาพและเชื่อถือได้ สิ่งนี้ได้ผลเพราะ emacs และแพ็คเกจส่วนใหญ่เป็นแพลตฟอร์มที่ไม่เชื่อเรื่องพระเจ้า การทำสำเนาข้ามแพลตฟอร์มของประสบการณ์ emac ที่เหมือนกันต้องใช้เพียงไม่กี่บรรทัดในไฟล์ init.el เพื่อแก้ไขพา ธ เฉพาะของระบบปฏิบัติการไปยังไดเรกทอรีแพคเกจ emacs ที่ซิงโครไนซ์
Snelephant

config ของคุณคือ~/.emacs.dไดเรกทอรีทั้งหมดของคุณดังนั้นใช้วิธีใดก็ได้ที่คุณต้องการซิงโครไนซ์นั้นระหว่างเครื่อง (เช่นที่เก็บ Github หรือโฟลเดอร์ Dropbox หรืออะไรก็ได้ที่ดีที่สุดสำหรับคุณ)
phils

คำตอบ:


9

โซลูชันที่ถูกต้องคือการใช้straight.elตัวจัดการแพคเกจที่ฉันเขียนเพื่อแก้ปัญหานี้ คุณสามารถค้นหารายละเอียดเพิ่มเติมเกี่ยวกับสิ่งนี้ได้ในคำตอบของคำถามนี้

คำตอบนี้ถูกเขียนขึ้นหลายเดือนก่อนที่ฉันจะเริ่มทำงานstraight.elก่อนหน้านี้อธิบายถึงวิธีที่ต่ำกว่าอย่างเคร่งครัดในการบรรลุทางออกบางส่วน วิธีการนี้อธิบายสั้น ๆ ด้านล่าง; ฉันไม่แนะนำอีกต่อไป

แม้ว่าคุณจะไม่ต้องการที่จะใช้อย่างน้อยคุณควรนำมาใช้straight.el use-package(ไม่ใช่ว่าทั้งสองเป็นเอกสิทธิ์เฉพาะบุคคล - ฉันเชื่อว่าการตั้งค่าที่สะอาดที่สุดมาจากการใช้ทั้งคู่)


เริ่มต้นด้วยการกำหนดรายการแพ็กเกจในไฟล์ init ของคุณ:

(defvar my-packages
        '(
          aggressive-indent
          avy
           .
           .
           .
          projectile
          undo-tree
          )
  "List of packages to be installed at Emacs startup.")

จากนั้นติดตั้งโดยอัตโนมัติ:

(require 'cl-lib)
(package-initialize)
(unless (cl-every #'package-installed-p my-packages)
  (dolist (package my-packages)
    (unless (package-installed-p package)
      (package-install package))))

หากคุณเก็บinit.elไฟล์ของคุณไว้ภายใต้การควบคุมเวอร์ชันการซิงค์ไฟล์กับเครื่องอื่นจะส่งผลให้แพ็คเกจของคุณถูกติดตั้งโดยอัตโนมัติ แน่นอนว่ารุ่นที่ติดตั้งจะแตกต่างไปจากเดิมอย่างสิ้นเชิงและการกำหนดค่าของคุณจะไม่สามารถใช้งานได้ตามปกติ นี่เป็นข้อบกพร่องพื้นฐานของpackage.elและเป็นหนึ่งในเหตุผลที่ว่าวิธีการนี้ไม่ดี straight.elดูอีกครั้ง โปรดทราบว่ารหัสที่ระบุไว้ด้านบนจะแยกรายการแพ็กเกจของคุณออกจากการกำหนดค่าของคุณสำหรับแพ็คเกจเหล่านั้นทำให้ยากต่อการติดตามสิ่งต่าง ๆ ในไฟล์ init ของคุณ นี่เป็นข้อเสียที่สำคัญอีกประการหนึ่ง use-packageดูอีกครั้ง


ขอบคุณสำหรับการเขียน! หากฉันเลือกที่จะโฮสต์ทุกอย่างบน Github รวมถึงแพ็คเกจที่ฉันดาวน์โหลดจาก MELPA สิ่งนี้จะรักษาความสามารถของ MELPA ในการอัปเดตแพ็คเกจอัตโนมัติในคอมพิวเตอร์เครื่องใหม่หรือไม่
space_voyager

1
@space_voyager ใช่ทุกอย่างจะยังคงเกิดขึ้นในแบบเดียวกัน อย่างไรก็ตาม: (1) เมื่อคุณโคลนกับคอมพิวเตอร์เครื่องใหม่ Emacs ไม่จำเป็นต้องดาวน์โหลดแพ็คเกจจาก MELPA เพราะมันอยู่ในที่เก็บที่คุณเพิ่งทำการโคลน และ (2) เมื่อใดก็ตามที่คุณใช้package.elเพื่ออัปเดตแพ็คเกจคุณจะมีการเปลี่ยนแปลงที่ไม่มีการจัดเก็บในที่เก็บข้อมูลของคุณและคุณจะต้องส่งมอบคอมมิชชันให้รวมการอัปเดตแพ็คเกจด้วย
Radon Rosborough

เยี่ยมมากขอบคุณ อีกอย่างหนึ่ง: ฉันคิดว่า MELPA ทำการอัปเดตแพ็คเกจโดยอัตโนมัติ นี่ไม่ใช่กรณีหรือไม่
space_voyager

1
@space_voyager: แน่นอนว่าที่เก็บแพคเกจระยะไกลจะได้รับการปรับปรุง แต่แพ็คเกจที่อัปเดตแล้วจะไม่ถูกดาวน์โหลดและติดตั้งลงในเครื่องของคุณโดยอัตโนมัติ M-x list-packages RET Uสำหรับสิ่งที่คุณจำเป็นต้อง
Radon Rosborough

1
@Lassi คำตอบสั้น ๆ : ใช้สิ่งที่คุณต้องการติดตั้ง Emacs; ใช้straight.elเพื่อติดตั้งแพ็คเกจ Emacs เท่านั้น ห้ามเป็นความคิดที่ดี แต่ก็ไม่ได้ดีเหมาะสำหรับการพัฒนาแพคเกจ Emacs เท่าที่ฉันรู้(โปรดถูกต้องฉันหากฉันผิด) หากคุณใช้ตัวจัดการแพคเกจระบบเพื่อติดตั้งแพ็คเกจ Emacs คุณจะไม่สามารถแก้ไขซอร์สโค้ดของพวกเขาจากนั้นส่งและส่งการเปลี่ยนแปลงของคุณที่ upstream ครั้งล่าสุดที่ฉันดูการกำหนดค่า Nix สำหรับแพ็คเกจ Emacs ดูเหมือนว่าซับซ้อนเกินไปและด้อยกว่าstraight.elประสบการณ์การพัฒนา แต่สิ่งที่ลอยเรือของคุณ
เรดอนรอสโบโร่

11

หากคุณใช้แพ็กเกจใช้งานคุณสามารถย้ายไฟล์นั้นจากคอมพิวเตอร์หนึ่งไปยังอีกเครื่องหนึ่งได้และเมื่อ Emacs เริ่มทำงานตราบใดที่คุณมีอินเทอร์เน็ตก็จะดึงไฟล์เหล่านั้นออกมา

ก่อนอื่นให้ตั้งค่าไลบรารีแพคเกจ:

(require 'package)
(add-to-list 'package-archives
             '("melpa" . "https://melpa.org/packages/") t)
(package-initialize)

และจากนั้น bootstrap use-package:

(unless (package-installed-p 'use-package)
  (package-refresh-contents)
  (package-install 'use-package))

(eval-when-compile (require 'use-package))

ตอนนี้แทนที่จะติดตั้ง Emacs และสมมติว่าแพ็กเกจติดตั้งแล้วให้ใช้use-packageทั้งการติดตั้งและกำหนดค่า ตัวอย่างเช่นสำหรับการตั้งค่าหางเสือของฉัน:

(use-package helm
  :ensure t
  :bind (("M-x" . helm-M-x)
         ("M-y" . helm-show-kill-ring)
         ("C-x C-f" . helm-find-files)
         ("M-s o" . helm-occur))

  :config
  (helm-mode 1)
  (setq helm-echo-input-in-header-line t))

คำนึงถึงคุณนั่นคือการกำหนดค่า (ในinit.el) ข้าม แต่มีอีกมากมาย ตัวอย่างเช่นการทำเช่นนี้จะไม่ย้ายพอร์ตไฟล์ dabbrev หรือตัวอย่างข้อมูลที่คุณกำหนดเองหรือสิ่งอื่นใดอีกมากมาย
Omair Majid

ใช่. หากคุณมีไฟล์อื่น ๆ ที่เป็นส่วนหนึ่งของการกำหนดค่าของคุณคุณจะต้องย้ายไฟล์เหล่านั้นไปพร้อม ๆ กับไฟล์ init ของคุณ
zck

ณ จุดนั้นมันจะกลายเป็นเกมของ "ไฟล์ที่เป็นส่วนหนึ่งของการกำหนดค่าของฉันและฉันจะซิงค์ในเครื่องของฉันได้อย่างไร" :(
Omair Majid

คุณควรเพิ่ม:ensure tให้กับuse-packageการประกาศหรือชุดไปuse-package-always-ensure tมิฉะนั้นจะไม่ติดตั้งบนระบบอื่นโดยอัตโนมัติเมื่อคัดลอกการตั้งค่า
Chakravarthy Raghunandan

6

การจัดการแพ็คเกจรุ่นต่อไปด้วย straight.el

หลังจากการต่อสู้ที่ยาวนานและน่าผิดหวังกับการใช้งานpackage.el+ Quelpa การจัดการแพคเกจของฉันฉันกัด bullet และเขียนผู้จัดการแพคเกจของตัวเอง มีวัตถุประสงค์เพื่อทดแทนอย่างสมบูรณ์package.elโดยมอบประสบการณ์การจัดการบรรจุภัณฑ์ที่เหนือกว่าในเกือบทุกด้าน

คุณสามารถอ่านเอกสารที่กว้างขวางมากที่จะเรียนรู้เกี่ยวกับคุณสมบัติทั้งหมดของมัน แต่คนที่เกี่ยวข้องมากที่สุดกับคำถามนี้คือการที่straight.elมุ่งเน้นการทำสำเนาที่สมบูรณ์แบบ ซึ่งหมายความว่าไม่สำคัญว่าคุณจะเริ่มใช้งาน Emacs ตามปกติหรือเริ่มใช้งานบนเครื่องใหม่และการเปลี่ยนแปลงใด ๆ ในท้องถิ่นนั้นควบคุมโดยรุ่นและสามารถเปลี่ยนกลับสู่สถานะที่ยอมรับได้ ในทางปฏิบัติแล้วสิ่งนี้สามารถทำได้โดย (1) การทำสำเนาแพคเกจเป็นที่เก็บ Git และจัดหาเครื่องมืออัตโนมัติสำหรับจัดการสถานะของพวกเขา (2) ใช้ไฟล์ init เป็นแหล่งความจริงเพียงอย่างเดียวสำหรับสถานะการจัดการบรรจุภัณฑ์โดยไม่มีข้อมูลที่ไม่แน่นอนที่เก็บไว้ที่อื่น และ (3) ใช้ lockfiles เวอร์ชันเผื่อเลือกเพื่อระบุการแก้ไข Git ที่แน่นอนของทุกแพ็คเกจรวมถึงที่เก็บสูตรและstraight.el ตัวเอง

ในการเริ่มต้นแทรกข้อมูลโค้ดบูตstraight.elซึ่งจะติดตั้งและเปิดใช้งาน จากนั้นเพื่อให้แน่ใจว่ามีการติดตั้งแพคเกจเพียงโทรไปที่straight-use-packageไฟล์ init ของคุณ:

(straight-use-package 'projectile)

ใช่มันง่ายมาก ไม่มีการจัดการpackage-refresh-contentsหรือขยะใด ๆ หากคุณลบแบบฟอร์มนี้ออกจากไฟล์เริ่มต้นและเริ่มต้น Emacs ใหม่ Projectile จะไม่ถูกโหลดอีกต่อไป (ไม่เหมือนในpackage.el) ซึ่งหมายความว่าคุณไม่ต้องกังวลเกี่ยวกับการกำหนดค่าของคุณอย่างใดไม่ทำงานบนเครื่องใหม่เพราะคุณขึ้นอยู่กับแพคเกจที่ไม่ได้ประกาศ

คุณสามารถติดตั้งแพ็คเกจได้ทุกที่และทุกเวลาที่คุณต้องการตลอดทั้งไฟล์ init ของคุณ (ไม่จำเป็นต้องประกาศรายการไฟล์เหล่านั้นในจุดเดียว) แน่นอนคุณสามารถทำได้

(dolist (package '(ace-jump-mode ... zzz-to-char)) (straight-use-package package))

ถ้าคุณชอบรายการ อย่างไรก็ตามฉันขอแนะนำให้คุณใช้use-packageจัดการการกำหนดค่าแพ็คเกจของคุณ ก่อนอื่นคุณต้องติดตั้ง:

(straight-use-package 'use-package)

จากนั้นเนื่องจากstraight.elมีการรวมระบบในตัวด้วยuse-packageเหตุนี้ "เพิ่งได้ผล":

(use-package projectile
  :straight t
  :init (projectile-mode 1))

เมื่อคุณเขียนไฟล์เริ่มต้นเพื่อติดตั้งแพ็คเกจที่จำเป็นแล้วให้เรียกใช้M-x straight-freeze-versionsเพื่อบันทึกเวอร์ชัน lockfile ~/.emacs.d/straight/versions/default.elไว้ คุณควรเก็บไฟล์นี้ไว้ภายใต้การควบคุมเวอร์ชันเนื่องจากจะอนุญาตให้straight.elตรวจสอบเวอร์ชั่นที่ถูกต้องของแพ็คเกจทั้งหมดของคุณเมื่อคุณเปิดใช้งาน Emacs ครั้งแรกบนเครื่องใหม่ (คุณสามารถเปลี่ยนกลับเป็นเวอร์ชันที่ระบุใน lockfile ด้วยM-x straight-thaw-versionsตนเองได้โดยใช้)

เพื่อสนับสนุนความคิดของ dotfiles เครื่องท้องถิ่นที่ผมกล่าวถึงในคำตอบอื่น ๆ ของฉัน , straight.elข้อเสนอรายละเอียดระบบ ฉันยังคงแนะนำให้ใช้ symlink สำหรับ dotfiles ของคุณ (ในกรณีนี้init.elไฟล์ init-local ของคุณหากทำได้และ version lockfile หากคุณต้องการใช้)

หากคุณกำลังสงสัยว่าstraight.elเปรียบเทียบกับผู้จัดการแพคเกจอื่น ๆ ให้ตรวจสอบส่วนรถที่กว้างขวาง แต่มีเอกสารอื่นอีกมากมายในทุกสิ่งอีกด้วย


4

คุณสามารถใช้caskเพื่อจัดการแพ็คเกจของคุณ ใช้ git / github เพื่อควบคุมแหล่งและซิงค์ emacs dotfiles ของคุณ

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