Ледачий ініт - хороший ініт.
(ІМО)
Коли використовувати with-eval-after-load
with-eval-after-loadзавантажуються один раз , коли певна функція або файл буде першою завантажена, тому розкладка зміна явно йде в один з них. Не в останню чергу тому, що мапа клавіш може бути невідома в init-час [спробуйте щось на кшталт (define-key message-mode-map (kbd "C-c f") 'Footnote-add-footnote)in emacs -q]. Гачок не є приємним рішенням, оскільки він прив'язує функцію до клавіші щоразу, коли гак запускається. Як Tarsius замітки, ви можете дізнатися більше про те, чому НЕ на local-set-keyгачки.
Нарешті, зауважте, що with-eval-after-loadGNU Emacs 24.4 - це дворядкова обгортка навколо, eval-after-loadде bodyне потрібно цитувати.
Коли використовувати гачки
Гачки - це список функцій, що завантажуються щоразу, коли виконується критерій, наприклад, запускається певний режим. Загальне використання гаків - це завантаження другорядних режимів, таких як flyspell-modeабо hl-line-mode. Напр (add-hook 'org-agenda-mode-hook 'hl-line-mode). Як зазначає Ремі , 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потрібно кілька місць? Якщо ви справді вибагливі, можете помістити defuns в інший файл у свій файл load-pathі додати autoloadфайли cookie, або ви можете сказати 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
І, чесно кажучи, більшість часу особисті розбої не матимуть великого значення. 1150 рядків особистих порушень (84 винищування) init.elдодає 0,02 секунди над ванільним Emacs.
Вимірювання часу ініціалізації
Простий спосіб наблизити час до спонукання
time emacs --eval "(kill-emacs)"
(орієнтир проти emacs -q.
Але для отримання більш детального наближення до того, де знаходяться вузькі місця ініціалізації, перегляньте Джо Шафер esup.
Нарешті, час завантаження не зникає магічно. Ви лише підштовхуєте його вперед (до розширення, що використовуєте всі функції в кожному сеансі).
with-eval-after-loadзавантажується один раз , тому зміна ключової карти відбувається туди. Гачки завантажуються щоразу, коли запускається режим , наприклад, при завантаженні нового файлу, пов’язаного з режимом, або якщо гак визначений. Ви б завантажували, наприклад,flyspell-modeабоhl-line-modeв гачок. В моємуinit.elя використовуюwith-eval-after-loadприблизно 160 разів іadd-hook110 разів. Ледачий ініт - це добрий ініт (ІМО).