如何在Emacs中将消息/回显输出重定向到缓冲区?

5
我正在为自己编写一些辅助函数。它们首先调用org-publish-project,然后在该输出上调用外部脚本。我希望将执行的所有输出收集到一个弹出的临时缓冲区中。
外部内容更容易处理。函数shell-command接受第二个参数作为stdout发送的缓冲区。但是org-publish-project仅将输出回显到minibuffer,并且如果有任何地方显示在*Messages*中。我是否可以将所有回显重定向到给定的缓冲区?
3个回答

5
很遗憾,没有这样的重定向。您可以尝试建议使用message函数,它会捕获许多这些消息,但不一定所有。
(defvar my-message-output-buffer nil)

(defadvice message (around my-redirect activate)
  (if my-message-output-buffer
      (with-current-buffer my-message-output-buffer
        (insert (apply #'format (ad-get-args 0))))
    ad-do-it))

另一种类似的方法是使用cl-fletmessage,在cl-flet表单中调用org-publish-project - juanleon
不,cl-flet 没有用处。你可以使用 cl-letf 或旧的 flet,但我建议使用 defadvice(或 advice-add)方法。 - Stefan
感谢您的评论,一如既往地澄清问题(我还是想念旧版,总是对不同的备选项感到困惑 :-) )。 - juanleon
我想这是最接近的了。或者也许有工具可以检查对“message”的调用堆栈,看看哪些堆栈包含“org-publish-project”::think :) - mike3996

4

根据org-publish-project内部用于显示消息的内容,以下内容可能适用:

(with-output-to-temp-buffer "*foo*"
  (do-stuff))
(pop-to-buffer "*foo*")

0

为了将所有消息输出临时重定向到当前缓冲区,请执行以下操作:

(defvar orig-message (symbol-function 'message))

(defun message-to-buffer (format-string &rest args)
  (insert (apply 'format format-string args) "\n"))

(defmacro with-messages-to-buffer (&rest body)
  `(progn (fset 'message (symbol-function 'message-to-buffer))
          (unwind-protect
              (progn ,@body)
            (fset 'message orig-message))))

;; Usage
(with-messages-to-buffer
 (message "hello"))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接