求助:如何批量为多个函数添加相同的 advice

如题。 我自己尝试了:

(defvar my-functions
  '(my-1
    my-2
    my-3
    my-4))

(loop for func in 'my-functions
      (advice-add 'save-buffer :after (symbol-name func)))

会出现错误:

Eager macro-expansion failure: 
(error "Expected a cl-loop keyword, found (advice-add 'save-buffer :after (symbol-name func))") [2 times]

不知道如何解决,goole 无果。

(cl-loop for func in my-functions
         do (advice-add 'save-buffer :after (symbol-name func)))

另外我的评价是不如用 dolist

(dolist (f my-functions)
  (advice-add 'save-buffer :after (symbol-name func)))

loop 我只在需要对一个 list 同时执行多个操作(比如过滤再map再过滤之类)时才用, 避免重复迭代一个列表 ,因为 Emacs 没有内置的 lazy iterator 这种 API.

1 个赞

(symbol-name func) 这里是不是有什么问题? 我试了一下你的代码,没有出现

This function has :after advice ...

这样的提示说明 advice 添加成功了。

改成直接用 func, 不要用 symbol-name, 用了之后就返回一个 string, 就没有作用了

(dolist (f my-functions)
  (advice-add 'save-buffer :after func))
(dolist (f my-functions)
  (advice-add func :after #'save-buffer))

改成这样就可以了。:sweat_smile: 顺序反了。谢谢你的建议。