Czy wyniki org-babel mogą być generowane jako komentarze do kodu?

13

W blogach, podręcznikach itp. Wyświetlanie wyników niektórych kodów w postaci komentarzy, np .:

(+ 1 1) ;=> 2

Czy istnieje sposób automatycznego wyświetlania takich wyników przy użyciu funkcji Babel w trybie Org-Mode?

W szczególności chciałbym móc określić taki nagłówek, aby:

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

Gdybym C-c C-c:

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

A jeśli wprowadzę jakieś zmiany, tak ...

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

... i C-c C-czastąpiłoby komentarze tymi zaktualizowanymi:

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

Lub, poza tym, o czym marzyłem powyżej, czy istnieje prosty sposób, aby wyniki były wyświetlane przez renderer plików org github, aby były widoczne następujące (najlepiej z formatowaniem, które określam na poziomie dokumentu):

#+RESULTS:
: 2
parkeristyping
źródło
Ciekawy pomysł, ale nie sądzę, że jest coś gotowego. Spróbowałbym zmodyfikować określony backend Babel, aby umieścić wyniki w określonym z góry miejscu. Choć wydaje się to skomplikowane, gdy wyniki mają na przykład wiele linii.
wvxvw

Odpowiedzi:

7

Spróbuj tego

Użyj nazwanych bloków kodu i nowebnagłówka, aby zamienić kod w umiejętny program.

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

Utwórz orgblok kodu, aby sformatować kod z wynikiem

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

Zrobić C-c C-cna orgbloku kodu i powinieneś zobaczyć wyniki podobne do kodu poniżej:

#+RESULTS:
:RESULTS:

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

:END:

Jeśli wyślesz kod do Github, powinieneś zobaczyć

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

Ten kod został przetestowany z
GNU Emacs 24.5.1 (x86_64-unknown-cygwin, GTK + wersja 3.14.13)
Wersja trybu org: 8.3.2
i github.

Melioratus
źródło
Dzięki. Jest to pomocne podejście i wydaje się wystarczająco elastyczne, aby umożliwić formatowanie wyników w dowolny sposób. Sądzę jednak, że (podobnie jak moje własne rozwiązanie) jest zbyt gadatliwy, aby nadawać się do szybkich notatek lub postów na blogu, co chciałem znaleźć. Być może jednak wprowadzę pewne modyfikacje babel oparte na tej funkcjonalności.
parkeristyping
1
@parkeristyping - Zgadzam się. To jest zbyt gadatliwe. Jeśli robię to dość często, np. Blog, zwykle piszę kod szablonu, aby wygenerować sformatowany kod organizacji w kroku 2. Następnie aktualizuję zmienną przekazaną do generatora szablonów, np :var my_code='("my-code" "my-other-code"). Mimo to jest to jeszcze bardziej kłopotliwe, niż bym chciał. Czy chcesz, żebym zaktualizował moją odpowiedź?
Melioratus
@parkeristyping - właśnie wymyśliłem inny sposób, ale wymaga to wyeksportowania oryginalnego pliku org i opublikowania eksportu do GitHub.
Melioratus
3

Najbliższe, jakie udało mi się osiągnąć dzięki istniejącej funkcjonalności Babel, to:

Najpierw definiuję funkcję emacs-lisp, aby dodawać wyniki do ";=> ":

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

Następnie przetwarzam wyniki za pomocą :postnagłówka:

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

Zwraca to następujące C-c C-c, które jest wyświetlane w github z powodu :exports bothnagłówka, ale jest w osobnym bloku kodu.

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

Myślę, że ta strategia powoduje, że plik org jest zbyt zagracony, aby był tego wart. I dopóki nie wyłączę potwierdzenia oceny kodu, muszę zaakceptować dwa „Czy na pewno chcesz ocenić kod?” monity (jeden dla bloku schematu i jeden dla elipsa commentify).

parkeristyping
źródło
1

Możesz zrobić coś takiego:

  1. Napisz jak zwykle nazwany blok kodu źródłowego Multi-Line

  2. Zmień opakowanie z BEGIN/END_SRCna …-EXAMPLE:

    # + NAZWA: prawdziwe źródło
    # + BEGIN_EXAMPLE emacs-lisp
    (+ 3 4)
    (* 4 47)
    # + END_EXAMPLE
  1. Wklej i uruchom ten blok pod pierwszym blokiem kodu.
    # + NAZWA: LispBlock
    # + HEADER:: var lcmds = real-source
    # + BEGIN_SRC emacs-lisp: wyniki wyjściowe: wrap src emacs-lisp
    (dolist (cmd (rozdzielone ciąg lcmds "\ n"))
      (chyba że (string = "" cmd)
        (princ
         (format „% s \ t; →% s \ n”
                 cmd (eval (car (read-from-string cmd)))))))
    # + END_SRC
  1. Wynik:
    # + WYNIKI: LispBlock
    # + BEGIN_src emacs-lisp
    (+ 3 4); → 7
    (* 4 47); → 188
    # + END_src
  1. Dodaj do tekstu dodatkowe wieloliniowe bloki źródłowe z indywidualnymi nazwami

  2. Dodaj #+CALL:wiersze, w których podajesz nazwę bloku jako lcmdszmienną. Powyższy blok przekształcający jest potrzebny tylko raz na dokument.

Zauważ, że blok przekształcania musi być napisany w języku, który traktujesz.

Najpierw próbowałem „zautomatyzować” dobre rozwiązanie z @melioratus, ale natknąłem się na problemy, kiedy natrafiłem na powyższe rozwiązanie.

@jpkotta thx za wskazanie poprawki potrzebnej do uniknięcia problemu z listą numerów z blokiem kodu.

Alex Stragies
źródło
1
Bardzo sprytne obejście! Dzięki za opublikowanie!
Melioratus