Exibir erros e avisos em um bloco de código no modo organizacional

10

Gostaria de poder relatar avisos e erros ao avaliar um bloco de código Python em um arquivo Org.

Quando um bloco de código tem erros de sintaxe do Python, a Org os exibe em um buffer separado chamado *Org-Babel Error Output*. Seria bom poder enviar meus próprios avisos para lá também, mantendo a capacidade de retornar um resultado de matriz para o modo Org como uma tabela usando :results value.

Para ficar claro, aqui está um exemplo fictício do tipo de coisa que pensei que poderia 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 adicionar: Esta discussão na lista de modo organizacional sugere que a saída de erro é exibida apenas quando a avaliação do bloco de código falha. Portanto, parece que isso é possível, mas apenas abortando a avaliação usando exit(1)ou similar.

Jon O.
fonte
A resposta de Constantine funciona perfeitamente para mim, se também é uma solução para você, por favor aceite a resposta, se não for atualizar sua pergunta, por favor.
atevm 25/02

Respostas:

6

Conforme descrito por Eric Schulte na org-modelista de discussão (veja o link na pergunta), podemos modificar org-babel-evalpara conseguir isso:

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

Agora, se org-babel-eval-verboseestiver definido como t, a saída impressa no stderr durante a avaliação de um bloco de código-fonte será exibida em uma janela separada, como se a avaliação do código-fonte falhasse.

Constantine
fonte