Library Of Babelの構成、例、使用例


9

org-babelのLibrary Of Babelがどのように機能するかを理解したいと思います。強力で未使用のツールのようです。

ドキュメントには私ができると書かれています

最初にOrgファイルの通常の「src」コードブロックにコードを保存し、次にCc Cv iにバインドされているorg-babel-lob-ingestを使用してOrgファイルをロードすることにより、ライブラリにコードを追加します。

それはorg-babel-lob-ingest本当に何をしているのですか?Orgファイル内のすべてのソースブロックを別のファイルに追加するだけですか?

そして、これのユースケースは何ですか?ライブラリにあるものをインタラクティブに確認できますか?ライブラリ内のソースブロックでnoweb構文を使用できますか?使い始めるには何が必要ですか?

例やチュートリアルへのリンクは大歓迎です。


ファイル内で見つかった名前付きソースブロックのリストを変数に追加していますorg-babel-library-of-babel。ソースブロックを探すとき、org-babelは現在のファイルと上記の変数に保存されているリストを探します。@mutbuergerの答えは詳細を非常によく説明していると思います。
NickD

回答:


10

library-of-babel.orgOrgのソースディレクトリにあるbabelのライブラリへの素晴らしい紹介があります。他のファイルで名前付きソースコードブロックの例を使用するには、org-babel-library-of-babel変数に

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

#+results:
: 21

21個のブロックの1つは「転置」と呼ばれ、おそらくそれが行うことになっていることを実行します。

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

独自のコードブロックを追加することもできます。特に、将来多く使用するコードブロックを追加する可能性があります。例として、次の例では、名前付きテーブルの値を最初の列で集計できます。

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

ブロックを任意のファイルに保存し、次の場所に追加します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:1つのファイルに保存されているbabelの永続的なライブラリを使用すると、簡単な3ステップのセットアップになります。

  • org-modeファイルを作成します~/.emacs.d/library-of-babel.org
  • (org-babel-lob-ingest "~/.emacs.d/library-of-babel.org")Emacs confに行を追加します。
  • そのファイルに有用な関数を収集します。それらはemacsの起動時に読み込まれます。

Library-Of-Babel-fileは、たとえばaggregatebycol1@mutbuergerからのブロックが保存される場所です。

もう1つの簡単な使用例は、ヘッダー行を持つテーブルデータを生成するが、ヘッダー行をでマークしないコードブロックを持つことです'hline。これは単純な表示では悲劇的なことではありませんが、さらに自動化された処理が複雑になる可能性があります。ここでの解決策は、インターネット上のどこかからの後処理に小さなコードブロックを使用することです。

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

これは'hline、2番目の行としてスプライスしている間にデータをパイプするだけです。

このブロックを後で他の組織ファイルで使用:postするには、データ処理組織ソースブロックに-processingスタンザを追加するだけです。

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

LOB内の関数に既存のテーブルを簡単に与えることもできます。

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

#+CALL: addhdr(ExData)

私のライブラリには、データ生成、フィルタリング、PrettyPrintingなど、さまざまなタイプの機能を整理するための章がありingestます。新しいブロックを追加した後、もう一度覚えておいてください。


1
すばらしい答えです。共有いただきありがとうございます。library-of-babel.orgファイルへのリンクがありますか?
dangom
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.