org执行代码块发生错误后的输出问题

请问下,org-mode在使用C-c C-c执行代码块时,如果有错,默认的results会新开一个buffer: Org-Babel Error Output 输出。当我下次再执行代码块时,需要先手动把这个buffer删除才能再执行代码。

能不能设置为把错误也输出到当前org buffer的 #+RESULTS: 下面?

有这个需要吗?我这边不删也可以再次执行代码块。

我不知道解决方法是什么,不过对于 Shell 代码块,有个 work-around ——把 stderr 重定向至 stdout 并保证返回值为 0

#+BEGIN_SRC sh
ls file_not_found 2>&1 || true
#+END_SRC

#+RESULTS:
: ls: cannot access 'file_not_found': No such file or directory

谢谢。

邮件列表中找到了差不多同样的问题.

这里 给了一个解决方案,我用了下面的代码后,错误都会在一个window中显示出来。修改错误后,不需要删buffer也可以执行了。

(defvar org-babel-eval-verbose t
  "A non-nil value makes `org-babel-eval' display")

(defun org-babel-eval (cmd body)
  "Run CMD on BODY.
If CMD succeeds then return its results, otherwise display
STDERR with `org-babel-eval-error-notify'."
  (let ((err-buff (get-buffer-create " *Org-Babel Error*")) exit-code)
    (with-current-buffer err-buff (erase-buffer))
    (with-temp-buffer
      (insert body)
      (setq exit-code
            (org-babel--shell-command-on-region
             (point-min) (point-max) cmd err-buff))
      (if (or (not (numberp exit-code)) (> exit-code 0)
              (and org-babel-eval-verbose (> (buffer-size err-buff) 0))) ; new condition
          (progn
            (with-current-buffer err-buff
              (org-babel-eval-error-notify exit-code (buffer-string)))
            nil)
        (buffer-string)))))

没明白什么意思,像我之前说的,删不删 *Org-Babel Error Output* 跟能不能执行代码块没有关系。

不知道是不是环境的问题,我这里如果不删这个buffer,再次执行代码时时候会提示: *Org-Babel Error Output* is read only 这样的错误,然后正确的代码也不能执行。

我加了前面那两句后,这个问题就没有了。