Ленивый инициат - это хороший инициат.
(ИМО)
Когда использовать with-eval-after-load
with-eval-after-load
загружаются один раз , когда определенная функция или файл будет первой загружена, поэтому раскладка смена явно идет в один из них. Не в последнюю очередь, потому что раскладка клавиш может быть неизвестна во время инициализации [попробуйте что-то вроде (define-key message-mode-map (kbd "C-c f") 'Footnote-add-footnote)
в 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
куки, или вы можете указать 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 раз. Ленивый инициат является хорошим инициатором (IMO).