Hao
1
今天想尝试一下 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 个赞
Hao
3
非常感谢, 直接把实现给了出来! 学到了很多有用的 org-*
函数.