今天看了一篇文章: Emacs: Avoid Lambda in Hook
说 Lambda 的问题主要是无法用 describe-variable
这样的方法查看信息,也无法用 remove-hook
删除。
感觉有点道理。
可是每次都定义 function 又觉得很繁琐。 各位怎么看?
今天看了一篇文章: 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))
我对于一些很短的代码都是直接写在lambda里的,要改的话最多就是重启一下嘛_(:3」∠)_
我是把 add-hook
改成 remove-hook
,之后再 C-x C-e
。也有些情况下用 (setq foo-hook nil)
清空所有的函数。另外,用 Custom 界面的话,用鼠标点两下就行。
我的习惯是,一般 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
即可。