Configuração, exemplos e casos de uso da Library Of Babel

9

Quero entender como a Library Of Babel da org-babel funciona. Parece uma ferramenta poderosa, porém subutilizada.

A documentação diz que eu posso

adicione código à biblioteca, primeiro salvando o código em blocos de código 'src' regulares de um arquivo Org e, em seguida, carregue o arquivo Org com org-babel-lob-ingest, que está vinculado a Cc Cv i.

O que isso org-babel-lob-ingestrealmente está fazendo? Ele está apenas acrescentando todos os blocos de origem em um arquivo organizacional a outro arquivo?

E quais são os casos de uso disso? Posso ver o que tenho na minha biblioteca interativamente? Posso usar a sintaxe noweb com blocos de origem na Biblioteca? O que preciso fazer para começar a usá-lo?

Quaisquer exemplos e links para tutoriais são muito bem-vindos.

dangom
fonte
Ele está anexando à variável a lista de blocos de origem nomeados encontrados no arquivo org-babel-library-of-babel. Ao procurar por blocos de origem, o org-babel procura no arquivo atual, bem como na lista armazenada na variável acima. A resposta de @mutbuerger descreve os detalhes muito bem, eu acho.
NickD

Respostas:

10

Há uma boa introdução à biblioteca de babel, na library-of-babel.orgqual está localizada no diretório de origem da organização. Para usar esses exemplos de blocos de código-fonte nomeados em outros arquivos, preencha a org-babel-library-of-babelvariável com

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

#+results:
: 21

Um dos 21 blocos é nomeado "transpose" e provavelmente faz o que deveria fazer:

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

Você também pode adicionar seus próprios blocos de código, especialmente algo que poderá usar muito no futuro. Como exemplo, o seguinte permite agregar valores na tabela nomeada pela primeira coluna:

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

Salve o bloco em qualquer arquivo e adicione-o 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
fonte
3

TL; DR: o uso de uma biblioteca persistente de babel armazenada em um arquivo pode ser uma configuração simples em três etapas:

  • Crie um orgarquivo -mode ~/.emacs.d/library-of-babel.org.
  • Adicione uma linha (org-babel-lob-ingest "~/.emacs.d/library-of-babel.org")ao seu Emacs conf.
  • Colete funções úteis nesse arquivo, elas serão lidas durante a inicialização do emacs.

O arquivo Library-Of-Babel é onde, por exemplo, o aggregatebycol1bloco de @mutbuerger seria salvo.

Outro exemplo simples de caso de uso seria ter um bloco de código, que gera dados da tabela com uma linha de cabeçalho, mas não marca a lista de espera com um 'hline. Isso não é trágico para a exibição simples, mas pode envolver ainda mais o processamento automatizado. A solução aqui pode estar usando um pequeno bloco de código para pós-processamento de algum lugar da Internet:

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

Isso simplesmente percorrerá os dados enquanto emenda em uma 'hlinesegunda linha.

Para usar esse bloco posteriormente em outros arquivos organizacionais, basta adicionar uma :postsub-rotina de processamento ao seu bloco de origem organizacional gerador de dados:

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

Você também pode atribuir facilmente tabelas preexistentes a funções no seu LOB:

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

#+CALL: addhdr(ExData)

Na minha biblioteca, tenho capítulos para organizar diferentes tipos de funcionalidade: geração de dados, filtragem, impressão bonita, ... Lembre-se ingestnovamente após adicionar novos blocos.

Alex Stragies
fonte
11
Ótima resposta. Obrigado por compartilhar. Você teria um link para o seu arquivo library-of-babel.org?
dangom 30/01