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 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'."
  (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. Unreadable when reading value of a hook, such as in describe-variable or any keybinding help or log.
  2. 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         ??

A hook is a list of functions. If you use function symbols, you can remove some of your hooked function by calling remove-hook. Example:

;; 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.

Like it? Buy Xah Emacs Tutorial. Thanks.

or, buy something from Best Keyboard for Emacs