Hiển thị lỗi và cảnh báo trong khối mã chế độ org


10

Tôi muốn có thể báo cáo các cảnh báo và lỗi khi đánh giá khối mã Python trong tệp Org.

Khi một khối mã có lỗi cú pháp Python, Org sẽ bật chúng một cách hữu ích trong một bộ đệm riêng được gọi *Org-Babel Error Output*. Thật tuyệt khi có thể gửi cảnh báo của riêng tôi đến đó, trong khi vẫn giữ được khả năng trả về kết quả mảng cho chế độ Org dưới dạng bảng bằng cách sử dụng :results value.

Để rõ ràng, đây là một ví dụ giả về loại điều tôi nghĩ có thể hoạt động:

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

Chỉnh sửa để thêm: Cuộc thảo luận này trong danh sách chế độ tổ chức cho thấy đầu ra lỗi chỉ được hiển thị khi đánh giá khối mã không thành công. Vì vậy, có vẻ như điều này là có thể, nhưng chỉ bằng cách hủy bỏ việc đánh giá bằng cách sử dụng exit(1)hoặc tương tự.


Câu trả lời của Constantine hoàn toàn phù hợp với tôi, nếu đó cũng là một giải pháp cho bạn, vui lòng chấp nhận câu trả lời, nếu nó không cập nhật câu hỏi của bạn, xin vui lòng.
atevm

Câu trả lời:


6

Theo mô tả của Eric Schulte trong org-modedanh sách gửi thư (xem liên kết trong câu hỏi), chúng tôi có thể sửa đổi org-babel-evalđể đạt được điều này:

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

Bây giờ nếu org-babel-eval-verboseđược đặt thành t, đầu ra được in thành stderr trong quá trình đánh giá khối mã nguồn sẽ hiển thị trong một cửa sổ riêng giống như khi đánh giá mã nguồn không thành công.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.