Config, exemples et cas d'utilisation de Library Of Babel

9

Je veux comprendre le fonctionnement de la bibliothèque de Babel d'org-babel. On dirait un outil puissant mais sous-utilisé.

La documentation dit que je peux

ajoutez du code à la bibliothèque, en enregistrant d'abord le code dans des blocs de code «src» normaux d'un fichier Org, puis chargez le fichier Org avec org-babel-lob-ingest, qui est lié à Cc Cv i.

Qu'est-ce que ça org-babel-lob-ingestfait vraiment? Il ajoute simplement tous les blocs sources d'un fichier d'organisation à un autre fichier?

Et quels sont les cas d'utilisation de cela? Puis-je voir ce que j'ai dans ma bibliothèque de manière interactive? Puis-je utiliser la syntaxe noweb avec des blocs source dans la bibliothèque? Que dois-je faire pour commencer à l'utiliser?

Tous les exemples et liens vers des tutoriels sont les bienvenus.

dangom
la source
Il ajoute à la variable la liste des blocs sources nommés qu'il trouve dans le fichier org-babel-library-of-babel. Lors de la recherche de blocs sources, org-babel recherche dans le fichier actuel ainsi que la liste stockée dans la variable ci-dessus. La réponse de @mutbuerger décrit très bien les détails, je pense.
NickD

Réponses:

10

Il y a une belle introduction à la bibliothèque de babel dans library-of-babel.orglaquelle se trouve le répertoire source d'Org. Pour utiliser ces exemples de blocs de code source nommés dans d'autres fichiers, remplissez la org-babel-library-of-babelvariable avec

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

#+results:
: 21

L'un des 21 blocs est nommé «transposer» et fait probablement ce qu'il est censé faire:

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

Vous pouvez également ajouter vos propres blocs de code, en particulier quelque chose que vous pourriez utiliser beaucoup à l'avenir. À titre d'exemple, ce qui suit me permet d'agréger les valeurs de la table nommée par la première colonne:

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

Enregistrez le bloc dans n'importe quel fichier et ajoutez-le à 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
la source
4

TL; DR: L'utilisation d'une bibliothèque persistante de babel stockée dans un fichier peut être une configuration simple en 3 étapes:

  • Créez un orgfichier -mode ~/.emacs.d/library-of-babel.org.
  • Ajoutez une ligne (org-babel-lob-ingest "~/.emacs.d/library-of-babel.org")à votre conf Emacs.
  • Collectez les fonctions utiles dans ce fichier, elles seront lues lors du démarrage d'emacs.

Le fichier Library-Of-Babel est l'endroit par exemple où le aggregatebycol1bloc de @mutbuerger serait enregistré.

Un autre exemple d'utilisation simple serait d'avoir un bloc de code, qui génère des données de table avec une ligne d'en-tête, mais ne marque pas le headerrow avec un 'hline. Ce n'est pas tragique pour un affichage simple, mais cela peut impliquer davantage de traitement automatisé. La solution ici pourrait être d'utiliser un petit bloc de code pour le post-traitement quelque part sur Internet:

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

Cela dirigera simplement les données tout en épissant dans une 'hlinedeuxième ligne.

Pour utiliser ce bloc ultérieurement dans d'autres fichiers d'organisation, ajoutez simplement une :poststrophe de traitement à votre bloc source d'organisation générant des données:

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

Vous pouvez également facilement attribuer des tables préexistantes aux fonctions de votre LOB:

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

#+CALL: addhdr(ExData)

Dans ma bibliothèque, j'ai des chapitres pour organiser différents types de fonctionnalités: génération de données, filtrage, PrettyPrinting, ... N'oubliez pas de le ingestrefaire après avoir ajouté de nouveaux blocs.

Alex Stragies
la source
1
Très bonne réponse. Merci d'avoir partagé. Auriez-vous un lien vers votre fichier library-of-babel.org?
dangom