Configuración, ejemplos y casos de uso de Library Of Babel

9

Quiero entender cómo funciona la Biblioteca de Babel de org-babel. Parece una herramienta poderosa pero infrautilizada.

La documentación dice que puedo

agregue código a la biblioteca, primero guarde el código en bloques de código 'src' regulares de un archivo Org, y luego cargue el archivo Org con org-babel-lob-ingest, que está vinculado a Cc Cv i.

¿Qué está org-babel-lob-ingesthaciendo eso realmente? ¿Solo está agregando todos los bloques de origen dentro de un archivo de organización a otro archivo?

¿Y cuáles son los casos de uso de esto? ¿Puedo ver lo que tengo en mi biblioteca de forma interactiva? ¿Puedo usar la sintaxis de noweb con bloques fuente dentro de la Biblioteca? ¿Qué debo hacer para comenzar a usarlo?

Cualquier ejemplo y enlaces a tutoriales son bienvenidos.

dangom
fuente
Anexa la lista de bloques de origen con nombre que encuentra en el archivo a la variable org-babel-library-of-babel. Al buscar bloques de origen, org-babel busca en el archivo actual y en la lista almacenada en la variable anterior. La respuesta de @mutbuerger describe muy bien los detalles, creo.
NickD

Respuestas:

10

Hay una buena introducción a la biblioteca de babel library-of-babel.orgque se encuentra en el directorio fuente de Org. Para usar esos ejemplos de bloques de código fuente con nombre en otros archivos, complete la org-babel-library-of-babelvariable con

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

#+results:
: 21

Uno de los 21 bloques se llama "transposición" y probablemente hace lo que se supone que debe hacer:

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

También puede agregar sus propios bloques de código, especialmente algo que puede encontrar usando mucho en el futuro. Como ejemplo, lo siguiente me permite agregar valores en la tabla nombrada por la primera columna:

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

Guarde el bloque en cualquier archivo y agréguelo 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 |
mutbuerger
fuente
4

TL; DR: Usar una biblioteca persistente de babel almacenada en un archivo puede ser una configuración simple de 3 pasos:

  • Crea un orgarchivo de modo ~/.emacs.d/library-of-babel.org.
  • Agregue una línea (org-babel-lob-ingest "~/.emacs.d/library-of-babel.org")a su conf Emacs.
  • Recopile funciones útiles en ese archivo, se leerán durante el inicio de emacs.

El archivo Library-Of-Babel es donde, por ejemplo aggregatebycol1, se guardaría el bloque de @mutbuerger.

Otro caso de uso de ejemplo simple sería tener un bloque de código, que genera datos de tabla con una fila de encabezado, pero no marca el encabezado con un 'hline. Esto no es trágico para una visualización simple, pero puede hacer que el procesamiento automatizado posterior sea más complicado. La solución aquí podría ser utilizar un pequeño bloque de código para el procesamiento posterior desde algún lugar de Internet:

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

Esto simplemente canalizará los datos mientras se empalma en 'hlineuna segunda fila.

Para usar este bloque más adelante en otros archivos de organización, simplemente agregue una :postsección de procesamiento a su bloque de fuente de organización generadora de datos:

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

También puede asignar fácilmente tablas preexistentes a funciones en su LOB:

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

#+CALL: addhdr(ExData)

En mi biblioteca tengo capítulos para organizar diferentes tipos de funcionalidad: generación de datos, filtrado, PrettyPrinting, ... Solo recuerde ingestnuevamente después de agregar nuevos bloques.

Alex Stragies
fuente
1
Gran respuesta. Gracias por compartir. ¿Tendría un enlace a su archivo library-of-babel.org?
Dangom