Last update: 2024-04-26

tangle対象のファイル名にelisp式を使う   Emacs EmacsLisp OrgMode

Org Modetangle を使うとコードブロックの内容をファイルを出力することができますが、 Emacs Lispを記載することで対象のファイルを動的に指定できます。

簡単な例

(defun my-tangle-path (file)
  (file-name-concat "/tmp/hoge/" file))
#+begin_src text :tangle (my-tangle-path "hoge.txt") :mkdirp t
  hello
#+end_src

Propertyから値をとってくる

Lispで変数や関数を定義するのではなく、ヘッダーのpropertyから値をとってこれると便利です。 次のように table-base-dir に指定したディレクトリ以下にファイルを作成するようにしてみましょう。

* heading
:PROPERTIES:
:CREATED:  [2024-04-24 18:11:28]
:MODIFIED: [2024-04-24 18:14:33]
:tangle-base-dir: /tmp
:END:

my-tagle-path の中で property の値をとってくるように変更するだけです。

(defun my-tangle-path (file)
  (let* ((dir (org-entry-get (point) "tangle-base-dir"))
         (path (file-name-concat dir file)))
         path))