Les résultats org-babel peuvent-ils être affichés sous forme de commentaires de code?

13

Dans les blogs, les manuels, etc., il est très courant d'afficher les résultats de certains codes sous forme de commentaires, par exemple:

(+ 1 1) ;=> 2

Existe-t-il un moyen d'afficher automatiquement des résultats comme celui-ci en utilisant la fonction Babel d'Org-Mode?

Plus précisément, j'aimerais pouvoir spécifier un en-tête tel que ceci:

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

Deviendrait ce qui suit lorsque je C-c C-c:

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

Et puis si j'ai fait quelques changements, comme ça ...

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

... et C-c C-cil remplacerait les commentaires par des commentaires mis à jour:

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

Ou, à court de ce que j'ai imaginé ci-dessus, existe-t-il un moyen simple d'afficher les résultats par le rendu de fichier org de github, de sorte que les éléments suivants soient visibles (idéalement avec la mise en forme que je spécifie au niveau du document):

#+RESULTS:
: 2
parkeristyping
la source
Idée intéressante, mais je ne pense pas qu'il y ait quelque chose de prêt à l'emploi. J'essaierais de modifier le backend Babel spécifique pour placer les résultats à l'endroit prédéterminé. Bien que cela semble compliqué, lorsque les résultats ont plusieurs lignes par exemple.
wvxvw

Réponses:

7

essaye ça

Utilisez des blocs de code nommés et un en- nowebtête pour transformer votre code en un programme lettré.

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

Créez un orgbloc de code pour formater votre code avec votre résultat

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

Est - ce un C-c C-csur orgbloc de code et vous devriez voir des résultats similaires au code ci - dessous:

#+RESULTS:
:RESULTS:

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

:END:

Si vous postez du code sur Github, vous devriez voir

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

Ce code a été testé avec
GNU Emacs 24.5.1 (x86_64-unknown-cygwin, GTK + Version 3.14.13)
Version en mode org: 8.3.2
et github.

Melioratus
la source
Merci. Ceci est une approche utile et semble suffisamment flexible pour permettre la mise en forme des résultats de la manière que je souhaite. Mais, je pense que (comme ma propre solution) est trop verbeux pour être pratique pour des notes rapides ou des articles de blog, ce que j'espérais trouver. Peut-être que certaines modifications apportées à babel en s'appuyant sur cette fonctionnalité pourraient m'y amener.
parkeristyping
1
@parkeristyping - Je suis d'accord. C'est beaucoup trop verbeux. Si c'est quelque chose que je vais faire assez souvent, par exemple un blog, j'écris habituellement du code de modèle pour générer le code d'organisation formaté à l'étape 2. Ensuite, je mets simplement à jour une variable passée dans le générateur de modèle, par exemple :var my_code='("my-code" "my-other-code"). Malgré tout, c'est encore plus lourd que je ne le souhaiterais. Souhaitez-vous que je mette à jour ma réponse?
Melioratus
@parkeristyping - Je viens de découvrir une autre façon, mais cela nécessite que vous exportiez le fichier org d'origine et que vous publiez l'exportation vers GitHub.
Melioratus
3

Le plus proche que j'ai pu accomplir avec la fonctionnalité Babel existante est le suivant:

Tout d'abord, je définis une fonction emacs-lisp pour ajouter les résultats avec ";=> ":

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

Ensuite, je traite les résultats en utilisant l'en- :posttête:

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

Cela renvoie ce qui suit C-c C-c, qui s'affiche sur github en raison de l'en- :exports bothtête, mais il est dans un bloc de code séparé.

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

Je pense que cette stratégie laisse le fichier org trop encombré pour en valoir la peine. Et, sauf si je désactive l'évaluation du code, je dois accepter deux "Êtes-vous sûr de vouloir évaluer le code?" invites (une pour le bloc Scheme et une pour elisp commentify).

parkeristyping
la source
1

Vous pouvez faire quelque chose comme ça:

  1. Écrivez votre bloc de code source multiligne nommé comme d'habitude

  2. Changez l'habillage de BEGIN/END_SRCà …-EXAMPLE:

    # + NAME: source réelle
    # + BEGIN_EXAMPLE emacs-lisp
    (+ 3 4)
    (* 4 47)
    # + END_EXAMPLE
  1. Collez et exécutez ce bloc sous le premier bloc de code.
    # + NOM: LispBlock
    # + HEADER:: var lcmds = source réelle
    # + BEGIN_SRC emacs-lisp: sortie des résultats: wrap src emacs-lisp
    (dolist (cmd (lcmds de chaîne fractionnée "\ n"))
      (sauf (string = "" cmd)
        (princ
         (format "% s \ t; →% s \ n"
                 cmd (eval (car (cmd de lecture de chaîne))))))))
    # + END_SRC
  1. Résultat:
    # + RÉSULTATS: LispBlock
    # + BEGIN_src emacs-lisp
    (+ 3 4); → 7
    (* 4 47); → 188
    # + END_src
  1. Ajoutez des blocs sources multilignes supplémentaires avec des noms individuels selon vos besoins dans votre texte

  2. Ajoutez des #+CALL:lignes où vous donnez le nom du bloc comme lcmdsvariable. Le bloc de transformation ci-dessus n'est nécessaire qu'une fois par document.

Notez que le bloc de transformation doit être écrit dans la langue que vous traitez.

J'ai d'abord essayé "d'automatiser" la bonne solution de @melioratus, mais j'ai rencontré des problèmes avec cela, quand j'ai rencontré la solution ci-dessus.

@jpkotta thx pour avoir signalé le correctif nécessaire pour éviter les problèmes de liste de numéros avec code-bloc.

Alex Stragies
la source
1
Solution de contournement très intelligente! Merci d'avoir posté!
Melioratus