我试图通过一个类方法重载给定缓冲区中的 after-change-function。notify-others-ofchange 是一个任意的函数。
(defmethod set-after-change-functions ((server server-class)
name-of-buffer)
"Adds appropriate after-change-functions to the given name-of-buffer."
(with-current-buffer name-of-buffer
(setq-local after-change-functions
(cons
(lambda (beg end prev-length)
(notify-others-of-change
server beg end prev-length))
after-change-functions))))
当试图在给定的缓冲区上运行这个函数时(我检查了一下,传递了一个有效的服务器对象),Emacs向我大喊 "符号的值作为变量是void:server",并且after-change-functions变为nil,即使之前有元素在里面。然而,当改成
(defmethod set-after-change-functions ((server server-class)
name-of-buffer)
"Adds appropriate after-change-functions to the given name-of-buffer."
(with-current-buffer name-of-buffer
(setq-local after-change-functions
(cons
#'notify-others-of-change-SIMPLE
after-change-functions))))
其中notify-others-of-change-SIMPLE是基本的变更后函数,它只接受三个参数,就像上面的lambda一样,一切似乎都正常。我希望在这里使用lambda,但似乎不可能。为什么会出现这样的问题,是否可以将其改为允许使用lambdas?
按照 legoscia 链接的问题中的描述,将 lexical-binding 设置为 t 作为文件本地变量,同时确保我所有的 lambdas 都用锐角引号而不是只用引号,成功地解决了这个问题。谢谢