Tampilkan kesalahan dan peringatan dalam blok kode mode-org

10

Saya ingin dapat melaporkan peringatan dan kesalahan saat mengevaluasi blok kode Python dalam file Org.

Ketika blok kode memiliki kesalahan sintaksis Python, Org membantu memunculkannya dalam buffer terpisah yang disebut *Org-Babel Error Output*. Akan lebih baik untuk dapat mengirim peringatan saya sendiri di sana juga, sambil tetap mempertahankan kemampuan untuk mengembalikan hasil array ke mode Org sebagai menggunakan tabel :results value.

Untuk lebih jelasnya, berikut adalah contoh tiruan dari jenis hal yang saya pikir mungkin berhasil:

#+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   |

Diedit untuk ditambahkan: Diskusi ini pada daftar mode-org menyarankan bahwa output kesalahan hanya ditampilkan ketika evaluasi blok kode gagal. Jadi sepertinya ini mungkin, tetapi hanya dengan membatalkan evaluasi menggunakan exit(1)atau serupa.

Jon O.
sumber
Jawaban Constantine berfungsi dengan baik untuk saya, jika itu juga merupakan solusi untuk Anda, silakan terima jawabannya, jika itu tidak memperbarui pertanyaan Anda.
atevm

Jawaban:

6

Seperti dijelaskan oleh Eric Schulte di org-modemilis (lihat tautan dalam pertanyaan) kita dapat memodifikasi org-babel-evaluntuk mencapai ini:

(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)))))

Sekarang jika org-babel-eval-verbosediatur ke t, output dicetak ke stderr selama evaluasi blok kode sumber muncul di jendela terpisah sama seperti jika evaluasi kode sumber gagal.

Constantine
sumber