Hook 中该不该用 Lambda?

今天看了一篇文章: Emacs: Avoid Lambda in Hook

说 Lambda 的问题主要是无法用 describe-variable 这样的方法查看信息,也无法用 remove-hook 删除。 感觉有点道理。

可是每次都定义 function 又觉得很繁琐。 各位怎么看?

  • 用函数名容易维护,用 lambda 在写的时候省事些(用不着想名字、代码短些)
  • remove-hook 可以去掉 lambda ,但麻烦些,由于没有名字,需要把 lambda 完整写出来:
text-mode-hook
     => (text-mode-hook-identify)

(add-hook 'text-mode-hook (lambda () 123))
     => ((lambda nil 123) text-mode-hook-identify)

(remove-hook 'text-mode-hook (lambda () 123))
     => (text-mode-hook-identify)

  • 利用 defun 实际也返回一个函数(需要注意的是 doc-string 里明确规定了返回值未定义),要是想省一点点空间的话,也可以
(add-hook 'text-mode-hook (defun foo () 123))
2 个赞

我对于一些很短的代码都是直接写在lambda里的,要改的话最多就是重启一下嘛_(:3」∠)_

1 个赞

我是把 add-hook 改成 remove-hook,之后再 C-x C-e。也有些情况下用 (setq foo-hook nil) 清空所有的函数。另外,用 Custom 界面的话,用鼠标点两下就行。

1 个赞

我的习惯是,一般 hook 函数比较复杂的话,就重新定义一个新的函数,把所有 hook 相关的代码都放到新的函数里面:

(defun my-text-mode-hook ()
  (e1)
  (e2)
  (e3))

(add-hook 'text-mode-hook 'my-text-mode-hook)

移除某一个功能的话,比如 e2,就在 my-text-mode-hook 中注释掉 e2,然后 C-M-x 即可。

1 个赞