Я хочу добавить конкретную привязку ключа к режиму латекса:
(define-key latex-mode-map (kbd "<f6>") 'my-latex-defun)
В то же время я хочу установить его только при загрузке определенного режима. Поэтому я хотел бы знать, есть ли предпочтение (лучшая практика) между использованием соответствующего hook ( latex-mode-hook
) для выполнения этого или использованием предложения (with-eval-after-load "tex-mode" ...
для переноса определения привязки ключа. Я проверил оба, и они работают хорошо, однако мне интересно, какой из них является правильным способом сделать это.
with-eval-after-load
загружается один раз , поэтому смена ключа происходит там. Хуки загружаются каждый раз, когда запускается режим , например, при загрузке нового файла, связанного с режимом, или если хук определен. Вы могли бы загрузить, например,flyspell-mode
илиhl-line-mode
в крюк. По моемуinit.el
я используюwith-eval-after-load
примерно 160 раз иadd-hook
110 раз. Ленивый инициат является хорошим инициатором (IMO).Ответы:
Ленивый инициат - это хороший инициат.
(ИМО)
Когда использовать
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
он умен и будет делать правильные вещи, даже если переменная хука еще не загружена. Тем не менее, у меня есть много предложений, подобных следующему, которые могут быть незначительными для увеличения скорости, но дают ощущение организации и структуры зависимости:Зачем добавлять в крючок после
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
функцией. Тогда что-то вроде этого будет работать:Или вы могли бы так же,
require
org
как он в свою очередь потянетcdlatex
И, честно говоря, личная защита не будет иметь большого значения для времени инициации большую часть времени. 1150 строк личных определений (84 определения) в моем
init.el
добавлении 0,02 секунды по сравнению с ванильным Emacs.Измерение времени инициализации
Простой способ приблизить время инициализации
(эталон против
emacs -q
.Но чтобы получить более детальное приближение того, где узкие места инициализации, посмотрите на Джо Шефера
esup
.Наконец, время загрузки не исчезает волшебным образом. Вы только продвигаете его вперед (в той степени, в которой вы используете все функции в каждом сеансе).
источник
with-eval-after-load
без потери ленивых преимуществ инициализации?В дополнение к вашим предложениям
eval-after-load
и использованию крючка, позвольте мне предложитьuse-package.el
. Вы можете делать то, что вам нужно сЛатекс не будет загружен до после вы потребуете.
Как примечание: осторожное использование
use-package
сократило время запуска до секунды. (Раньше это занимало около четырех секунд.)источник
use-package
будет поставляться с Emacs 25.