use-package -: init หรือ: config


14

มีกฎใดบ้างที่ผู้ใช้สามารถกำหนดได้ว่าต้องการการกำหนดค่าแพ็คเกจ:initหรือ:configไม่?

คำตอบ:


13

มีกฎใดบ้างที่ผู้ใช้สามารถกำหนดได้ว่าต้องการการกำหนดค่าแพ็คเกจ:initหรือ:configไม่?

ไม่มีกฎทั่วไปที่ใช้กับการตั้งค่าและแพ็คเกจทั้งหมด คุณเพียงแค่ต้องทำความคุ้นเคยกับความหมายของคำเหล่านี้โดยการอ่านไฟล์ READMEuse-packageของ

โดยสรุป:initบล็อกทำงานที่เริ่มต้นเช่นถ้าคุณได้วางรูปแบบที่เป็นส่วนประกอบที่ระดับบนสุด (เช่นนอกของสายทั่วไปuse-package) user-init-fileของคุณ ซึ่งหมายความว่ามันจะทำงานอยู่เสมอไม่ว่าจะโหลดแพคเกจที่เกี่ยวข้องหรือไม่

ในทางกลับกัน:configบล็อกจะถูกรันหลังจากโหลดแพ็กเกจที่สอดคล้องกันโดยวิธีการของeval-after-loadกลไก

ดังนั้นคุณสามารถปรับปรุงเวลาเริ่มต้นของคุณโดยการย้ายการตั้งค่ายาวทำงานบังคับจากไป:init :configหากคุณต้องการแก้ไขตัวแปรที่กำหนดไว้หลังจากโหลดแพคเกจเฉพาะคุณก็ต้องวางสิ่งนี้ลงใน:configบล็อก ตัวแปรบางอย่างเช่นจะต้องมีการตั้งค่าก่อนแพคเกจที่สอดคล้องกันของพวกเขาจะเต็มไปดังนั้นพวกเขาควรจะอยู่ในgnus-home-directory :initฉันขอแนะนำอย่างยิ่งให้วางการบังคับadd-hook/ การremove-hookโทรทั้งหมดลงใน:initบล็อกเนื่องจากสามารถแก้ไขฮุกได้แม้ว่าจะไม่ถูกผูกมัด

คุณมักจะสามารถหลีกเลี่ยงการคิดได้ว่าจะวางการตั้งค่าเฉพาะที่ใดโดยใช้:customคำหลักใหม่หรือโดยใช้ส่วนต่อประสานการปรับแต่งง่าย ๆโดยตรง


2

ฉันไม่แน่ใจว่ามีกฎทั่วไปหรือไม่ (นอกเหนือจาก "ใช้:initสำหรับการกำหนดค่าล่วงหน้าก่อนที่จะโหลดแพคเกจจริงและใช้:configสำหรับอื่น ๆ การกำหนดค่า"

แต่สำหรับตัวฉันเองใช้:initเมื่อฉันต้องการเพิ่มการแมปปุ่มโหมดอื่น ๆ เพื่อใช้ฟังก์ชั่นจากแพ็คเกจ "นี้" และยังต้องการให้แพ็กเกจ "นี้" ว่าง

นี่คือตัวอย่างของการโหลดขี้เกียจของdired-ranger:

(use-package dired-ranger
  :commands (dired-ranger-copy dired-ranger-paste dired-ranger-move)
  :init
  (add-hook 'dired-mode-hook
            (lambda ()
              (define-key dired-mode-map (kbd "M-w") 'dired-ranger-copy)
              (define-key dired-mode-map (kbd "C-y") 'dired-ranger-paste)
              (define-key dired-mode-map (kbd "C-c C-y") 'dired-ranger-move))))

PS: ถ้าไม่มี:defer, :commands, :modeและอื่น ๆ ที่ทำให้การโหลดแพคเกจขี้เกียจแล้ว:initและ:configควรจะมากหรือน้อยเหมือนกัน ( แต่:initจะมีการประเมินก่อนหน้านี้ :))


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

แน่นอนไม่เคยคิดเกี่ยวกับมัน แต่:configสายเกินไป - การโหลดที่ขี้เกียจจะไม่ใช้การรวมของฉัน และ:bindด้วยความ:mapไม่ผูกมัน
Maxim Kim

3
:configไม่สายเกินไป - นั่นคือเมื่อdired-mode-mapมีการกำหนดครั้งแรก คุณอาจจะแค่วางมันในuse-packageรูปแบบที่ผิดdired-rangerแทนที่จะเป็นdiredที่ที่dired-mode-mapกำหนดไว้ นี่อาจอธิบายได้ว่าทำไมคุณ:bindไม่ทำงาน โดยทั่วไปไม่ว่าคุณจะทำอะไรผิดพลาดหรือuse-packageมีข้อบกพร่อง อย่าสับสนการโยงคีย์โลคัลและeval-after-loadกับการโยงคีย์โกลบอลของคำสั่ง / คีย์แม็พแบบอัตโนมัติ
บาซิล

@Basil ขอบคุณคุณพูดถูก ปัญหาของฉันคือฉันได้ตั้งค่าuse-package-always-ensureและเมื่อฉันพยายามที่จะใช้แพคเกจ dired มันล้มเหลวในการดึงมันมาจาก elpa แต่ต้อง:ensure nilมีการแก้ปัญหาและฉันสามารถตั้งค่าการโหลดแพคเกจที่ถูกล่ามโซ่dired-> ใช้dired-ranger :after
Maxim Kim
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.