如何在 header-args 中引用已经定义的 property 的值?

今天想尝试一下 org-mode 的 tangle 功能, 我的需求如下.

我有一个 go.traps.org 文件, 想在其中整理遇到的 Go 问题, 每个代码片段都会从另一个项目中的文件中 tangle 过来, 比如 ~/projects/learn/go/trap/*.go. 但是对每个代码片段都定义下面这样的 header-args 太麻烦:

:tangle ~/projects/learn/go/trap/trap-tangle-file-name.go

所以我想用 property 来解决, 在文件级别定义了如下全局的 property 好让每个代码段都能继承:

:PROPERTIES:
:export-dir: ~/projects/learn/go/trap/
:header-args:go: :tangle ??
:END:

上面的 ??, 即是我遇到的问题. 我想的是 ?? 的值, 应该是 export-dir 和当前 heading 或者代码段的 :NAME: 值的结合, 如何做到这一点呢?


#+begin_src emacs-lisp :tangle no
  (defun my/get-tangle-name ()
    "Get tangle path for src block at point.
  Use EXPORT-DIR property + code snippet NAME or TANGLE-FILE-NAME property."
    (file-name-concat
     (org-entry-get nil "EXPORT-DIR")
     (if-let ((name (org-element-property :name (org-element-at-point))))
         (concat name ".el")
       (org-entry-get nil "TANGLE-FILE-NAME"))))
#+end_src

#+RESULTS:
: my/get-tangle-name

* Parent
:PROPERTIES:
:export-dir: /tmp/
:tangle-file-name: foo2.el
:header-args: :tangle (my/get-tangle-name)
:END:

# This goes to foo2.el
#+begin_src emacs-lisp
1
#+end_src

# This goes to sample-title.el
#+name: sample-title
#+begin_src emacs-lisp
2
#+end_src
1 个赞

非常感谢, 直接把实现给了出来! 学到了很多有用的 org-* 函数.