Config, esempi e casi d'uso di Library Of Babel


9

Voglio capire come funziona Library Of Babel di org-babel. Sembra uno strumento potente ma sottoutilizzato.

La documentazione dice che posso

aggiungi il codice alla libreria, salvando prima il codice nei normali blocchi di codice 'src' di un file Org, quindi carica il file Org con org-babel-lob-ingest, che è associato a Cc Cv i.

Che cosa sta org-babel-lob-ingestveramente facendo? Sta semplicemente aggiungendo tutti i blocchi sorgente all'interno di un file Org a un altro file?

E quali sono i casi d'uso di questo? Posso vedere quello che ho nella mia biblioteca in modo interattivo? Posso usare la sintassi noweb con blocchi sorgente all'interno della Libreria? Cosa devo fare per iniziare a usarlo?

Eventuali esempi e collegamenti a tutorial sono i benvenuti.


Aggiunge alla variabile l'elenco dei blocchi di origine con nome che trova nel file org-babel-library-of-babel. Durante la ricerca di blocchi di origine, org-babel cerca il file corrente e l'elenco memorizzato nella variabile sopra. La risposta di @mutbuerger descrive molto bene i dettagli, penso.
NickD

Risposte:


10

C'è una bella introduzione alla libreria di babel in library-of-babel.orgcui si trova nella directory dei sorgenti di Org. Per utilizzare quegli esempi di blocchi di codice sorgente denominati in altri file, popolare la org-babel-library-of-babelvariabile con

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

#+results:
: 21

Uno dei 21 blocchi è chiamato "trasposizione" e probabilmente fa quello che dovrebbe fare:

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

Puoi anche aggiungere i tuoi blocchi di codice, in particolare qualcosa che potresti trovare molto in futuro. Ad esempio, quanto segue mi consente di aggregare i valori nella tabella denominata dalla prima colonna:

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

Salva il blocco in qualsiasi file e aggiungilo a 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 |

4

TL; DR: l'utilizzo di una libreria persistente di babele memorizzata in un file può essere una semplice configurazione in 3 passaggi:

  • Crea un orgfile -mode ~/.emacs.d/library-of-babel.org.
  • Aggiungi una linea (org-babel-lob-ingest "~/.emacs.d/library-of-babel.org")al tuo Conf Emacs.
  • Raccogli utili funzioni in quel file, verranno lette all'avvio di emacs.

Il file Library-Of-Babel è dove ad esempio il aggregatebycol1blocco da @mutbuerger verrebbe salvato.

Un altro semplice esempio di utilizzo sarebbe il blocco di codice, che genera i dati della tabella con una riga di intestazione, ma non contrassegna l'intestazione con un 'hline. Questo non è tragico per una semplice visualizzazione, ma può rendere più coinvolta un'ulteriore elaborazione automatizzata. La soluzione qui potrebbe essere l'utilizzo di un piccolo blocco di codice per la post-elaborazione da qualche parte su Internet:

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

Questo semplicemente eseguirà il pipe dei dati mentre si giunge in 'hlineuna seconda riga.

Per utilizzare questo blocco in un secondo momento in altri file organizzativi, è sufficiente aggiungere una :poststanza di elaborazione al blocco sorgente dell'organizzazione che genera dati:

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

È inoltre possibile assegnare facilmente tabelle preesistenti alle funzioni nel proprio LOB:

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

#+CALL: addhdr(ExData)

Nella mia biblioteca ho capitoli per organizzare diversi tipi di funzionalità: generazione dei dati, filtro, PrettyPrinting, ... Ricordati di ingestnuovo dopo aver aggiunto nuovi blocchi.


1
Bella risposta. Grazie per la condivisione. Avresti un link al tuo file library-of-babel.org?
Domani
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.