Emacs: Avoid Lambda in Hook
When you add function to a hook, it is best to avoid using lambda. Instead, define the function of what you want to do, then add that function name to the hook.
〔➤see Emacs: What's Hook?〕
Here's a hook definition, written in the way most people would write it:
;; don't do this ;; modify nxml-mode's shortcut keys (add-hook 'nxml-mode-hook (lambda () (local-set-key (kbd "<f8>") 'browse-url-of-buffer) (local-set-key (kbd "<tab>") 'html-next-content) (local-set-key (kbd "S-<tab>") 'html-previous-content)))
However, it is better done like this:
(defun my-xml-mode-keys () "my keys for `xml-mode'." (interactive) (local-set-key (kbd "<f8>") 'browse-url-of-buffer) (local-set-key (kbd "<tab>") 'html-next-content) (local-set-key (kbd "S-<tab>") 'html-previous-content) ) (add-hook 'nxml-mode-hook 'my-xml-mode-keys)
Problems of Using Lambda in Hook
- Unreadable when reading value of a hook, such as in
describe-variableor any keybinding help or log.
- Cannot be removed using
Following are details.
when you type some key followed by 【Ctrl+h】, those bound to a lambda shows as question mark. Example:
<tab> m xah-html-pre-source-code <tab> p xah-html-wrap-p-tag <tab> r ?? <tab> s ?? <tab> u xah-html-wrap-html-tag <tab> w ??
A hook is a list of functions. If you use function symbols, you can remove some of your hooked function by calling
;; example of removing a hook (remove-hook 'html-mode-hook 'xah-html-mode-keys)
You can lookup a hook's value by calling
describe-variable. If you used lambda, it's harder to read.
thanks to Steve Youngs for input.