การเริ่มต้นขี้เกียจคือการเริ่มต้นที่ดี
(IMO)
ควรใช้เมื่อไร with-eval-after-load
with-eval-after-load
ถูกโหลดหนึ่งครั้งเมื่อคุณสมบัติหรือไฟล์บางอย่างถูกโหลดครั้งแรกดังนั้นการเปลี่ยนคีย์แมปจะเข้าไปในหนึ่งในเหล่านี้อย่างชัดเจน ไม่ใช่อย่างน้อยเพราะอาจไม่รู้จัก keymap ในเวลาเริ่มต้น [ลองอะไรทำนองนั้น(define-key message-mode-map (kbd "C-c f") 'Footnote-add-footnote)
ในemacs -q
] เบ็ดไม่ใช่คำตอบที่ดีเพราะมันผูกฟังก์ชั่นกับกุญแจทุกครั้งที่ตะขอเริ่มทำงาน ในฐานะที่เป็นบันทึกTarsiusคุณสามารถอ่านเพิ่มเติมเกี่ยวกับสาเหตุที่ไม่ควรlocal-set-key
อยู่ใน hooks
สุดท้ายให้สังเกตว่าwith-eval-after-load
GNU Emacs 24.4 เป็นเครื่องห่อหุ้ม 2 บรรทัดeval-after-load
ที่body
ไม่จำเป็นต้องยกมา
เมื่อใช้ hooks
Hooks คือรายการฟังก์ชั่นที่โหลดทุกครั้งที่มีคุณสมบัติตรงตามเกณฑ์เช่นเริ่มโหมดบางโหมด ร่วมกันใช้ตะขอคือการโหลดเล็กน้อยโหมดเช่นหรือflyspell-mode
เช่นhl-line-mode
(add-hook 'org-agenda-mode-hook 'hl-line-mode)
ในฐานะที่เป็นRémiชี้ให้add-hooks
เป็นสมาร์ทและจะทำสิ่งที่ถูกต้องแม้ว่าตัวแปรเบ็ดยังไม่ได้รับการโหลด อย่างไรก็ตามฉันมีคำสั่งมากมายดังต่อไปนี้ซึ่งอาจเล็กน้อยสำหรับกำไรความเร็ว แต่ให้ความรู้สึกขององค์กรและโครงสร้างการพึ่งพา:
(with-eval-after-load 'org-agenda
(add-hook 'org-agenda-mode-hook 'hl-line-mode))
ทำไมเพิ่มเบ็ดหลังจากorg-agenda
? เช่นเคยC-h v org-agenda-mode-hook C-j
ส่งมอบ เบ็ดถูกกำหนดไว้ในตามที่แสดงในorg-agenda.el
*help*
กำลังโหลดคุณสมบัติพิเศษ with-eval-after-load
with-eval-after-load
เป็นสิ่งสำคัญสำหรับการโหลดคุณสมบัติพิเศษ คุณอาจต้องการให้บางสิ่งเช่น(with-eval-after-load 'org (require 'org-inlinetask))
โหลด org inlinetasks (find-library "org-inlinetask")
เพื่อดูว่าทำไม ตั้งแต่org-inlinetasks.el
โดยตรง(require 'org)
ผู้autoload
ดูแล Emacs ที่เป็นมิตรของคุณทุกคนใส่ใจอย่างมากที่จะให้ "ละเว้น" และorg.el(c)
จะโหลดทั้งหมด
แต่ถ้าหาก (ส่วนตัว) ของคุณdefun
จำเป็นต้องใช้หลายแห่ง หากคุณจู้จี้จุกจิกจริงๆคุณสามารถใส่defun
s ในไฟล์อื่นในload-path
และเพิ่มautoload
คุกกี้หรือคุณสามารถบอก Emacs ว่าจะหาฟังก์ชั่นที่มีautoload
ฟังก์ชั่น จากนั้นบางสิ่งเช่นนี้จะได้ผล:
(autoload 'org-cdlatex-mode "org" "cdlatex mode from org.")
(with-eval-after-load "latex"
(add-hook 'TeX-mode-hook 'org-cdlatex-mode))
หรือคุณอาจrequire
org
จะดึงมันออกมาcdlatex
และความจริงแล้วการท้าทายส่วนบุคคลจะไม่สำคัญมากนักสำหรับเวลาประทับส่วนใหญ่ 1,150 สายของการ defuns ส่วนตัว (84 defuns) ในของฉันinit.el
เพิ่ม 0.02s มากกว่าวานิลลา Emacs
การวัดเวลาเริ่มต้น
วิธีที่ง่ายในการประมาณเวลาการกำหนดค่าเริ่มต้นคือ
time emacs --eval "(kill-emacs)"
emacs -q
(มาตรฐานกับ
แต่เพื่อให้ได้รายละเอียดเพิ่มเติมโดยประมาณว่าจุดเริ่มต้นของปัญหาคอขวดเริ่มต้นที่ Joe Schafer esup
หรือไม่
ในที่สุดเวลาโหลดไม่หายไปอย่างน่าอัศจรรย์ คุณจะผลักดันมันไปข้างหน้า (เพื่อขยายที่คุณใช้คุณสมบัติทั้งหมดในแต่ละเซสชั่น)
with-eval-after-load
โหลดครั้งเดียวดังนั้นการเปลี่ยนคีย์แมปจะไปที่นั่น โหลด hooks ทุกครั้งที่มีการใช้งานโหมดเช่นเมื่อโหลดไฟล์ใหม่ที่เกี่ยวข้องกับโหมดหรือกำหนดเบ็ด คุณจะโหลดเช่นflyspell-mode
หรือhl-line-mode
ในเบ็ด ในของinit.el
ฉันฉันใช้with-eval-after-load
ประมาณ 160 ครั้งและadd-hook
110 ครั้ง คนขี้เกียจเป็นผู้เริ่มต้นที่ดี (IMO)