Як Emacs вдається запустити миттєво за допомогою багатьох el-файлів?


11

Як знає кожен Emacs'er, я в даний час страждаю від своєї великої конфігурації dot-Emacs. Всі мої пакети знаходяться в контейнерах use-package, і я перейшов до складу всіх своїх .elфайлів. Навіть з цим Emacs запускається за 6,4 секунди, а потім завантажує решту пакетів (близько 40 з них) після цього.

Я думав про інші способи вирішити довгий час запуску, потім щось помітив. За замовчуванням Emacs (без конфігурації користувача) використовує багато .elбібліотек, які входять до кожного Emacs. Вони розташовані в \shares\emacs\version number\lisp\.

Навіть із багатьма файлами lisp, йому вдається розпочати роботу за одну секунду. Коли я перевіряв файли багатьох пакетів, що входять до стандартного Emacs, я не знайшов нічого зайвого, який би міг пояснити, чому Emacs вдається запуститися протягом однієї секунди. Хто-небудь може мені сказати, як Emacs управляє цим, навіть із тисячами .elфайлів?


1
Чи використовуєте ви :defer tу своїх use-packageдеклараціях, де це можливо?
місячник

7
Численні основні бібліотеки в Emacs попередньо завантажуються у виконуваний файл через механізм скидання, який використовується при побудові Emacs, що також дає ілюзію, що він дуже швидко завантажує багато речей. Подивіться, C-h i g (elisp) Building Emacsчи вам цікаво дізнатися про це.
філс

2
@phils: Було б чудово, якби ви могли розширити свій коментар до відповіді, схоже, що механізм скидання ще не згадується на Emacs-SE.
паприка

і Моє 76-е ..
Leu_Grady

паприка: Готово ..
філс

Відповіді:


9

Хто-небудь може мені сказати, як Emacs управляє цим, навіть із тисячами .el-файлів?

Emacs "управляє" тим, що не завантажуючи при запуску, тим самим не затримуючи завантаження основної програми. Це, в свою чергу, як ефект швидшого повернення контролю клавіатури користувачеві.

Але коли він завантажений? При першому використанні цієї функції, режиму чи функції.

Це не гальмує? Так, при першому використанні. Це компроміс. Ви хочете сповільнити час запуску Emacs або під час першого використання.

Це помітно? Здається, час завантаження триватиме більше часу, оскільки завантажуються й інші основні бібліотеки. Але при першому використанні він відчуває себе швидше, оскільки завантажується лише ця функція підмножини.

Тоді навіщо хтось підбирати навантаження при запуску? Оскільки деякі не проти чекати завантаження всіх часто використовуваних бібліотек під час запуску, тому щойно завантажені всі операції виконуються швидко після цього.

Як я можу вибрати? Як Дрю та інші вказали у своїх відповідях на це саме запитання, ви можете використовувати автозавантаження та подібні хитрощі для управління. Але найважливішим слід враховувати вашу схему використання. Якщо ви часто використовуєте emacs типу vi, постійно відкриваючись і закриваючись, так, час запуску стає болісно очевидним. Але з іншого боку, якщо ви використовуєте emacs, який працює весь час, час запуску 1 секунди або 1 хвилини не буде настільки помітним або досить важливим для догляду.

Зауважте, що ви можете використовувати пакетний режим або Zile для миттєвого запуску під час тестування, запуску чи використання інших програм emacs, таких як vi.

Я вважаю за краще завантажуватися при запуску, щоб будь-які помилки виявлялися наперед. Я вважаю за краще не стикатися з будь-якими помилками завантаження, коли в розпал робочого дня, коли у мене є незліченна кількість буферів, режимів і станів компіляції, а також декілька віддалених місць, якими керується TRAMP. Налагодження помилок автозавантаження в таких умовах не дуже приємно.


10

Багато запущених бібліотек не завантажуються під час запуску.

Деякі команди тощо завантажуються автоматично , це означає, що Emacs розпізнає їх і вміє їх завантажувати. Коли ви намагаєтесь використовувати команду, яка автоматично завантажується, Emacs завантажує бібліотеку, яка її визначає, якщо вона ще не була завантажена.

Ви можете створювати власні автоматичні завантаження, чи не для власних команд чи команд у бібліотеках, які ви не писали. Дивіться посібник Elisp, вузол Автозавантаження .


Як я називаю ледачий навантаження, я припускаю? Чи є приклад того, як досягається ледачий навантаження, який завантажуватиметься лише тоді, коли він викликається?
ReneFroger

Не впевнений, що ви просите. Так, можна назвати це ледачим завантаженням. У посібнику Elisp є приклади та пояснення. Додавання файлу cookie для автоматичного завантаження ( ;;;###autoload) безпосередньо перед визначенням команди у вашій бібліотеці - це один із способів дати визначення автозавантаження, гарантуючи, що його бібліотека буде завантажена, коли хтось викликає її.
Дрю

... але прочитайте це посібник, щоб зрозуміти, як / якщо обробляються ці файли cookie з автоматичним завантаженням. Менеджер пакунків обробляє їх для всіх пакетів ELPA. Інакше ви зателефонуєте (autoload...)безпосередньо у свій файл init, щоб зареєструвати їх.
філс

Дякую за обидві відповіді, це дуже допомогло дізнатися більше!
ReneFroger

9

На додаток до інших відповідей (які пояснюють, як більшість бібліотек насправді завантажується лише на вимогу), також існує питання попереднього завантаження багатьох основних бібліотек elisp всередині самого emacsвиконуваного файлу, що забезпечує ілюзію завантаження а багато речей неймовірно швидко.

Це досягається, запустивши так звану "голу" версію Emacs (яка була фактично складена і яка є повністю функціональною, але містить лише інтерпретатор elisp та інші основні функціональні можливості, написані на С), і сказати, що завантажувати всі бібліотеки elisp, які повинні бути попередньо завантажені, перш ніж нарешті "скинути" власне emacsбінарні файли з вбудованими бібліотеками.

Цей механізм детально описаний у посібнику Elisp:
C-hig (elisp) Building Emacs RET

Якщо ви склали Emacs самостійно, тоді ви можете експериментувати з цим процесом і навіть можете скинути альтернативні версії остаточного виконуваного файлу, якщо бажаєте (як правило, не рекомендується, але програма є).

Скомпільований temacsдвійковий файл можна знайти в srcкаталозі, і ви можете порівняти різницю часу початку, запустивши кожну версію так:

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

У моїй системі перший займає ~ 4 секунди (протягом яких завантажується 111 бібліотек elisp), тоді як остання займає ~ 0,02 секунди.


Дуже приємно @phils за те, щоб зробити цю точку.
Користувач Emacs
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.