请问下,org-mode在使用C-c C-c执行代码块时,如果有错,默认的results会新开一个buffer: Org-Babel Error Output 输出。当我下次再执行代码块时,需要先手动把这个buffer删除才能再执行代码。
能不能设置为把错误也输出到当前org buffer的 #+RESULTS: 下面?
请问下,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
这样的错误,然后正确的代码也不能执行。
我加了前面那两句后,这个问题就没有了。