Emacs Org-Mode Babel: "Verwirren" mit dem Ergebnisblock

411
alyssackwan

Ich möchte den org-Modus verwenden, um lange Passagen durch Verketten von Ausschnitten zu berechnen.

Ich bin offen für einen Nicht-Babel-Ansatz. Tabellen fielen mir ein, aber ich konnte nicht sehen, wie eine Zelle von außerhalb der Tabelle so referenziert wird, dass der Zellinhalt importiert wird und nicht nur eine Verknüpfung zu ihm besteht.

Mit Babel habe ich Textblöcke, auf die ich in einem abschließenden Textblock über Noweb referenziere. Ich kann nicht herausfinden, wie ein Textblock etwas ausgeben kann #+RESULTS:. Es gibt keine Eval Engine. Ich habe versucht, elisp zu verwenden, aber Zeilenumbrüche lösen das Problem aus, und ich kann die Ausgabe sonst nicht mit Mq formatieren, da die integrierten Funktionen interaktiv sind. Im Textmodus kann ich mich mit einer externen Datei verwickeln, aber nicht inline.

Irgendwelche Ideen? Ich muss etwas vermissen. Ich kann mir nicht vorstellen, dass das schwer ist.

[BEARBEITEN]:

#+NAME: abc #+BEGIN_SRC text This is a string that is way too long to be on one line. The point of this whole question is that blocks with hard paragraph breaks don't work with the elisp noweb block. #+END_SRC  #+NAME: def #+BEGIN_SRC text This is also a string that is way too long to be on one line. Again, the point of this whole question is that blocks with hard paragraph breaks don't work with the elisp noweb block. #+END_SRC  #+BEGIN_SRC elisp :noweb yes :results output (princ "<<abc>>") (princ "<<def>>") #+END_SRC 

Bei der Auswertung erhalte ich die Meldung "Dateiende während der Analyse". Wenn ich mich mit einer externen Datei verwirke, um sie zu untersuchen, sehe ich Folgendes:

(princ "This is a string that is way too long to be on one line. (princ "The point of this whole question is that blocks with hard paragraph (princ "breaks don't work with the elisp noweb block.") (princ "This is also a string that is way too long to be on one line. (princ "Again, the point of this whole question is that blocks (princ "with hard paragraph breaks don't work with the elisp (princ "noweb block.") 

Beachten Sie, dass die nicht-terminalen Zeilen in jedem Textblock nicht in doppelte Anführungszeichen oder schließende Klammern gesetzt werden. Dies ist offensichtlich missgebildetes Elisp.

Wieder ist mir egal, wie das gemacht wird. Ich möchte nur in der Lage sein, lange Textpassagen zu berechnen, die entweder Zeilenumbrüche gut darstellen oder meine harten Zeilenumbrüche beibehalten.

Es scheint, als könnten weder org-mode-Tabellen noch org-mode babel dies tun. Ich kann keine elisp-Funktion finden, die das Äquivalent fill-paragrapheiner Zeichenfolge in einer Liste darstellt. Das würde das lösen.

1

3 Antworten auf die Frage

1
James Anderson

Hoffentlich habe ich die Frage nicht missverstanden, aber hier ist ein Versuch:

Ich fange damit in einer org-Tabelle an:

#+BEGIN_SRC emacs-lisp (setq s1 "hello") (setq s2 " world") (setq s3 "!") (concat s1 s2 s3) #+END_SRC   #+RESULTS: : hello world! 

Um die Ergebnisse zu erhalten, habe ich den Cursor innerhalb des SRC-Abschnitts platziert und die Funktion aufgerufen:

M+ x org-babel-execute-src-block

was für mich einer Tastenkombination CTRL+ c CTRL+ zugeordnet ist c(die Standardzuordnung)

Es fordert zur Bestätigung auf, den Befehl auszuführen. Oder habe ich die Anforderungen missverstanden? elisp sollte mit emacs funktionieren, ohne irgendetwas zu installieren (für Python müssen Sie JS installieren).

Danke für das Antworten. Nicht ganz. Ich habe separate Blöcke vom Typ "Text", die ich mit "Noweb" -Verweisen zusammenziehe. Die Idee ist, dass ich die Textblöcke in separaten Passagen wiederverwenden kann. alyssackwan vor 5 Jahren 0
0
James Anderson

Ah! Lesen und Schreiben. Ich dachte, es sei eine reine Frage im Org-Modus. Das könnte helfen:

#+NAME: getString1 #+BEGIN_SRC text "do your homework" #+END_SRC  #+NAME: getString2 #+BEGIN_SRC text "if you want to learn computer science" #+END_SRC  #+NAME: getString3 #+BEGIN_SRC text "as well as Prof. D. Knuth" #+END_SRC  #+NAME: elispProg #+BEGIN_SRC elisp :noweb yes (concat <<getString1>> " " <<getString2>> " " <<getString3>>) #+END_SRC  #+RESULTS: elispProg : do your homework if you want to learn computer science as well as Prof. D. Knuth  #+NAME: pythonProg #+BEGIN_SRC python :noweb yes return "{} {} {}".format(<<getString1>>, <<getString2>>, <<getString3>>) #+END_SRC  #+RESULTS: pythonProg : do your homework if you want to learn computer science as well as Prof. D. Knuth 

In diesem Beispiel gibt es drei Zeichenfolgen ("Text" genannt) und zwei Beispiele für Programme, die diese Zeichenfolgen verwenden. Sie können das Muster in der Typenbeschreibung sehen. Einige Dinge sind "Text", "Elisp" und Python. elisp und Python sind zwei verschiedene Programmiersprachen. Wenn Sie den Cursor in den Abschnitt namens elispProg oder pythonProg setzen und ein CTRL+ c CTRL+ ausführenc(auch bekannt als org-babel-execute-src-block) sollte man Ergebnisse sehen. Das Flag in den Codeabschnitten ": now yes" stammt aus der Dokumentation im emacs-Editor: "Erweiterung der Noweb-Syntaxreferenzen im Hauptteil des 'src'-Codeblocks beim Auswerten, Verwickeln oder Exportieren". Tangling ist das Wort von Prof. Kunth für das Ausführen der Codeabschnitte. Um es kurz zu machen: Das doppelte "<<" verweist auf andere Blöcke und erweitert sich, wenn das Flag ": now yes" vorhanden ist. Sie können genau steuern, was passiert, wenn die Auswertung (exec src-Block) erfolgt. Hier sind die Dokumente: https://www.gnu.org/software/emacs/manual/html_node/org/noweb.html

Vielen Dank. Ich habe meinen ursprünglichen Beitrag mit mehr Details bearbeitet. alyssackwan vor 5 Jahren 0
0
James Anderson

Ich sehe, dass ich das Problem missverstanden habe. Hier ist ein weiterer Versuch. Es ist ein bisschen schnell / hackig, scheint aber zu funktionieren. Es wird lediglich die lange verkettete Zeichenfolge in einen tmp-Puffer kopiert, der den gesamten Puffer markiert, den Füllabsatz aufruft, das Ergebnis in den Clipring legt und dann die formatierte Zeichenfolge zurückgibt. Jetzt ist es nur ein Füllabsatz, der eine Zeichenfolge verwendet, formatiert und die formatierte Zeichenfolge zurückgibt.

(setq noNewlines "This is a string that is way too long to be on one line. The point of this whole question is that blocks with hard paragraph breaks don't work with the elisp noweb block.")  (setq newLines "This is also a string that is way too long to be on one line. Again, the point of this whole question is that blocks with hard paragraph breaks don't work with the elisp noweb block.")  (setq my-paragraph (concat noNewlines newLines))  (defun wrap-string (str) "here we are going to wrap a long string so that is a nicely formatted paragraph" (interactive) (save-excursion (let* ((buf-name "*tmp-fill-paragraph*") (buffer (get-buffer-create buf-name)) (result)) (set-buffer buffer) (erase-buffer) (insert str) (mark-whole-buffer) (fill-paragraph) (copy-region-as-kill (point-min) (point-max)) (kill-buffer buf-name) (car kill-ring-yank-pointer) )))  (wrap-string my-paragraph) 

Das sehe ich als Ergebnis: