Emacs Lisp,如何映射宏,并评估其中一个参数

时间:2012-07-05 08:59:17

标签: emacs elisp advising-functions defadvice

Bob Glickstein在“编写GNU Emacs Extensions”第3章中介绍了一种建议滚动函数的方法。 (他建议让它们可逆,所以我们必须在滚动之前保存状态。)

E.g。对于向上滚动命令,这个建议是这样完成的

(defadvice scroll-up-command (before reversibilate activate compile)
   "If it wants to be reversible, it must save the former state."
   (save-before-scroll))

好。我当然必须对所有滚动命令执行此操作。所以我想制作一系列的,并希望一起建议。

(setq reversible-scroll-commands 
  [scroll-up-command 
   scroll-down-command 
   scroll-left-command 
   scroll-right-command])

(我用一个向量来保存5个引号。)

但现在我被卡住了。

(mapcar 
  (lambda (fun-name)
    (defadvice fun-name (before reversibilate activate compile)
       "If it wants to be reversible, it must save the former state."
       (save-before-scroll)))
   reversible-scroll-commands)

会告诉(不存在的)函数fun-name四次,因为defadvice是一个宏,并且不会评估fun-name。

有什么办法吗?

(我正在使用Emacs 24)

1 个答案:

答案 0 :(得分:3)

未测试:

(mapcar 
  (lambda (fun-name)
    (eval `(defadvice ,fun-name (before reversibilate activate compile)
             "If it wants to be reversible, it must save the former state."
             (save-before-scroll))))
   reversible-scroll-commands)

请参阅elisp手册中的section about backquotes