Cấu hình, ví dụ và trường hợp sử dụng của Library Of Babel


9

Tôi muốn hiểu cách thức hoạt động của Library Of Babel của org-babel. Có vẻ như một công cụ mạnh mẽ nhưng chưa được sử dụng.

Các tài liệu nói rằng tôi có thể

thêm mã vào thư viện, bằng cách trước tiên lưu mã trong các khối mã 'src' thông thường của tệp Org, sau đó tải tệp Org bằng org-babel-lob-ingest, được liên kết với Cc Cv i.

Điều đó org-babel-lob-ingestthực sự đang làm gì? Nó chỉ là nối thêm tất cả các khối nguồn trong một tệp Org vào một tệp khác?

Và các trường hợp sử dụng này là gì? Tôi có thể thấy những gì tôi có trong Thư viện của mình một cách tương tác không? Tôi có thể sử dụng cú pháp noweb với các khối nguồn trong Thư viện không? Tôi cần làm gì để bắt đầu sử dụng nó?

Bất kỳ ví dụ và liên kết đến hướng dẫn đều rất được hoan nghênh.


Nó đang nối thêm danh sách các khối nguồn được đặt tên mà nó tìm thấy trong tệp vào biến org-babel-library-of-babel. Khi tìm kiếm các khối nguồn, org-babel tìm trong tệp hiện tại cũng như danh sách được lưu trữ trong biến trên. Câu trả lời của @mutbuerger mô tả rất chi tiết tôi nghĩ.
NickD

Câu trả lời:


10

Có một lời giới thiệu hay về thư viện của babel library-of-babel.org, nằm trong thư mục nguồn của Org. Để sử dụng các ví dụ về các khối mã nguồn được đặt tên trong các tệp khác, hãy nhập org-babel-library-of-babelbiến với

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

#+results:
: 21

Một trong số 21 khối được đặt tên là trans trans trans và có thể làm những gì nó phải làm:

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

Bạn cũng có thể thêm các khối mã của riêng mình, đặc biệt là thứ bạn có thể thấy mình sử dụng rất nhiều trong tương lai. Ví dụ, phần sau đây cho phép tôi tổng hợp các giá trị trong bảng được đặt tên theo cột đầu tiên:

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

Lưu khối trong bất kỳ tệp nào và thêm nó vào 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 |

3

TL; DR: Sử dụng thư viện babel liên tục được lưu trữ trong một tệp có thể là một thiết lập 3 bước đơn giản:

  • Tạo một orgtập tin -mode ~/.emacs.d/library-of-babel.org.
  • Thêm một dòng (org-babel-lob-ingest "~/.emacs.d/library-of-babel.org")vào conf Emacs của bạn.
  • Thu thập các chức năng hữu ích trong tập tin đó, chúng sẽ được đọc trong quá trình khởi động emacs.

Tệp Thư viện-Babel là nơi ví dụ: aggregatebycol1khối từ @mutbuerger sẽ được lưu vào.

Một trường hợp sử dụng ví dụ đơn giản khác sẽ có một khối mã, tạo dữ liệu bảng với một hàng tiêu đề, nhưng không đánh dấu tiêu đề bằng một 'hline. Điều này không bi thảm đối với màn hình đơn giản, nhưng có thể khiến việc xử lý tự động hơn nữa được tham gia nhiều hơn. Giải pháp ở đây có thể là sử dụng một khối mã nhỏ để xử lý hậu kỳ từ một nơi nào đó trên internet:

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

Điều này chỉ đơn giản là dẫn qua dữ liệu trong khi nối 'hlinethành một hàng thứ hai.

Để sử dụng khối này sau trong các tệp org khác, chỉ cần thêm một :postđoạn xử lý vào khối nguồn org tạo dữ liệu của bạn:

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

Bạn cũng có thể dễ dàng cung cấp các bảng có sẵn cho các hàm trong LOB của mình:

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

#+CALL: addhdr(ExData)

Trong thư viện của tôi, tôi có các chương để tổ chức các loại chức năng khác nhau: Tạo dữ liệu, Lọc, PrettyPrinting, ... Chỉ cần nhớ ingestlại sau khi thêm các khối mới.


1
Câu trả lời chính xác. Cám ơn vì đã chia sẻ. Bạn có muốn có một liên kết đến tập tin library-of-babel.org của bạn không?
dangom
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.