Os resultados do org-babel podem ser exibidos como comentários de código?

13

Em blogs, livros didáticos etc., é realmente comum exibir os resultados de alguns códigos como comentários, por exemplo:

(+ 1 1) ;=> 2

Existe uma maneira de exibir resultados como esse automaticamente usando o recurso Babel do Org-Mode?

Especificamente, o que eu gostaria é poder especificar um cabeçalho como este:

#+begin_src scheme <some headers>
(+ 1 1)
(/ 4 (* 2 2))
#+end_src

Se tornaria o seguinte quando eu C-c C-c:

#+begin_src scheme <some headers>
(+ 1 1) ;=> 2
(/ 4 (* 2 2)) ;=> 1
#+end_src

E então, se eu fiz algumas alterações, assim ...

#+begin_src scheme <some headers>
(+ 1 5) ;=> 2
(/ 8 (* 2 2)) ;=> 1
#+end_src

... e C-c C-csubstituiria os comentários pelos atualizados:

#+begin_src scheme <some headers>
(+ 1 5) ;=> 6
(/ 8 (* 2 2)) ;=> 2
#+end_src

Ou, menos do que eu sonhei acima, existe uma maneira fácil de exibir resultados pelo renderizador de arquivos org do github, para que o seguinte fique visível (idealmente com a formatação especificada no nível do documento):

#+RESULTS:
: 2
parkeristyping
fonte
Idéia interessante, mas acho que não há nada pronto. Eu tentaria modificar o back-end específico da Babel para colocar os resultados no local predeterminado. Embora isso pareça complicado, quando os resultados têm várias linhas, por exemplo.
wvxvw

Respostas:

7

tente isso

Use blocos de código nomeados e nowebcabeçalho para transformar seu código em um programa alfabetizado.

#+NAME: my-code
#+BEGIN_SRC elisp :exports none 
(+ 1 1)
#+END_SRC

#+NAME: my-other-code 
#+BEGIN_SRC elisp :exports none 
(/ 4 (* 2 2))
#+END_SRC

Crie um orgbloco de código para formatar seu código com o resultado

#+BEGIN_SRC org :results drawer replace :noweb yes :exports results 

  ,#+NAME: my-code-with-answer
  ,#+BEGIN_SRC elisp  :exports code 
  <<my-code>> ;=> <<my-code()>>
  <<my-other-code>> ;=> <<my-other-code()>>
  ,#+END_SRC


#+END_SRC

Faça um bloco C-c C-cno orgcódigo e você verá resultados semelhantes ao código abaixo:

#+RESULTS:
:RESULTS:

#+NAME: my-code-with-answer
#+BEGIN_SRC elisp  :exports code 
(+ 1 1) ;=> 2
(/ 4 (* 2 2)) ;=> 1
#+END_SRC

:END:

Se você postar código no Github, deverá ver

(+ 1 1) ;=> 2
(/ 4 (* 2 2)) ;=> 1

Este código foi testado com o
GNU Emacs 24.5.1 (x86_64-unknown-cygwin, GTK + versão 3.14.13)
Versão em modo de organização: 8.3.2
e github.

Melioratus
fonte
Obrigado. Essa é uma abordagem útil e parece flexível o suficiente para permitir a formatação dos resultados da maneira que desejar. Mas acho que (como minha própria solução) é muito detalhado para ser conveniente para anotações rápidas ou postagens de blog, o que eu esperava encontrar. Talvez algumas modificações no babel baseadas nessa funcionalidade possam me levar até lá.
parkeristyping
1
@parkeristyping - eu concordo. É muito detalhado. Se é algo que eu faço com bastante frequência, por exemplo, blog, normalmente escrevo algum código de modelo para gerar o código organizacional formatado na etapa 2. Em seguida, atualizo uma variável passada para o gerador de modelos, por exemplo :var my_code='("my-code" "my-other-code"). Mesmo assim, ainda é mais complicado do que eu gostaria. Deseja que eu atualize minha resposta?
Melioratus 04/04
@parkeristyping - Acabei de descobrir outra maneira, mas isso exige que você exporte o arquivo organizacional original e publique a exportação no GitHub.
Melioratus 04/04
3

O mais próximo que pude obter com a funcionalidade existente do Babel é o seguinte:

Primeiro, defino uma função emacs-lisp para acrescentar resultados com ";=> ":

#+name: commentify
#+begin_src emacs-lisp :var result="" :exports none
(concat ";=> " (format "%s" result))
#+end_src

Então eu processo os resultados usando o :postcabeçalho:

#+begin_src scheme :post commentify(*this*) :results code :exports both
(+ 5 7)
#+end_src

Isso retorna o seguinte C-c C-c, que é exibido no github devido ao :exports bothcabeçalho, mas está em um bloco de código separado.

#+RESULTS:
#+BEGIN_SRC scheme
;=> 12
#+END_SRC

Eu acho que essa estratégia deixa o arquivo organizacional muito confuso para valer a pena, no entanto. E, a menos que eu desative a confirmação da avaliação do código, tenho que aceitar dois "Tem certeza de que deseja avaliar o código?" prompts (um para o bloco Scheme e outro para o elisp commentify).

parkeristyping
fonte
1

Você pode fazer algo assim:

  1. Escreva seu bloco de código fonte Multi-Line nomeado como de costume

  2. Altere a disposição de BEGIN/END_SRCpara …-EXAMPLE:

    # + NAME: fonte real
    # + BEGIN_EXAMPLE emacs-lisp
    (+ 3 4)
    (* 4 47)
    # + END_EXAMPLE
  1. Cole e execute este bloco no primeiro bloco de código.
    # + NOME: LispBlock
    # + HEADER:: var lcmds = fonte real
    # + BEGIN_SRC emacs-lisp: resultados: wrap src emacs-lisp
    (dolist (cmd (lcmds de cadeia de caracteres "\ n")))
      (a menos que (string = "" cmd)
        (princ
         (formato "% s \ t; →% s \ n"
                 cmd (eval (carro (cmd de leitura de sequência)))))))
    # + END_SRC
  1. Resultado:
    # + RESULTADOS: LispBlock
    # + BEGIN_src emacs-lisp
    (+ 3 4); → 7
    (* 4 47); → 188
    # + END_src
  1. Adicione blocos de origem multilinhas adicionais com nomes individuais, conforme necessário, no seu texto

  2. Adicione #+CALL:linhas onde você der o nome do bloco como lcmdsvariável. O bloco de transformação acima é necessário apenas uma vez por documento.

Observe que o bloco Transforming precisa ser escrito no idioma que você está tratando.

Tentei primeiro "automatizar" a boa solução do @melioratus, mas tive problemas com isso quando encontrei a solução acima.

@jpkotta thx por apontar a correção necessária para evitar problemas de lista de números com código de bloco.

Alex Stragies
fonte
1
Solução muito inteligente! Obrigado por publicar!
Melioratus 11/02