Mostrar errores y advertencias en un bloque de código del modo org

10

Me gustaría poder informar advertencias y errores al evaluar un bloque de código Python en un archivo Org.

Cuando un bloque de código tiene errores de sintaxis de Python, Org los muestra en un búfer separado llamado *Org-Babel Error Output*. Sería bueno poder enviar mis propias advertencias allí también, al tiempo que conserva la capacidad de devolver un resultado de matriz al modo Org como una tabla usando :results value.

Para ser claros, aquí hay un ejemplo ficticio del tipo de cosas que pensé que podrían funcionar:

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

Editado para agregar: esta discusión en la lista del modo de organización sugiere que la salida de error solo se muestra cuando falla la evaluación del bloque de código. Entonces parece que esto es posible, pero solo abortando la evaluación usando exit(1)o similar.

Jon O.
fuente
La respuesta de Constantine funciona perfectamente para mí, si también es una solución para usted, acepte la respuesta, si no actualiza su pregunta, por favor.
atevm

Respuestas:

6

Según lo descrito por Eric Schulte en la org-modelista de correo (vea el enlace en la pregunta), podemos modificar org-babel-evalpara lograr esto:

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

Ahora, si org-babel-eval-verboseestá configurado en t, la salida impresa en stderr durante la evaluación de un bloque de código fuente se muestra en una ventana separada, como si la evaluación del código fuente fallara.

Constantina
fuente