Ледачий ініт - хороший ініт.
(ІМО)
Коли використовувати 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-load
GNU 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
потрібно кілька місць? Якщо ви справді вибагливі, можете помістити defun
s в інший файл у свій файл 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-hook
110 разів. Ледачий ініт - це добрий ініт (ІМО).