Emacs Init: 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: Hook]

Here's a hook definition, written with lambda.

;; modify nxml-mode keys
(add-hook 'nxml-mode-hook
          (lambda ()
            (local-set-key (kbd "<f8>") 'browse-url-of-buffer)))

;; HHHH---------------------------------------------------
;; better done like this

(defun my-xml-mode-keys ()
  "change keys for `xml-mode'."
  (local-set-key (kbd "<f8>") 'browse-url-of-buffer))

(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 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 remove-hook.

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

thanks to [Steve Youngs https://plus.google.com/117914896572210140511/posts] for input.

Emacs Hook