TL; DR:
เพิ่มบรรทัดต่อไปนี้ที่ด้านบนของไฟล์ init ของคุณ ( .emacs.d/init.el
หรือ.emacs
):
(package-initialize)
คำอธิบาย
การสร้างไฟล์เพิ่มเติมที่ Emacs อาจใช้เนื่องจากuser-init-file
ไม่ใช่วิธีที่เหมาะสม เพราะคู่มือไม่ได้พูดซึ่งเป็นที่ต้องการในกรณีที่มีความขัดแย้งอย่างน้อยไม่ได้อยู่ในส่วนที่คุณยกมาทั้งหมดนี้ไม่สามารถที่จะเพิ่มความสับสน - ตอนนี้เราไม่ทราบว่าที่จริงคือuser-init-file
(ซึ่งเป็นค่าที่คุณอาจต้องการ เพื่อตรวจสอบเพื่อค้นหา)
ดังนั้นเริ่มต้นด้วยการลบตัวเลือกทั้งหมดยกเว้น~/.emacs.d/init.el
ซึ่งเป็นที่ต้องการโดยทั่วไป (โดยผู้ใช้) เพราะมันไม่ได้มีส่วนทำให้เกิดความยุ่งเหยิงที่ไม่บริสุทธิ์$HOME
และช่วยให้สามารถเก็บไฟล์การกำหนดค่า Emacs ทั้งหมดรวมถึงไฟล์ที่สำคัญที่สุดภายใต้การควบคุมเวอร์ชัน Emacs
ตามค่าเริ่มต้นการเรียก Emacs package-initialize
หลังจากโหลดไฟล์ init ของผู้ใช้แล้ว มันทำได้เลยเพราะปัจจุบันผู้ใช้ส่วนใหญ่ติดตั้งแพ็คเกจโดยใช้package.el
- ดังนั้นพวกเขาไม่ควรทำอะไรเพื่อให้แพ็คเกจเหล่านี้พร้อมใช้งาน
ในทางกลับกันไม่ได้ทุกคนไม่ดังนั้นจึงควรจะเป็นไปไม่ได้package-initialize
โทร การป้องกันไม่ให้มีการเรียกใช้ฟังก์ชันนั้นโดยการเพิ่ม(setq package-enable-at-startup nil)
ลงในไฟล์เริ่มต้นของผู้ใช้ (คุณสามารถใส่ไว้ที่ไหน)
package-initialize
ไม่สามารถเรียกได้ก่อนที่ผู้ใช้จะมีการเปลี่ยนแปลงเพื่อแจ้งให้ Emac ไม่ต้องทำดังนั้นจึงต้องทำหลังจากโหลดไฟล์ init ตราบใดที่ผู้ใช้ติดตั้งแพ็กเกจแล้วใช้ตามที่เป็นอยู่หรือปรับแต่งโดยใช้อินเตอร์เฟสแบบกำหนดเองที่ทำงานได้ดี แต่ถ้าคุณต้องการปรับแต่งแพ็กเกจของคุณโดยใช้ elisp คุณต้องตรวจสอบให้แน่ใจก่อนว่ามันใช้งานได้จริงload-path
ก่อนที่จะใช้ฟังก์ชั่นที่กำหนด
มันค่อนข้างง่ายที่จะทำและจัดทำเอกสารอย่างถูกต้อง (ถ้าฉันดูก่อนอื่นฉันไม่ต้องเขียนอะไรข้างต้น: - /
เหตุผลในการโหลดแพ็กเกจอัตโนมัติเกิดขึ้นหลังจากโหลดไฟล์ init คือตัวเลือกผู้ใช้จะได้รับค่าที่กำหนดเองหลังจากโหลดไฟล์ init เท่านั้นรวมถึงตัวเลือกผู้ใช้ที่มีผลต่อระบบบรรจุภัณฑ์ ในบางสถานการณ์คุณอาจต้องการโหลดแพ็กเกจอย่างชัดเจนในไฟล์ init ของคุณ (โดยปกติจะเป็นเพราะโค้ดอื่น ๆ ในไฟล์ init ของคุณขึ้นอยู่กับแพ็คเกจ) ในกรณีที่ไฟล์ init package-initialize
ของคุณควรเรียกใช้ฟังก์ชัน มันขึ้นอยู่กับคุณที่จะตรวจสอบให้แน่ใจว่าpackage-load-list
มีการตั้งค่าตัวเลือกผู้ใช้ที่เกี่ยวข้องเช่น(ดูด้านล่าง) ก่อนการpackage-initialize
โทร คุณควรตั้งค่า
package-enable-at-startup
เป็นnil
เพื่อหลีกเลี่ยงการโหลดแพ็กเกจอีกครั้งหลังจากประมวลผลไฟล์ init หรือคุณอาจเลือกที่จะยับยั้งการโหลดแพ็กเกจโดยสมบูรณ์เมื่อเริ่มต้นและเรียกใช้คำสั่ง 'Mx package-initialize' เพื่อโหลดแพ็กเกจของคุณด้วยตนเอง
ดังนั้น:
;;; .emacs.d/init.el -- the `user-init-file'
(package-initialize)
(setq package-enable-at-startup nil)
(require 'use-package)
(use-package some-package
:init (setq some-package-variable "foobar")
...
;;; .emacs.d/init.el ends here
แน่นอนว่าปัญหา (หรือปัญหาเพิ่มเติม) อาจเป็นเพราะการพิมพ์ผิดSymbol's function definition is void: use-packge
อยู่ในไฟล์ init ของคุณและจะไม่เกิดขึ้นจนกว่าคุณจะพิมพ์ลงใน emacs.se