Konfiguration, Beispiele und Anwendungsfälle von Library Of Babel

9

Ich möchte verstehen, wie die Library Of Babel von org-babel funktioniert. Scheint ein mächtiges, aber wenig genutztes Werkzeug zu sein.

Die Dokumentation sagt, dass ich kann

Fügen Sie der Bibliothek Code hinzu, indem Sie den Code zuerst in regulären 'src'-Codeblöcken einer Org-Datei speichern und dann die Org-Datei mit org-babel-lob-ingest laden, das an Cc Cv i gebunden ist.

Was macht das org-babel-lob-ingestwirklich? Es werden nur alle Quellblöcke in einer Org-Datei an eine andere Datei angehängt?

Und was sind die Anwendungsfälle dafür? Kann ich interaktiv sehen, was ich in meiner Bibliothek habe? Kann ich die Noweb-Syntax mit Quellblöcken in der Bibliothek verwenden? Was muss ich tun, um es zu verwenden?

Beispiele und Links zu Tutorials sind herzlich willkommen.

Dangom
quelle
Die Liste der benannten Quellblöcke, die in der Datei gefunden werden, wird an die Variable angehängt org-babel-library-of-babel. Bei der Suche nach Quellblöcken sucht org-babel in der aktuellen Datei sowie in der Liste, die in der obigen Variablen gespeichert ist. Die Antwort von @mutbuerger beschreibt die Details meiner Meinung nach sehr gut.
NickD

Antworten:

10

Es gibt eine schöne Einführung in die Bibliothek von Babel, library-of-babel.orgdie sich im Quellverzeichnis von Org befindet. Um diese Beispiele für benannte Quellcodeblöcke in anderen Dateien zu verwenden, füllen Sie die org-babel-library-of-babelVariable mit

#+begin_src elisp :results scalar
(org-babel-lob-ingest "/path/to/org-mode/doc/library-of-babel.org")
#+end_src

#+results:
: 21

Einer der 21 Blöcke heißt "transponieren" und macht wahrscheinlich das, was er tun soll:

#+name: tbl
| a | 1 |
| d | 2 |
| a | 3 |
| d | 4 |
| d | 5 |
| c | 6 |

#+begin_src elisp :results table :post transpose(table=*this*) :var var=tbl
var
#+end_src

#+results:
| a | d | a | d | d | c |
| 1 | 2 | 3 | 4 | 5 | 6 |

Sie können auch Ihre eigenen Codeblöcke hinzufügen, insbesondere etwas, das Sie in Zukunft möglicherweise häufig verwenden. Im Folgenden kann ich beispielsweise die Werte in der benannten Tabelle nach der ersten Spalte aggregieren:

#+name: aggregatebycol1
#+begin_src elisp :results table :var table='() fun='()
(let (res)
  (mapc
   (lambda (x)
     (push `(,(car x) ,(apply fun (mapcar 'cadr (cdr x)))) res))
   (seq-group-by 'car table))
  (nreverse res))
#+end_src

Speichern Sie den Block in einer beliebigen Datei und fügen Sie ihn hinzu org-babel-library-of-babel:

#+begin_src elisp :results scalar
(org-babel-lob-ingest (buffer-file-name))
#+end_src

#+results:
: 1

#+header: :post aggregatebycol1(table=*this*, fun='+)
#+begin_src elisp :results table :var var=tbl
var
#+end_src

#+results:
| a |  4 |
| d | 11 |
| c |  6 |
mutbuerger
quelle
3

TL; DR: Die Verwendung einer persistenten Bibliothek von Babel, die in einer Datei gespeichert ist, kann in drei Schritten erfolgen:

  • Erstellen Sie eine org-mode-Datei ~/.emacs.d/library-of-babel.org.
  • Fügen Sie (org-babel-lob-ingest "~/.emacs.d/library-of-babel.org")Ihrem Emacs conf eine Zeile hinzu.
  • Sammeln Sie nützliche Funktionen in dieser Datei, sie werden beim Start von emacs gelesen.

In der Library-Of-Babel-Datei wird zB der aggregatebycol1Block von @mutbuerger gespeichert.

Ein weiterer einfacher Anwendungsbeispiel wäre ein Codeblock, der Tabellendaten mit einer Kopfzeile generiert, die Kopfzeile jedoch nicht mit einem markiert 'hline. Dies ist für eine einfache Anzeige nicht tragisch, kann jedoch die weitere automatisierte Verarbeitung komplizierter machen. Die Lösung könnte darin bestehen, einen kleinen Codeblock für die Nachbearbeitung von irgendwo im Internet aus zu verwenden:

#+name: addhdr
#+begin_src emacs-lisp :var tbl=""
(cons (car tbl) (cons 'hline (cdr tbl)))
#+end_src

Dadurch werden die Daten einfach weitergeleitet, während in einer 'hlinezweiten Zeile gespleißt wird.

Um diesen Block später in anderen Organisationsdateien zu verwenden, fügen Sie :postIhrem datengenerierenden Organisationsquellenblock einfach eine Zeilengruppe -processing hinzu:

#+NAME: Example
#+BEGIN_SRC elisp :post addhdr(*this*)
'(("Header1" "Column2" "Three")("R1C1V" "2" "C3R1")("4" "5" "6"))
#+END_SRC

#+RESULTS: Example
| Header1 | Column2 | Three |
|---------+---------+-------|
| R1C1V   |       2 | C3R1  |
| 4       |       5 | 6     |

Sie können Funktionen in Ihrem LOB auch problemlos bereits vorhandene Tabellen zuweisen:

#+NAME: ExData
| h1    | h2    |
| dh1r1 | dh2r1 |
| dh1r2 | dh2r2 |

#+CALL: addhdr(ExData)

In meiner Bibliothek habe ich Kapitel, um verschiedene Arten von Funktionen zu organisieren: Datengenerierung, Filterung, PrettyPrinting, ... Denken Sie daran, ingestnach dem Hinzufügen neuer Blöcke erneut zu arbeiten.

Alex Stragies
quelle
1
Gute Antwort. Danke für das Teilen. Hätten Sie einen Link zu Ihrer Datei library-of-babel.org?
Dangom