eval-after-load против режима hook
Есть ли разница между настройкой режима для eval-after-load
а с помощью режима ловушка?
Я видел код где define-key
используется внутри ловушки основного режима, и некоторый другой код, где define-key
используется в eval-after-load
форма.
Обновить:
Для лучшего понимания, вот пример использования перехватчиков eval-after-load и mode с org-mode. Код может быть запущен раньше (load "org")
или же (require 'org)
или же (package-initialize)
,
;; The following two lines of code set some org-mode options.
;; Usually, these can be outside (eval-after-load ...) and work.
;; In cases that doesn't work, try using setq-default or set-variable
;; and putting them in (eval-after-load ...), if the
;; doc for the variables don't say what to do.
;; Or use Customize interface.
(setq org-hide-leading-stars t)
(setq org-return-follows-link t)
;; "org" because C-h f org-mode RET says that org-mode is defined in org.el
(eval-after-load "org"
'(progn
;; Establishing your own keybindings for org-mode.
;; Variable org-mode-map is available only after org.el or org.elc is loaded.
(define-key org-mode-map (kbd "<C-M-return>") 'org-insert-heading-respect-content)
(define-key org-mode-map (kbd "<M-right>") nil) ; erasing a keybinding.
(define-key org-mode-map (kbd "<M-left>") nil) ; erasing a keybinding.
(defun my-org-mode-hook ()
;; The following two lines of code is run from the mode hook.
;; These are for buffer-specific things.
;; In this setup, you want to enable flyspell-mode
;; and run org-reveal for every org buffer.
(flyspell-mode 1)
(org-reveal))
(add-hook 'org-mode-hook 'my-org-mode-hook)))
1 ответ
Код, завернутый в eval-after-load
будет выполняться только один раз, поэтому он обычно используется для однократной настройки, такой как установка глобальных значений и поведения по умолчанию. Примером может быть установка таблицы ключей по умолчанию для определенного режима. В eval-after-load
код, нет понятия "текущий буфер".
Хуки режима выполняются один раз для каждого буфера, в котором включен режим, поэтому они используются для настройки каждого буфера. Поэтому перехватчики режима запускаются позже, чем eval-after-load
код; это позволяет им выполнять действия, основанные на такой информации, как о том, включены ли другие режимы в текущем буфере.