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

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

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)) ( add-hook 'nxml-mode-hook 'my-xml-mode-keys)

Problems of Using Lambda in Hook

Lambda in hook is unreadable when reading value of a hook, such as in describe-variable or any keybinding help or log. 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 .

( remove-hook 'html-mode-hook 'xah-html-mode-keys)

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