今天想尝试一下org-mode的tangle功能,我的需求如下
我有一个
go.traps.org
文件,我想整理一下我在那里遇到的Go问题。每个代码块都会与另一个项目中的文件纠缠在一起,比如~/projects/learn/go/trap/*.go
。但是为each代码片段定义以下header-args太麻烦了:
:tangle ~/projects/learn/go/trap/trap-tangle-file-name.go
所以我想用属性来解决这个问题。在文件级别,我定义了以下全局属性:
:PROPERTIES:
:export-dir: ~/projects/learn/go/trap/
:header-args:go: :tangle ??
:END:
的?以上是我试图解决的问题。我的目标是 ?? 的价值应该是
:export-dir:
和当前标题的标题或代码块的 :NAME:
值的串联。我怎样才能实现这个目标?或者有更惯用的方法吗?
你可以在 header-arg 中包含任意 lisp 代码:
:tangle (... code ...)
在评估或缠结块之前将评估形式。
因此,您可以编写一个执行您想要的操作的函数,然后在标头参数中调用它:
:tangle (my/tangle-directory)
类似这样的:
:PROPERTIES:
:export-dir: ~/projects/learn/go/trap/
:header-args:go: :tangle (my/tangle-directory)
:END:
* foohead
#+name: foosrc
#+begin_src go
some golang program
#+end_src
* Code
#+begin_src elisp :results drawer
(defun my/tangle-directory ()
(let ((name (nth 4 (org-babel-get-src-block-info t)))
(title (nth 4 (org-heading-components))))
(concat (org-entry-get nil "export-dir" t)
(or name title))))
#+end_src
#+RESULTS:
:results:
my/tangle-directory
:end:
在将
Code
源代码块与 C-c C-c
纠缠之前,使用 my/tangle-directory
评估 go
部分中的 lisp 源代码块来定义函数 C-c C-v C-t
。
如果定义了,上面的函数将使用源块名称,如果没有定义,则返回到标题。它假设至少定义了其中之一。
您可以将函数的代码放在标题中,但我更喜欢使标题尽可能简单。