Emacs: Avoid Lambda in Hook

By Xah Lee. Date: . Last updated: .

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 with lambda.

;; 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'."
  (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

  1. Lambda in hook is unreadable when reading value of a hook, such as in describe-variable or any keybinding help or log.
  2. Lambda in hook is cannot be removed using remove-hook.

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         ??

Also, you can lookup a hook's value by Alt+x describe-variable. If you used lambda, it's harder to read.

A hook is a list of functions. If you use function symbols, you can remove some of your hooked function by Alt+x remove-hook.

;; removing a hook
(remove-hook 'html-mode-hook 'xah-html-mode-keys)

thanks to Steve Youngs for input.

Liket it? Put $5 at patreon. Or Buy Xah Emacs Tutorial. Thanks.