Відображення помилок та попереджень у блоці коду в режимі org


11

Я хотів би мати можливість повідомляти про попередження та помилки під час оцінки блоку коду 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 під час оцінки блоку вихідного коду, відображається в окремому вікні так само, як якщо б не вдалося оцінити вихідний код.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.