Отображать ошибки и предупреждения в блоке кода режима орг.

10

Я хотел бы иметь возможность сообщать о предупреждениях и ошибках при оценке блока кода Python в файле Org.

Когда в блоке кода есть ошибки синтаксиса 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 предполагает, что вывод ошибки отображается только в случае сбоя при оценке блока кода. Таким образом, похоже, что это возможно, но только путем прерывания оценки с использованием exit(1)или подобным.

Джон О.
источник
Ответ Константина отлично работает для меня, если это также решение для вас, пожалуйста, примите ответ, если это не обновить ваш вопрос, пожалуйста.
atevm

Ответы:

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 во время оценки блока исходного кода, отображается в отдельном окне, как если бы оценка исходного кода не удалась.

Константин
источник