Können org-babel-Ergebnisse als Codekommentare ausgegeben werden?


13

In Blogs, Lehrbüchern usw. werden die Ergebnisse einiger Codes häufig als Kommentare angezeigt, z.

(+ 1 1) ;=> 2

Gibt es eine Möglichkeit, solche Ergebnisse mithilfe der Babel-Funktion von Org-Mode automatisch anzuzeigen?

Insbesondere möchte ich in der Lage sein, einen Header so anzugeben, dass:

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

Würde folgendermaßen aussehen, wenn ich C-c C-c:

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

Und dann, wenn ich ein paar Änderungen vorgenommen habe ...

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

... und C-c C-ces würde die Kommentare durch aktualisierte ersetzen:

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

Abgesehen von dem, was ich mir oben erträumt habe, gibt es eine einfache Möglichkeit, die Ergebnisse vom Github-Renderer für Organisationsdateien anzeigen zu lassen, sodass Folgendes angezeigt wird (idealerweise mit Formatierungen, die ich auf Dokumentebene angibt):

#+RESULTS:
: 2

Interessante Idee, aber ich glaube nicht, dass etwas fertig ist. Ich würde versuchen, das spezifische Babel-Backend zu ändern, um die Ergebnisse an der vorgegebenen Stelle zu platzieren. Dies erscheint jedoch kompliziert, wenn die Ergebnisse beispielsweise mehrere Zeilen umfassen.
wvxvw

Antworten:


7

Versuche dies

Verwenden Sie benannte Codeblöcke und nowebHeader, um Ihren Code in ein Lese- und Schreibprogramm zu verwandeln.

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

Erstellen Sie einen orgCodeblock, um Ihren Code mit Ihrem Ergebnis zu formatieren

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

Wenn Sie einen C-c C-cOn- orgCode-Block ausführen, sollten Ergebnisse angezeigt werden, die dem folgenden Code ähneln:

#+RESULTS:
:RESULTS:

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

:END:

Wenn Sie eine Postleitzahl an Github senden, sollten Sie sehen

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

Dieser Code wurde mit
GNU Emacs 24.5.1 (x86_64-unknown-cygwin, GTK + Version 3.14.13)
Org-Mode Version: 8.3.2
und Github getestet.


Vielen Dank. Dies ist ein hilfreicher Ansatz und scheint flexibel genug zu sein, um die Ergebnisse nach Belieben formatieren zu können. Aber ich denke, es ist (wie meine eigene Lösung) zu ausführlich, um es für kurze Notizen oder Blog-Posts zu verwenden, was ich mir erhofft hatte. Vielleicht könnten mich einige Modifikationen an Babel, die auf dieser Funktionalität aufbauen, dahin bringen.
Parkeristyping

1
@parkeristyping - ich stimme zu. Es ist viel zu ausführlich. Wenn es etwas ist, was ich ziemlich oft machen werde, zB Blog, schreibe ich normalerweise einen Vorlagencode, um den formatierten Organisationscode in Schritt 2 zu generieren. Dann aktualisiere ich einfach eine Variable, die an den Vorlagengenerator übergeben wird, zB :var my_code='("my-code" "my-other-code"). Trotzdem ist es immer noch umständlicher als ich es gerne hätte. Möchten Sie, dass ich meine Antwort aktualisiere?
Melioratus

@parkeristyping - Ich habe gerade einen anderen Weg herausgefunden, aber es erfordert, dass Sie die ursprüngliche Organisationsdatei exportieren und den Export in GitHub veröffentlichen.
Melioratus

3

Das Nächste, was ich mit der vorhandenen Babel-Funktionalität erreichen konnte, ist das Folgende:

Zuerst definiere ich eine Emacs-Lisp-Funktion, um den Ergebnissen Folgendes voran zu stellen ";=> ":

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

Dann verarbeite ich die Ergebnisse mit dem :postHeader:

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

Dies gibt das folgende on zurück C-c C-c, das aufgrund der :exports bothKopfzeile auf github angezeigt wird , aber in einem separaten Codeblock.

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

Ich denke, dass diese Strategie die Organisationsdatei zu überladen macht, um sie wert zu sein. Und wenn ich die Code-Evaluierungsbestätigung nicht deaktiviere, muss ich zwei akzeptieren: "Möchten Sie den Code wirklich evaluieren?" Eingabeaufforderungen (eine für den Scheme-Block und eine für das Elisp commentify).


1

Sie können so etwas tun:

  1. Schreiben Sie Ihren benannten Multi-Line-Quellcodeblock wie gewohnt

  2. Ändern Sie die Umhüllung von BEGIN/END_SRCin …-EXAMPLE:

    # + NAME: echte Quelle
    # + BEGIN_EXAMPLE emacs-lisp
    (+ 3 4)
    (* 4 47)
    # + END_EXAMPLE
  1. Fügen Sie diesen Block unter dem ersten Codeblock ein und führen Sie ihn aus.
    # + NAME: LispBlock
    # + HEADER:: var lcmds = echte Quelle
    # + BEGIN_SRC emacs-lisp: Ergebnisausgabe: wrap src emacs-lisp
    (dolist (cmd (split-string lcmds "\ n"))
      (sofern nicht (string = "" cmd)
        (princ
         (Format "% s \ t; →% s \ n"
                 cmd (eval (auto (read-from-string cmd))))))
    # + END_SRC
  1. Ergebnis:
    # + ERGEBNISSE: LispBlock
    # + BEGIN_src emacs-lisp
    (+ 3 4); → 7
    (* 4 47); → 188
    # + END_src
  1. Fügen Sie Ihrem Text nach Bedarf zusätzliche mehrzeilige Quellblöcke mit individuellen Namen hinzu

  2. Fügen Sie #+CALL:Zeilen hinzu, in denen Sie den Namen des Blocks als lcmdsVariable angeben. Der obige Transformationsblock wird nur einmal pro Dokument benötigt.

Beachten Sie, dass der Transformationsblock in der Sprache geschrieben sein muss, die Sie behandeln.

Ich habe zuerst versucht, die gute Lösung von @melioratus zu "automatisieren", stieß dabei aber auf Probleme, als ich auf die obige Lösung stieß.

@jpkotta thx für den Hinweis auf die Korrektur, die zur Vermeidung des Problems der Nummernliste mit Codeblock erforderlich ist.


1
Sehr geschickter Workaround! Danke fürs Schreiben!
Melioratus
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.