在组织模式代码块中显示错误和警告


10

在评估Org文件中的Python代码块时,我希望能够报告警告和错误。

当代码块出现Python语法错误时,Org会帮助将其弹出到名为的单独缓冲区中*Org-Babel Error Output*。能够在该处发送我自己的警告,同时保留使用来将数组结果作为表格返回到组织模式的能力,这将是很好的:results value

明确地说,这是我认为可能起作用的一种虚拟示例:

#+BEGIN_SRC python 
    import sys
    sys.stderr.write('Warning.\n')
    sys.stderr.flush()
    return [['Table', 'header'], ['table', 'data']]
#+END_SRC

#+RESULTS:
| Table | header |
| table | data   |

编辑添加:关于组织模式列表的讨论表明,仅在代码块评估失败时才显示错误输出。因此看起来这是可能的,但是只能通过使用exit(1)或类似方法中止评估。


君士坦丁的答案对我来说是完美的,如果这也是您的解决方案,请接受答案,如果它不能更新您的问题,请。
atevm

Answers:


6

org-mode邮件列表上的Eric Sc​​hulte所述(请参阅问题中的链接),我们可以进行修改org-babel-eval以实现此目的:

(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-eval-verbose将设置为t,则在源代码块评估期间打印到stderr的输出将显示在单独的窗口中,就像源代码评估失败一样。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.