如何将消息/ echo输出重定向到Emacs中的缓冲区?

时间:2014-02-03 10:12:38

标签: emacs

我正在编写一些辅助函数供我使用。他们首先调用org-publish-project,然后在该输出上调用外部脚本。我想在弹出的临时缓冲区中收集执行中的所有输出。

外部的东西更容易。函数shell-command接受关于缓冲区发送stdout的第二个参数。但是org-publish-project只会向迷你缓冲区回复内容,如果在任何地方,它会显示在*Messages*上。我可以以某种方式将所有回声重定向到给定的缓冲区吗?

3 个答案:

答案 0 :(得分:3)

不,遗憾的是,没有这样的重定向。您可以尝试建议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))

答案 1 :(得分:2)

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

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

答案 2 :(得分: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"))