建议消息不起作用
Advicing message not working
(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-add
到 message
之后,发出错误 Wrong type argument: sequencep, #<subr message>
信号。有什么问题?
由于您使用的是 :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)
(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-add
到 message
之后,发出错误 Wrong type argument: sequencep, #<subr message>
信号。有什么问题?
由于您使用的是 :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)