I risultati di org-babel possono essere emessi come commenti di codice?


13

Nei blog, nei libri di testo, ecc., È molto comune visualizzare i risultati di alcuni codici come commenti, ad esempio:

(+ 1 1) ;=> 2

C'è un modo per visualizzare automaticamente risultati come questo usando la funzione Babel di Org-Mode?

Nello specifico, mi piacerebbe poter specificare un'intestazione tale che:

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

Si trasformerebbe nel seguente quando io C-c C-c:

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

E poi se ho apportato alcune modifiche, in questo modo ...

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

... e C-c C-csostituirà i commenti con quelli aggiornati:

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

Oppure, a parte quello che ho immaginato sopra, c'è un modo semplice per avere risultati visualizzati dal renderer di file org di github, quindi sarebbe visibile quanto segue (idealmente con la formattazione che specifico a livello di documento):

#+RESULTS:
: 2

Idea interessante, ma non credo che ci sia qualcosa di pronto. Proverei a modificare il backend Babel specifico per posizionare i risultati nel luogo predeterminato. Anche se questo sembra complicato, ad esempio quando i risultati hanno più righe.
wvxvw,

Risposte:


7

prova questo

Usa i blocchi di codice e l' nowebintestazione con nome per trasformare il tuo codice in un programma letterato.

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

Crea un orgblocco di codice per formattare il codice con il risultato

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

Fare un C-c C-cin orgblocco di codice e si dovrebbe vedere risultati simili al codice qui sotto:

#+RESULTS:
:RESULTS:

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

:END:

Se pubblichi un codice su Github, dovresti vedere

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

Questo codice è stato testato con
GNU Emacs 24.5.1 (x86_64-unknown-cygwin, GTK + Versione 3.14.13) Versione
Org-Mode: 8.3.2
e github.


Grazie. Questo è un approccio utile e sembra abbastanza flessibile da consentire la formattazione dei risultati nel modo che desidero. Ma penso che (come la mia soluzione) sia troppo prolisso per essere conveniente per appunti rapidi o post di blog, che è quello che speravo di trovare. Forse alcune modifiche alla costruzione di Babele su questa funzionalità potrebbero portarmi lì, però.
parkeristyping

1
@parkeristyping - Sono d'accordo. È troppo prolisso. Se è qualcosa che farò abbastanza spesso, ad esempio blog, di solito scrivo un codice modello per generare il codice org formattato nel passaggio 2. Quindi aggiorno semplicemente una variabile passata nel generatore di modelli, ad es :var my_code='("my-code" "my-other-code"). Anche così è ancora più ingombrante di quanto vorrei. Vuoi che aggiorni la mia risposta?
Melioratus,

@parkeristyping: ho appena capito un altro modo, ma è necessario esportare il file org originale e pubblicare l'esportazione su GitHub.
Melioratus,

3

Il più vicino che sono stato in grado di realizzare con la funzionalità Babel esistente è il seguente:

Innanzitutto, definisco una funzione emacs-lisp per anteporre i risultati con ";=> ":

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

Quindi elaboro i risultati usando l' :postintestazione:

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

Ciò restituisce quanto segue C-c C-c, che viene visualizzato su github a causa :exports bothdell'intestazione, ma si trova in un blocco di codice separato.

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

Penso che questa strategia lasci il file dell'organizzazione troppo disordinato per valerne la pena, comunque. E, a meno che non disabiliti la conferma della valutazione del codice, devo accettarne due "Sei sicuro di voler valutare il codice?" prompt (uno per il blocco Scheme e uno per l'elisp commentify).


1

Puoi fare qualcosa del genere:

  1. Scrivi il tuo blocco di codice sorgente Multi-Line denominato come al solito

  2. Cambia il wrapping da BEGIN/END_SRCa …-EXAMPLE:

    # + NAME: real-source
    # + BEGIN_EXAMPLE emacs-lisp
    (+ 3 4)
    (* 4 47)
    # + END_EXAMPLE
  1. Incollare ed eseguire questo blocco nel primo blocco di codice.
    # + NOME: LispBlock
    # + HEADER:: var lcmds = real-source
    # + BEGIN_SRC emacs-lisp: output dei risultati: wrap src emacs-lisp
    (dolist (cmd (lcmds a stringa divisa "\ n"))
      (a meno che (stringa = "" cmd)
        (princ
         (formato "% s \ t; →% s \ n"
                 cmd (eval (car (read-from-string cmd)))))))
    # + END_SRC
  1. Risultato:
    # + RISULTATI: LispBlock
    # + BEGIN_src emacs-lisp
    (+ 3 4); → 7
    (* 4 47); → 188
    # + END_src
  1. Aggiungi ulteriori blocchi sorgente multi-linea con nomi individuali secondo necessità nel tuo testo

  2. Aggiungi le #+CALL:righe in cui dai il nome del blocco come lcmdsvariabile. Il blocco di trasformazione sopra è necessario solo una volta per documento.

Nota che il blocco Transforming deve essere scritto nella lingua che stai trattando.

Per prima cosa ho provato ad "automatizzare" la buona soluzione di @melioratus, ma ho riscontrato problemi con questo, quando ho incontrato la soluzione di cui sopra.

@jpkotta thx per aver sottolineato la correzione necessaria per evitare il problema dell'elenco dei numeri con il blocco del codice.


1
Soluzione molto intelligente! Grazie per la pubblicazione!
Melioratus,
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.