如何引用 org-mode 的 header-args 中已定义属性的值?

问题描述 投票:0回答:1

今天想尝试一下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:
值的串联。我怎样才能实现这个目标?或者有更惯用的方法吗?

emacs org-mode
1个回答
0
投票

你可以在 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

如果定义了,上面的函数将使用源块名称,如果没有定义,则返回到标题。它假设至少定义了其中之一。

您可以将函数的代码放在标题中,但我更喜欢使标题尽可能简单。

© www.soinside.com 2019 - 2024. All rights reserved.