Visualizza errori e avvisi in un blocco di codice in modalità org


10

Vorrei poter segnalare avvisi ed errori durante la valutazione di un blocco di codice Python in un file Org.

Quando un blocco di codice presenta errori di sintassi di Python, Org li apre in un buffer separato chiamato *Org-Babel Error Output*. Sarebbe bello poter inviare anche i miei avvertimenti lì, pur mantenendo la possibilità di riportare un risultato di array in modalità Org come tabella usando :results value.

Per essere chiari, ecco un esempio fittizio del tipo di cosa che pensavo potesse funzionare:

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

Modificato per aggiungere: questa discussione nell'elenco delle modalità organizzative suggerisce che l'output dell'errore viene visualizzato solo quando la valutazione del blocco di codice ha esito negativo. Quindi sembra che sia possibile, ma solo interrompendo la valutazione usando exit(1)o simili.


La risposta di Costantino funziona perfettamente per me, se è anche una soluzione per te, accetta la risposta, se non aggiorna la tua domanda, per favore.
atevm,

Risposte:


6

Come descritto da Eric Schulte sulla org-modemailing list (vedi il link nella domanda) possiamo modificare org-babel-evalper raggiungere questo obiettivo:

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

Ora, se org-babel-eval-verboseimpostato su t, l'output stampato su stderr durante la valutazione di un blocco di codice sorgente viene visualizzato in una finestra separata, proprio come se la valutazione del codice sorgente non fosse riuscita.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.