Konfigurasi, contoh dan kasus penggunaan Library Of Babel

9

Saya ingin memahami bagaimana Library Of Babel org-babel bekerja. Sepertinya alat yang kuat namun kurang dimanfaatkan.

Dokumentasi mengatakan bahwa saya bisa

tambahkan kode ke pustaka, dengan terlebih dahulu menyimpan kode dalam blok kode 'src' reguler dari file Org, dan kemudian memuat file Org dengan org-babel-lob-ingest, yang terikat dengan Cc Cv i.

Apa yang org-babel-lob-ingestsebenarnya dilakukan? Itu hanya menambahkan semua blok sumber dalam File Org ke file lain?

Dan apa kasus penggunaan ini? Dapatkah saya melihat apa yang saya miliki di Perpustakaan saya secara interaktif? Bisakah saya menggunakan sintaks noweb dengan blok sumber di dalam Perpustakaan? Apa yang harus saya lakukan untuk mulai menggunakannya?

Setiap contoh dan tautan ke tutorial sangat disambut.

dangom
sumber
Itu menambahkan daftar blok sumber bernama itu ditemukan dalam file ke variabel org-babel-library-of-babel. Saat mencari blok sumber, org-babel mencari di file saat ini serta daftar yang disimpan dalam variabel di atas. Jawaban oleh @mutbuerger menjelaskan detail dengan sangat baik menurut saya.
NickD

Jawaban:

10

Ada pengantar yang bagus untuk perpustakaan babel library-of-babel.orgyang terletak di direktori sumber Org. Untuk menggunakan contoh-contoh dari blok kode sumber yang dinamai dalam file lain, isi org-babel-library-of-babelvariabel dengan

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

#+results:
: 21

Salah satu dari 21 blok tersebut dinamai "transpose" dan mungkin melakukan apa yang seharusnya dilakukan:

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

Anda juga dapat menambahkan blok kode Anda sendiri, terutama sesuatu yang mungkin Anda temukan banyak di masa depan. Sebagai contoh, berikut ini memungkinkan saya untuk mengumpulkan nilai dalam tabel bernama dengan kolom pertama:

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

Simpan blokir dalam file apa pun dan tambahkan ke 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
sumber
4

TL; DR: Menggunakan pustaka persisten dari babel yang disimpan dalam satu file dapat menjadi setup 3 langkah sederhana:

  • Buat orgfile -mode ~/.emacs.d/library-of-babel.org.
  • Tambahkan baris (org-babel-lob-ingest "~/.emacs.d/library-of-babel.org")ke conf Emacs Anda.
  • Kumpulkan fungsi yang berguna dalam file itu, mereka akan dibaca saat emacs startup.

File Library-Of-Babel adalah tempat misal aggregatebycol1blok dari @mutbuerger akan disimpan.

Contoh kasus penggunaan sederhana lainnya adalah memiliki blok kode, yang menghasilkan data tabel dengan baris header, tetapi tidak menandai headerrow dengan 'hline. Ini tidak tragis untuk tampilan sederhana, tetapi dapat membuat pemrosesan otomatis lebih lanjut lebih terlibat. Solusi di sini bisa menggunakan blok kode kecil untuk pasca-pemrosesan dari suatu tempat di internet:

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

Ini hanya akan pipa melalui data sambil menyambungkan 'hlinesebagai baris kedua.

Untuk menggunakan blok ini nanti di file org lain, cukup tambahkan :postbait-pengolah untuk blok sumber org yang menghasilkan data:

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

Anda juga dapat dengan mudah memberikan tabel yang sudah ada ke fungsi di LOB Anda:

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

#+CALL: addhdr(ExData)

Di perpustakaan saya, saya memiliki beberapa bab untuk mengatur berbagai jenis fungsi: Pembuatan Data, Penyaringan, PrettyPrinting, ... Ingatlah ingestkembali setelah menambahkan blok baru.

Alex Stragies
sumber
1
Jawaban yang bagus Terima kasih telah berbagi. Apakah Anda memiliki tautan ke file library-of-babel.org Anda?
dangom