組織モードのコードブロックにエラーと警告を表示する


10

OrgファイルのPythonコードブロックを評価するときに警告とエラーを報告できるようにしたいと思います。

コードブロックにPython構文エラーがある場合、Orgはそれらをと呼ばれる別のバッファーにポップアップ表示します*Org-Babel Error Output*。を使用して配列の結果をOrgモードにテーブルとして返す機能を保持しながら、そこにも自分の警告を送信できると便利です: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   |

追加のために編集:org-modeリストに関するこのディスカッションは、コードブロックの評価が失敗した場合にのみエラー出力が表示されることを示唆しています。したがって、これは可能であるように見えますが、exit(1)またはを使用して評価を中止することによってのみ同様です。


コンスタンティンの答えは私にとって完璧に機能します。それが解決策でもある場合は、答えを受け入れてください。質問が更新されない場合は、受け入れてください。
atevm 2018

回答:


6

org-modeメーリングリストでエリックシュルテが説明したように(質問のリンクを参照)、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に出力される出力は、ソースコードの評価が失敗した場合と同じように、別のウィンドウに表示されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.