Emacs中如何用advice-add将无参函数绑定到带参函数上
解决方案
报错根因
Emacs 的 :after 类 advice 默认会将原函数的所有入参完整传递给 advice 函数,当 advice 函数参数列表长度与原函数不匹配时,就会触发参数数量错误。
通用实现方案
无需修改无参函数的定义,仅需在添加 advice 时用匿名函数包装一层,忽略所有传入参数即可:
绑定到 my/test-a 的写法
(advice-add 'my/test-a :after (lambda (&rest _) (my/test-b)))
绑定到 find-file 的写法
(advice-add 'find-file :after (lambda (&rest _) (my/test-b)))
说明
&rest _ 会捕获所有传递给 advice 的参数,下划线是 Elisp 约定的无用变量标识,包装层直接调用无参的 my/test-b 即可完全规避参数不匹配问题。该写法对原函数的入参数量、调用方式(交互/编程调用)没有要求,通用性强。
内容的提问来源于stack exchange,提问作者randouser
相关产品推荐
相关产品推荐

