Emacs จัดการอย่างไรเพื่อเริ่มต้นทันทีด้วยไฟล์ el หลายไฟล์?


11

ดังที่ Emacs'er ทุกคนจะรู้ฉันกำลังเผชิญกับการกำหนดค่า dot-Emacs ที่กว้างขวางของฉัน แพคเกจของฉันทั้งหมดอยู่ภายในภาชนะบรรจุของuse-packageและฉัน bytecompiled ทั้งหมดของฉัน.el-Files แม้ว่าจะมี Emacs ก็เริ่มใน 6.4 วินาทีจากนั้นโหลดแพ็กเกจที่เหลือ (ประมาณ 40 แพ็กเกจ) หลังจากนั้น

ฉันกำลังคิดหาวิธีอื่นในการแก้ปัญหาเวลาเริ่มต้นที่ยาวนานจากนั้นฉันก็สังเกตเห็นบางสิ่ง Emacs เริ่มต้น (ไม่มีการกำหนดค่าผู้ใช้) ใช้.elไลบรารีจำนวนมากซึ่งรวมอยู่ใน Emac ทุกเครื่อง \shares\emacs\version number\lisp\พวกเขากำลังอยู่ใน

แม้จะมีไฟล์เสียงกระเพื่อมหลายไฟล์ก็สามารถเริ่มต้นได้ในหนึ่งวินาที เมื่อฉันตรวจสอบไฟล์ของแพ็คเกจจำนวนมากที่มาพร้อมกับ Emacs ที่เป็นค่าเริ่มต้นฉันพบว่าไม่มีอะไรพิเศษเลยที่สามารถอธิบายได้ว่าทำไม Emacs จึงจัดการเพื่อเริ่มต้นภายในหนึ่งวินาที ใครสามารถบอกฉันได้ว่า Emacs จัดการสิ่งนั้นอย่างไรแม้จะมีไฟล์หลายพัน.elไฟล์


1
คุณใช้:defer tในuse-packageการประกาศของคุณทุกที่ที่เป็นไปได้?
Lunaryorn

7
ไลบรารีแกนหลักจำนวนมากใน Emacs ถูกโหลดไว้ล่วงหน้าในไฟล์เรียกทำงานผ่านกลไกการถ่ายโอนข้อมูลที่ใช้เมื่อสร้าง Emacs ซึ่งจะช่วยให้เห็นภาพลวงตาว่ามันโหลดสิ่งต่างๆมากมายอย่างรวดเร็วอย่างไม่น่าเชื่อ ดูC-h i g (elisp) Building Emacsว่าคุณสนใจที่จะเรียนรู้เกี่ยวกับสิ่งนั้นหรือไม่
phils

2
@phils: จะดีมากถ้าคุณสามารถขยายความคิดเห็นของคุณเป็นคำตอบดูเหมือนว่ากลไกการถ่ายโอนข้อมูลยังไม่ได้กล่าวถึงใน Emacs-SE เลย
paprika

และ Mine เป็น 76s ..
Leu_Grady

paprika: เสร็จสิ้น ..
phils

คำตอบ:


9

ใครสามารถบอกฉันได้ว่า Emacs จัดการสิ่งนั้นได้อย่างไรแม้จะมีไฟล์. el หลายพันไฟล์

Emacs "จัดการ" โดยไม่โหลดเมื่อเริ่มต้นจึงไม่โหลดแอปพลิเคชันหลักค้าง ซึ่งจะส่งผลให้การควบคุมแป้นพิมพ์กลับสู่ผู้ใช้เร็วขึ้น

แต่มันจะโหลดเมื่อไหร่? ในการใช้ฟังก์ชันโหมดหรือคุณสมบัติครั้งแรก

มันช้าลงไหม? ใช่ในการใช้งานครั้งแรก นั่นคือการแลกเปลี่ยน คุณต้องการที่จะชะลอตัวลงในเวลาเริ่มต้น emacs หรือในการใช้งานครั้งแรก

เห็นได้ชัดหรือไม่? การโหลดเมื่อเวลาเริ่มต้นดูเหมือนจะใช้เวลานานขึ้นเนื่องจากโหลดไลบรารีหลักอื่น ๆ แต่ในการใช้งานครั้งแรกมันให้ความรู้สึกเร็วขึ้นเฉพาะโหลดเซ็ตย่อยคุณสมบัติเท่านั้น

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

ฉันจะเลือกได้อย่างไร ในขณะที่ Drew และคนอื่น ๆ ชี้ให้เห็นในการตอบคำถามนี้คุณสามารถใช้ autoload และกลอุบายที่คล้ายกันเพื่อควบคุม แต่การพิจารณาที่สำคัญที่สุดควรเป็นรูปแบบการใช้งานของคุณ หากคุณใช้ emacs เช่น vi การเปิดและปิดอย่างต่อเนื่องเวลาเริ่มต้นจะกลายเป็นความเจ็บปวดอย่างเห็นได้ชัด แต่ในทางกลับกันหากคุณใช้ emacs ที่ทำงานอยู่ตลอดเวลาเวลาเริ่มต้นที่ 1 วินาทีหรือ 1 นาทีจะไม่สังเกตเห็นได้หรือสำคัญพอที่จะให้ความสำคัญ

โปรดทราบว่าคุณสามารถใช้โหมดแบตช์หรือZileสำหรับการเริ่มต้นทันทีในขณะที่ทำการทดสอบทำงานหรือใช้ emacs เช่น vi

การตั้งค่าของฉันคือการโหลดเมื่อเริ่มต้นเพื่อให้ข้อผิดพลาดใด ๆ ที่จะถูกจับล่วงหน้า ฉันไม่ต้องการที่จะจัดการกับข้อผิดพลาดในการโหลดใด ๆ ในระหว่างวันทำงานเมื่อฉันมีบัฟเฟอร์โหมดและสถานะการคอมไพล์ที่นับไม่ถ้วนพร้อมกับสถานที่ห่างไกลที่จัดการโดย TRAMP การดีบักข้อผิดพลาด autoload ในเงื่อนไขดังกล่าวไม่น่าพอใจมาก


10

ห้องสมุดที่รวมอยู่จำนวนมากจะไม่ถูกโหลดเมื่อคุณเริ่มต้น

คำสั่งบางคำสั่ง ฯลฯ มีการโหลดอัตโนมัติซึ่งหมายความว่า Emacs รู้จักและรู้วิธีโหลด เมื่อคุณพยายามใช้คำสั่งที่โหลดอัตโนมัติ Emacs จะโหลดไลบรารีที่กำหนดไว้หากยังไม่ได้โหลด

คุณสามารถสร้าง autoloads ของคุณเองไม่ว่าจะเป็นคำสั่งของคุณเองหรือคำสั่งในไลบรารีที่คุณไม่ได้เขียน ดูคู่มือ Elisp โหนดAutoload


ในฐานะที่รู้จักกันในชื่อ lazy-loading ฉันเข้าใจหรือไม่ มีตัวอย่างใดบ้างที่ทำให้การโหลดแบบสันหลังยาวบรรลุผลซึ่งจะถูกโหลดเมื่อเรียกเท่านั้น?
ReneFroger

ไม่แน่ใจในสิ่งที่คุณถาม ใช่คุณสามารถเรียกมันว่าขี้เกียจโหลด มีตัวอย่างและคำอธิบายในคู่มือ Elisp การเพิ่มคุกกี้ autoload ( ;;;###autoload) ก่อนคำนิยามคำสั่งในไลบรารีของคุณเป็นวิธีหนึ่งในการให้คำจำกัดความ autoload เพื่อให้แน่ใจว่าไลบรารีของมันจะถูกโหลดเมื่อมีคนเรียกใช้
ดึง

... แต่อ่านลิงค์ด้วยตนเองนั้นเพื่อทำความเข้าใจว่าคุกกี้เหล่านั้นถูกประมวลผลอัตโนมัติหรือไม่ ผู้จัดการแพคเกจจัดการพวกเขาสำหรับแพคเกจ ELPA ทั้งหมด มิฉะนั้นคุณจะโทร(autoload...)โดยตรงในไฟล์ init เพื่อลงทะเบียน
phils

ขอบคุณสำหรับคำตอบทั้งคู่ของคุณมันช่วยได้มากในการหาข้อมูลเพิ่มเติม!
ReneFroger

9

นอกเหนือจากคำตอบอื่น ๆ (ซึ่งอธิบายว่าห้องสมุดส่วนใหญ่มีการโหลดตามความต้องการจริง ๆ แล้วเท่านั้น) นอกจากนี้ยังมีเรื่องของการโหลดไลบรารี elisp core จำนวนมากไว้ล่วงหน้าภายในemacsตัวปฏิบัติการเองซึ่งให้ภาพลวงตาของการโหลด สิ่งต่างๆมากมายอย่างรวดเร็วอย่างไม่น่าเชื่อ

นี่คือความสำเร็จจากการทำงานที่เรียกว่า "เปลือย" รุ่น Emacs (ซึ่งเป็นสิ่งที่ถูกรวบรวมจริงและที่เป็นทำงานอย่างเต็มที่ แต่มีเพียงล่าม Elisp และการทำงานหลักอื่น ๆ เขียนใน C) และบอกว่าจะโหลด ไลบรารี elisp ทั้งหมดที่ควรโหลดไว้ล่วงหน้าก่อนที่จะ "ทิ้ง" emacsไบนารีจริงด้วยไลบรารีเหล่านั้นในตัว

กลไกนี้มีรายละเอียดในคู่มือ elisp:
C-hig (elisp) Building Emacs RET

หากคุณได้รวบรวม Emacs ด้วยตัวเองคุณสามารถทดลองกับกระบวนการนี้ได้และสามารถถ่ายโอนไฟล์เวอร์ชันสุดท้ายของไฟล์ปฏิบัติการได้หากคุณต้องการ (ไม่แนะนำโดยทั่วไป แต่มีเครื่องอำนวยความสะดวก)

temacsไบนารีที่รวบรวมสามารถพบได้ในsrcไดเรกทอรีและคุณสามารถเปรียบเทียบความแตกต่างในเวลาเริ่มต้นโดยการเรียกใช้แต่ละรุ่นดังนี้:

$ time ./temacs -l loadup --batch
$ time ./emacs --batch

ในระบบของฉันระบบจะใช้เวลาประมาณ 4 วินาที (ในระหว่างที่โหลดไลบรารี elisp 111 ไฟล์) ในขณะที่ระบบหลังใช้เวลาประมาณ 0.02 วินาที


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