建议消息不起作用

时间:2016-04-07 12:55:12

标签: elisp defadvice

(defun my-message (format-string &rest args)
  (apply 'message
         (concat "my-message: " format-string)
         args))

(my-message "abc %d" 123)
;; ==> "my-message: abc 123"
(message "abc %d" 123)
;; ==> "abc 123"

(advice-add 'message :around 'my-message)
;;(advice-remove 'message 'my-message)

advice-addmessage之后,会发出错误Wrong type argument: sequencep, #<subr message>。有什么问题?

1 个答案:

答案 0 :(得分:1)

由于您正在使用:around建议,因此您的my-message函数将原始函数作为其第一个参数。您的代码缺少此参数,而是将第一个参数视为消息格式字符串。更改您的my-message以指定其他参数:

(defun my-message (orig-fun format-string &rest args)
  (apply orig-fun
         (concat "my-message: " format-string)
         args))

然后建议将按预期工作。请注意此版本如何调用orig-fun而非硬编码'message作为apply目标。

但是,对于这种情况,您不需要:around建议。您所做的只是修改格式字符串,因此您可以使用:filter-args,它允许您在将参数传递给原始函数之前修改它们。这是一个适合您案例的例子:

(defun my-message (args)
  (nconc (list (concat "my-message: " (car args))) (cdr args)))
(advice-add 'message :filter-args #'my-message)