Wyświetlaj błędy i ostrzeżenia w bloku kodu w trybie organizacji

11

Chciałbym móc zgłaszać ostrzeżenia i błędy podczas oceny bloku kodu Python w pliku Org.

Gdy blok kodu zawiera błędy składniowe Pythona, Org wyświetla je w osobnym buforze o nazwie *Org-Babel Error Output*. Byłoby miło móc wysyłać tam również własne ostrzeżenia, zachowując możliwość powrotu wyniku tablicy do trybu Org jako tabeli przy użyciu :results value.

Dla jasności, oto fałszywy przykład rzeczy, które moim zdaniem mogą zadziałać:

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

Edytowano, aby dodać: Ta dyskusja na liście trybów org sugeruje, że wyjście błędu jest wyświetlane tylko wtedy, gdy ocena bloku kodu nie powiedzie się. Wygląda więc na to, że jest to możliwe, ale tylko poprzez przerwanie oceny za pomocą exit(1)lub podobnego.

Jon O.
źródło
Odpowiedź Constantine'a działa dla mnie idealnie, jeśli jest to również rozwiązanie dla ciebie, proszę zaakceptuj odpowiedź, jeśli nie jest to aktualizacja twojego pytania, proszę.
atevm

Odpowiedzi:

6

Zgodnie z opisem Erica Schulte na org-modeliście mailingowej (patrz link w pytaniu) możemy to zmienić 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)))))

Teraz, jeśli org-babel-eval-verbosejest ustawiony na t, dane wyjściowe drukowane do stderr podczas oceny bloku kodu źródłowego są wyświetlane w osobnym oknie, tak jakby ocena kodu źródłowego nie powiodła się.

Konstantyn
źródło