พวกเขาจะแตกต่างกันถ้าแพคเกจถูกเลื่อนออกไปคือไม่ได้โหลดจนกว่าจะมีความจำเป็น ในกรณี:init
นั้นจะถูกดำเนินการในเวลาที่ไฟล์ emacs ของคุณถูกอ่านครั้งแรก แต่:config
จะถูกดำเนินการในเวลาที่มีการโหลดแพคเกจจริง
ในตัวอย่างของคุณการใช้mode
implersly defers โหลดแพ็กเกจ คุณได้กำหนดค่าแพคเกจที่จะโหลดในครั้งแรกที่มีการเยี่ยมชมไฟล์ html
คุณสามารถใช้:demand
เพื่อให้แน่ใจว่าแพคเกจที่มีการโหลดเสมอที่เริ่มต้น :init
แต่มีแนวโน้มที่สิ่งที่คุณต้องการจะทำที่นี่จะใส่เบ็ดของคุณ
จาก docstring:
:init Code to run when `use-package' form evals.
เนื่องจากคุณใส่สิ่งนี้ลงในไฟล์ผู้ใช้ init ของคุณนั่นหมายความว่ามันจะทำงานเมื่อเริ่มต้น
:config Runs if and when package loads.
ดังนั้นอย่ารันจนกว่าแพ็กเกจจะถูกโหลดจริง ..
:defer Defer loading of package -- automatic if :commands, :bind, :bind*, :mode or :interpreter are used.
บันทึกรายการสิ่งต่าง ๆ ที่ทำให้แพคเกจถูกเลื่อนออกไปโดยอัตโนมัติ โดยทั่วไปถ้าคุณบอกuse-package
เงื่อนไขที่คุณต้องการแพคเกจนี้จะถือว่าคุณไม่ต้องการโหลดจนกว่าเงื่อนไขเหล่านั้นจะเกิดขึ้น
:demand Prevent deferred loading in all cases.
ตรวจสอบให้แน่ใจว่าโหลดแพคเกจเมื่อเริ่มต้นโดยไม่คำนึงถึงตัวเลือกอื่น ๆ ที่คุณระบุ
ปรับปรุง
การทบทวนนี้โดยอ้างอิงจากความคิดเห็นล่าสุด ... สิ่งที่ฉันพูดไว้ข้างต้นนั้นเป็นความจริง แต่ฉันคิดว่ามันไม่ถูกต้องที่จะตอบคำถาม ปัญหารากที่นี่เป็นจริงที่html-mode
ไม่ได้เป็นแพคเกจ sgml-mode
แต่โหมดที่กำหนดโดยแพคเกจ ทำงานได้ตามที่คาดไว้สำหรับฉัน:
(use-package sgml-mode
:mode ("\\.html\\'" . html-mode)
:config (add-hook 'html-mode-hook 'turn-off-auto-fill))
ในตัวอย่างดั้งเดิม:config
นิพจน์ไม่ได้รับการประเมินเนื่องจากแพ็กเกจที่ชื่อhtml-mode
ไม่ได้รับการโหลด การย้ายนิพจน์เหมือนเดิมเพื่อใช้:init
งานได้เนื่องจากรหัสเริ่มต้นจะถูกประเมินเสมอโดยไม่คำนึงว่าแพ็กเกจจะได้รับการโหลดหรือไม่